From: Bdale Garbee Date: Wed, 25 Feb 2009 04:50:59 +0000 (-0700) Subject: Imported Upstream version 1.20 X-Git-Url: https://git.cworth.org/git?p=tar;a=commitdiff_plain;h=138fc7e67e3d9845cd7d81aad0e9c7724784f9b9 Imported Upstream version 1.20 --- 138fc7e67e3d9845cd7d81aad0e9c7724784f9b9 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..5a58416 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,15 @@ +Authors of GNU tar. + +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 Salz. + +The FSF version, named GNU tar, was derived from public domain tar by +Jay Fenlason and Joy Kendall. Amy Gorin and Melissa Weisshaus +contributed to the manual. GNU tar has been maintained in turn by +Thomas Bushnell BSG, François Pinard, Paul Eggert, and Sergey +Poznyakoff. + +Many others have contributed to GNU tar; please see the files THANKS +and ChangeLog. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..4432540 --- /dev/null +++ b/COPYING @@ -0,0 +1,676 @@ + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..f2723fb --- /dev/null +++ b/ChangeLog @@ -0,0 +1,8613 @@ +2008-02-20 Sergey Poznyakoff + + * src/common.h (dumpdir_t,dumpdir_iter_t): New data types. + (dumpdir_create0,dumpdir_create,dumpdir_free,dumpdir_locate) + (dumpdir_first,dumpdir_next): New functions. + * src/incremen.c (dumpdir_create0,dumpdir_create,dumpdir_free) + (dumpdir_first,dumpdir_next): New functions. + (dumpdir_locate): Rewrite using binary search. + (struct directory): Change members char *contents, *icontents to + struct dumpdir *dump, *idump. All references updated. + (note_directory): Last arg is const. + + * src/system.c: Remove setenv.h + +2008-03-31 Sergey Poznyakoff + + * src/create.c (dump_file0): Count links only for actually dumped + files. + +2008-03-27 Sergey Poznyakoff + + * NEWS: Document --no-check-device and --check-device. + * doc/rendition.texi: Change the way FIXME-*refs are handled in + !PROOF. + * doc/intern.texi, doc/tar.texi: Update. + * doc/untabify.el: New file. + * doc/Makefile.am (EXTRA_DIST): Add untabify.el + (untabify, final, check-format, check-refs, check-fixmes) + (check-unrevised, all-check-docs, check-docs): New rules. + + * src/common.h (check_device_option): New global. + * src/incremen.c (procdir): Use boolean and instead of bitwise + one. Patch by Jean-Louis Martineau. + Compare device numbers only if check_device_option is set. + * src/tar.c: New command line options --no-check-device and + --check-device. Proposed by Jean-Louis Martineau. + (parse_opt): Hanlde new options. + (decode_options): Initialize check_device_option to true. + + * THANKS: Update + +2008-03-06 Sergey Poznyakoff + + * bootstrap: Use rsync to get translations. + * doc/tar.texi: Minor change. + * lib/.cvsignore: Update + * po/.cvsignore: Update + * src/system.c: Remove include setenv.h. + * tests/atlocal.in (STAR_DATA_URL): Update. + * tests/star/README: Update URL. + +2008-02-09 Sergey Poznyakoff + + * doc/tar.texi: Fix a typo. Reported by Denis Excoffier. + +2008-02-08 Sergey Poznyakoff + + * NEWS: Update. + * configure.ac: Version 1.19.90 + * po/POTFILES.in: Add missing files. + * src/compare.c (verify_volume): Honor --ignore-zeros. + Proposed by Jan-Benedict Glaw. + * tests/shortfile.at (AT_KEYWORDS): Add shortfile0. + +2008-02-07 Sergey Poznyakoff + + * NEWS: Update. + * src/create.c (dump_file0): Apply transform_name to symlink + targets. + +2008-02-04 Sergey Poznyakoff + + * src/transform.c: Support multiple --transform options. Support + semicolon-separated lists of replace expressions. + * NEWS, tar.texi: Document changes to the --transform option. + +2008-01-30 Paul Eggert + + * doc/tar.texi: Update Back-Cover text to reflect new GNU wording. + +2007-12-17 Paul Eggert + + Exit with nonzero status if a close fails on an archive. + Problem (and initial trivial fix) + * src/buffer.c (close_archive, new_volume): close_error, not + close_warn. + +2007-12-05 Sergey Poznyakoff + + * src/buffer.c (check_compressed_archive): Do not bail out if the + file is too short, set boolean flag, passed as an argument + instead. This fixes a bug introduced on 2007-08-24. See also + tests/shortupd.at. + + * tests/Makefile.am, tests/testsuite.at: Add shortupd.at. + * tests/shortupd.at: New test. + +2007-11-12 Jim Meyering + + Don't read from name[-1]. + * src/incremen.c (make_directory): Handle namelen == 0, since + find_directory_meta calls make_directory (""). + +2007-11-07 Sergey Poznyakoff + + * bootstrap (checkout): Use URL of the gnulib CVS mirror. + * gnulib.modules: Add fseeko and snprintf. + +2007-10-31 Sergey Poznyakoff + + * src/checkpoint.c: New actions: bell and ttyout + * src/system.c (sys_exec_info_script) + (sys_exec_checkpoint_script): pass the current blocking factor in + TAR_BLOCKING_FACTOR environment variable. + * doc/tar.texi: Update + * NEWS: Update + +2007-10-30 Sergey Poznyakoff + + * doc/Makefile.am: Use texi2html and the CVS version of gendocs.sh + to create HTML versions of the manual. + * doc/gendocs_template: Likewise. + * doc/tar.texi: Document --hard-dereference and + --checkpoint-action options. Improve documentation of + --check-links. + +2007-10-29 Sergey Poznyakoff + + * NEWS: Update + * configure.ac: Version 1.19.1 + * po/POTFILES.in: Add src/checkpoint.c + * src/Makefile.am (tar_SOURCES): add checkpoint.c + * src/checkpoint.c: New file - checkpoint handling. + * src/buffer.c (checkpoint, do_checkpoint): Remove. + (_flush_write, simple_flush_read, _gnu_flush_read): Use + checkpoint_run. + * src/common.h (enum checkpoint_style): Remove. + (checkpoint_style): Remove. + (DEFAULT_CHECKPOINT): New define. + (hard_dereference_option): New variable. + (sys_exec_checkpoint_script): New declaration. + * src/create.c (file_count_links): do nothing if + hard_dereference_option is set. + * src/system.c (sys_exec_checkpoint_script): New function. + (sys_exec_info_script): Restore SIGPIPE handler. + * src/tar.c: (parse_opt): New options --hard-dereference, + --checkpoint-action. + (decode_options): Call checkpoint_finish_compile. + + * src/system.c (sys_exec_info_script): Initialize buf. Problem + reported by Bengt-Arne Fjellner. + +2007-10-18 Jim Meyering + + Avoid compiler warnings. + * src/list.c (read_header_primitive): Define two locals, to + avoid incorrect "may be used uninitialized" warnings. + * src/incremen.c (procdir): Remove decl of unused local, "len". + +2007-10-18 Sergey Poznyakoff + + * doc/tar.texi (gzip): Remove compression patent + warning. According to Brett Smith, the patent is + expired. + +2007-10-17 Sergey Poznyakoff + + * src/suffix.c: New file. Compress format detection by archive + suffix (when creating). Suggested by Jean-Pierre Demailly. + * src/Makefile.am: Add suffix.c + * src/buffer.c (magic): Add an entry for new lzma format. Proposed + by Lasse Collin. + * src/common.h (set_comression_program_by_suffix): New prototype. + * src/tar.c: New options --auto-compress (-a) and --lzma + * THANKS: Add Lasse Collin and Jean-Pierre Demailly. + * NEWS: Update + * doc/tar.texi: Update + +2007-10-12 Paul Eggert + + * src/utf8.c (string_ascii_p): Recode to avoid bogus GCC 4.2.1 + warning about "comparison is always true due to limited range of + data type" when char is unsigned. + +2007-10-11 Paul Eggert + + Adjust to recent gnulib changes. + * configure.ac: Dont' check for strerror, since gnulib now does this. + * .cvsignore: Add m4, tar-[0-9]*. + * lib/.cvsignore: Adjust to various gnulib file name changes. + Add .deps, rmt-command.h. + +2007-10-10 Sergey Poznyakoff + + * configure.ac, NEWS: Raise version number to 1.19 + * tests/star/README: Update + +2007-10-05 Sergey Poznyakoff + + * src/create.c (dump_regular_file): Fix file padding in case of + truncation to zero size. + * NEWS: Update + +2007-10-04 Sergey Poznyakoff + + * tests/T-null.at: Use AT_DATA for sample output. + +2007-10-03 Sergey Poznyakoff + + * src/incremen.c (try_purge_directory): Ensure that arguments to T + and R are safe. + +2007-09-29 Sergey Poznyakoff + + * src/incremen.c (obstack_code_rename): Apply safer_name_suffix to + name arguments before storing them in T and R records. Reported by + Nicholas Cole. + +2007-09-27 Sergey Poznyakoff + + * configure.ac: Raise version number to 1.18.90 + * NEWS: Likewise + + * doc/snapshot.texi: Document version 2. + * doc/dumpdir.texi: Update. + + Implement --exclude-tag* and --exclude-cache* options for listed + incremental archives. + New option --exclude-vcs to exclude VCS-specific files and + directories. + + * NEWS: Update + * doc/tar.texi: Document --exclude-vcs option + * src/common.h (exclusion_tag_warning, check_exclusion_tags): New + prototypes. + * src/create.c (exclusion_tag_warning, check_exclusion_tags): + Remove static qualifier. + (check_exclusion_tags): account for dirname without terminating + slash. + (dump_dir0): exclusion_tag_all is handled elsewhere. + * src/incremen.c (struct directory): New member tagfile + (make_directory): Initialize tagfile to NULL + (procdir): New argument: entry + Hanlde exclusion tags. + (makedumpdir): Take into account directory->tagfile. + (scan_directory): Hanlde exclusion tags. + * src/tar.c: New option --exclude-vcs + (exclude_vcs_files): New function + +2007-09-14 Paul Eggert + + * AUTHORS: Remove unnecessary information. Just list the + principal authors. + * THANKS: Remove info duplicated from AUTHORS. + +2007-08-25 Jim Meyering + + Don't include . No longer needed. + * src/incremen.c: Don't include . No longer needed. + * src/buffer.c: Likewise. + * src/system.c: Likewise. + * src/tar.c: Likewise. + + Avoid shadowing and unused-variable warnings. + * src/create.c (check_exclusion_tags): Remove declaration of unused + local, "ret". + * src/compare.c (diff_dumpdir): Rename stat->stat_data to avoid + shadowing the syscall. + * src/buffer.c (do_checkpoint): Don't shadow the write syscall. + (try_new_volume): Avoid shadowing "access". + * src/tar.c (decode_options): Rename index->idx to avoid shadowing. + (find_argp_option): Rename option->o to avoid shadowing. + * src/incremen.c (scan_directory): Rename local, dir_name->dir, + to avoid shadowing the function. + (get_directory_contents): Likewise. + * src/system.c (global_pid): Rename from "pid", to avoid being + shadowed by locals. + * src/extract.c (apply_nonancestor_delayed_set_stat): + Rename st->sb to avoid shadowing another local. + +2007-08-24 Sergey Poznyakoff + + * configure.ac, NEWS: Raise version number to 1.18.1 + + * src/buffer.c (check_compressed_archive): Detect files smaller + than 512 bytes. + * tests/shortfile.at: New test case for the above change. + * tests/testsuite.at, tests/Makefile.am: Add shortfile.at + +2007-08-19 Sergey Poznyakoff + + * bootstrap: Gnulib initialization destroyed paxutils m4 files. + Initialize paxutils structure after that of gnulib. + +2007-08-12 Sergey Poznyakoff + + * src/names.c (contains_dot_dot): Fix double-dot recognition in + case of duplicate /. Patch by Dmitry V. Levin. + + * bootstrap (symlink_to_gnulib): Make sure the target directory + exists and create it if it does not. + + * doc/tar.texi: Fix a typo. + +2007-06-28 Sergey Poznyakoff + + * bootstrap: Update for the change of the TP URL + +2007-06-27 Sergey Poznyakoff + + Relicense under GPLv3 + +2007-06-21 Sergey Poznyakoff + + * tests/testsuite.at (AT_TAR_MKHIER): Skip test if genfile is + unable to create the file + * tests/lustar01.at: Likewise + +2007-06-21 Eric Blake + + Resolve testsuite failures 40-42 on cygwin. + * tests/testsuite.at (AT_TAR_MKHIER): Skip tests when long + file names cannot be created. + +2007-06-16 Sergey Poznyakoff + + * doc/Makefile.am (tar_TEXINFOS): Add tar-snapshot-edit.texi + * doc/tar-snapshot-edit.texi: New file + * doc/tar.texi (Fixing Snapshot Files): New appendix + + * scripts/tar-snapshot-edit: New file + * tests/extrac07.at: Add back write permissions on dir + +2007-06-09 Sergey Poznyakoff + + * tests/exclude.at: Sort the output. + +2007-06-08 Sergey Poznyakoff + + * 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 + + 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 + + * src/xheader.c (decx): Unknown pax keywords produce a warning, + not error. + +2007-05-29 Paul Eggert + + * src/misc.c (set_file_atime): Use gl_futimens, not futimens, + due to gnulib change. + +2007-05-19 Sergey Poznyakoff + + * 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 + + * 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 + + 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 + + * src/common.h (closeopen): Remove decl. + * src/misc.c: Don't include , ; 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 + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + 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 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 + + * 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 + + * 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 + * tests/truncate.at: Use genfile instead of dd, because on some + systems /dev/zero is not available. + +2006-12-04 Paul Eggert + + * 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 + + * doc/tar.texi (Long Options): Remove doubled word. + +2006-11-30 Sergey Poznyakoff + + * 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 + + * 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 and , not + . + +2006-11-13 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * NEWS, configure.ac: Version 1.16 + * Makefile.am (distclean-local): New rule + +2006-10-17 Sergey Poznyakoff + + * src/tar.c: Fix help output formatting. Thanks Benno + Schulenberg. + +2006-10-16 Sergey Poznyakoff + + * Makefile.am (dist-hook): Create a cpio archive. + * NEWS: Update + +2006-10-14 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * README: Fix a typo + +2006-09-08 Paul Eggert + + 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 + + * 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 + + * 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 + . + (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 + + * 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 + + * 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 + + * 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 , 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 + + * bootstrap: Adjust to today's change to gnulib-tool by invoking + it with --assume-autoconf='latest-stable'. + +2006-07-16 Paul Eggert + + 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 + + * THANKS: Add Ralf Wildenhues + * NEWS: Update + +2006-07-09 Ralf Wildenhues + + * doc/dumpdir.texi, doc/snapshot.texi, doc/sparse.texi, + doc/tar.texi: Fix some typos. + +2006-07-06 Sergey Poznyakoff + + tar --index-file=FILE --file=- sent the archive to FILE, and + the listing to stderr. Bug reported by Marcin Gryszkalis + + + * 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 + + * 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 + + * bootstrap (update_po): Fix single translation update + +2006-07-03 Sergey Poznyakoff + + * 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 + + * doc/tar.texi: Update. Add cross-references. + * doc/sparse.texi: Add cross-references. + +2006-06-25 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * doc/tar.texi: Remove leftover include + +2006-06-09 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * src/incremen.c (make_directory): Fix initialization of struct + directory. + +2006-05-25 Sergey Poznyakoff + + * doc/tar.texi: Document use of globbing patterns. + * src/tar.c (parse_opt): Add comment before --preserve case. + +2006-05-24 Sergey Poznyakoff + + * 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 + + * src/buffer.c (change_tape_menu): Fix typo (uninitialized + variable) introduced yesterday. + +2006-05-22 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * 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 + + * src/extract.c (extract_dir): Fix toggling existing directory + permissions (Debian bug #361077). Use parts of patch provided by + Ian Jackson . + * 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 (trivial change) + + * tests/atlocal.in (PATH): Add build-aux from the source tree, + not the build tree. + +2006-03-13 Sergey Poznyakoff + + * THANKS: Add Benno Schulenberg + +2006-03-13 Jim Meyering + + * 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 + + * doc/tar.texi: Minor fixes. + * src/tar.c (options): Consistently begin help messages with a + lowercase letter. + +2006-03-12 Sergey Poznyakoff + + * tests/Makefile.am (AM_CPPFLAGS): Define LOCALEDIR + +2006-03-07 Paul Eggert + + * 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 + + * tests/shortrec.at: Use -f - to read from stdin. + +2006-02-21 Sergey Poznyakoff + + * doc/tar.texi: Fix typo: --to-command instead of --to-program + +2006-02-20 Paul Eggert + + * 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 + + * 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 + + * 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 , . + * src/tar.c: Include . + +2006-02-19 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 . + (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 + + * src/xheader.c (sparse_map_decoder): Fix misleading diagnostic. + +2006-01-31 Sergey Poznyakoff + + * 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 + + * src/tar.c (decode_options): Refuse using --delete with + compression options. + +2006-01-18 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 (trivial changes) + + * configure.ac (DENSITY_LETTER): Fix m4 overquoting. + * .cvsignore: Ignore .bootstrap. + +2005-12-06 Sergey Poznyakoff + + * 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 + + * 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 + + * doc/tar.texi (Option Summary): Rewrite the + --atime-preserve=system description in response to Ian Turner's + proposed patch. + +2005-11-30 Ian Turner + + * doc/tar.texi (Extracting Specific Files): Remove obsolescent + FIXME. + +2005-11-29 Paul Eggert + + * 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 + + 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 + + * 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 + + * src/xheader.c: Remove parts of code prematurely introduced + yesterday. Thanks Eric Blake. + +2005-11-26 Sergey Poznyakoff + + * src/xheader.c (xheader_format_name): Fix memory leak. + +2005-11-11 Sergey Poznyakoff + + * 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 + + 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 + + * 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 + + * 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 + and Paul Eggert + + * 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 + + 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 + + * 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 + + * doc/tar.texi: Properly document incremental dumps + * doc/value.texi: Likewise. + * doc/snapshot.texi: Likewise. + +2005-11-05 Sergey Poznyakoff + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * tests/link01.at: Skip test if ln fails (suppose the OS does + not support hard links). + +2005-10-04 Sergey Poznyakoff + + * src/tar.c (decode_options): Report error if -A or -r is used + together with compression option. + +2005-09-29 Sergey Poznyakoff + + * doc/tar.texi: Use @option and @kbd consistently. + Document new options. + +2005-09-28 Sergey Poznyakoff + + * 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 + * 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 + +2005-09-21 Paul Eggert + + * 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 + + 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 + + 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 + + * 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 + + * 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 + + * README-alpha: Modernize description of software required for + developers. + +2005-09-03 Sergey Poznyakoff + + * gnulib.modules: Add strdup + * src/incremen.c (purge_directory): Do not dereference symbolic + links. Bug reported by Ralph Corderoy and + David Brown + * tests/incr01.at: New test. + * tests/Makefile.am: Add incr01.at + * tests/testsuite.at: Likewise + * THANKS: Updated + +2005-08-17 Sergey Poznyakoff + + * src/incremen.c (read_directory_file): Use strtoumax to read + snapshot file contents. + (write_directory_file_entry): Use umaxtostr(). + +2005-07-31 Sergey Poznyakoff + + * 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 + + * doc/tar.texi: Fix typo. + +2005-07-07 Sergey Poznyakoff + + * tests/pipe.at: Pipe the output from `tar xfv' through sort. + +2005-06-25 Sergey Poznyakoff + + * 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 + + * 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 + + A sweep of the sparse code prompted by a bug report by Jim Meyering. + * src/sparse.c: Include . + (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 + + * src/common.h (timespec_lt): Add a return type: bool. + +2005-06-21 Paul Eggert + + 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 . + (tartime): Use umaxtostr rather than stringify_uintmax_t_backwards. + * src/xheader.c: Include . + Do not include . + (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 + + 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 + + * src/create.c (dump_file0): Check for is_avoided_name() + first. Fixes bug reported by Martin Lohmeier + + * tests/update.at: New file + * tests/Makefile.am (TESTSUITE_AT): Add update.at + * tests/testsuite.at: Likewise + +2005-06-13 Sergey Poznyakoff + + * configure.ac (AC_STRUCT_ST_BLKSIZE) + (AC_STRUCT_ST_BLOCKS): Removed. Handled by system.m4. + +2005-06-02 Paul Eggert + + * src/names.c (excluded_name): excluded_filename -> + excluded_file_name, because the name was changed in gnulib. + +2005-05-30 Sergey Poznyakoff + + * src/tar.c (read_name_from_file,update_argv): Automatically + detect nul-terminated list files. + * NEWS: Updated + +2005-05-27 Sergey Poznyakoff + + * scripts/backup.sh.in: Bugfixes. + +2005-05-26 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * src/misc.c (remove_any_file): Fix typo in previous change. + +2005-05-14 Paul Eggert + + 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 . + (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 + + * 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 + + * 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 + + * tests/Makefile.am: Add shortrec.at. + +2005-04-18 Paul Eggert + + * 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 + + * src/list.c: Handle Solaris 'X' type flag + * src/tar.h (SOLARIS_XHDTYPE): New define + +2005-04-06 Sergey Poznyakoff + + * 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 + + * configure.ac (AC_CONFIG_AUX_DIR): Rename from config to build-aux, + for reasons discussed in the thread beginning at + . + * .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 + + * 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 + + * bootstrap (TP_URL): Change from + to + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * 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 + + * 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 + + * src/sparse.c: Extract sparse files even if the output + fd is not seekable. + +2005-02-01 Sergey Poznyakoff + + * 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 + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * src/tar.c (parse_opt): Bugfix: Use ARGP_KEY_ARG. Thanks + Mike Frysinger for reporting. + +2005-01-04 Paul Eggert + + * lib/Makefile.tmpl (localedir.h): Omit needless quotes and a + needless sed command. Problem reported by Paul Jarc. + +2004-12-23 Paul Eggert + + 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 + + * src/tar.c (main): Reverted recent changes (#ifdef). + +2004-12-21 Sergey Poznyakoff + + * 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 + + 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 + + * 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 + + * 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 + + * TODO: Mention sub-second resolution, lutimes, lchmod. + +2004-11-27 Paul Eggert + + 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 + + * 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 + + * src/tar.c (decode_options): Fixed -o semantics. Thanks + Jean Delvare + +2004-10-25 Sergey Poznyakoff + + * 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 + + * THANKS: Added Bryan Ford + * doc/Makefile.am (.text): Fixed rule + * po/POTFILES.in: Added argp-help.c + +2004-10-04 Bryan Ford + + * 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 + + * doc/tar.texi: Minor fix + * src/tar.c (options): Minor fix + +2004-09-12 Sergey Poznyakoff + + * 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 + + 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 + + * 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 + + 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 + + * tests/listed02.sh: Do not depend on any particular ordering + of output. + +2004-09-02 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 ). + 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 + (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 + (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 . + + * NEWS: Updated + * THANKS: Updated + +2004-08-30 Sergey Poznyakoff + + * src/tar.c: Fix copy-n-paste errors in the license + +2004-08-19 Sergey Poznyakoff + + * 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 + + * src/tar.c (find_argp_option): Fixed typo + +2004-08-12 Paul Eggert + + 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 + + * 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 + + * 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 + + * 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 + + 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 . + (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 + + * 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 + + * 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 + + * 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 + + * doc/tar.texi: The actual default for exclude patterns + is --no-anchored. Fixed. + * src/tar.c (options): Likewise. + Thanks "Felix Natter" for noticing. + +2004-06-22 Sergey Poznyakoff + + * doc/tar.texi: Fixed several inconsistencies. + * src/tar.c: Fixed docstring for --checkpoint option. + +2004-05-19 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + * src/tar.c (decode_options): Fixed typo in the comment. + * tests/star/README: Minor correction + +2004-05-11 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * doc/tar.texi: Further update. + +2004-05-08 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * TODO: Updated + * doc/tar.texi: Updated + * src/tar.c: --utc implies -vv + +2004-04-28 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + 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 + + * NEWS: Updated + * configure.ac: Raised version number to 1.13.94 + * src/system.h: Protect inclusion of + 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 + 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 and 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 + (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 + + * 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 + + * 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 + + * 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 + + * src/rtapelib.c (rmt_lseek__,rmt_ioctl__): Bugfix. The + conversion buffer was not null terminated. Fix provided + by Leland Lucius + * THANKS: Added Leland Lucius + * src/utf8.c (utf8_convert): Indentation fix. + +2004-02-29 Sergey Poznyakoff + + * 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 + + * 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 + + * doc/tar.texi (dircategory Individual utilities): Append period, + as suggested by Karl Berry. + +2004-02-24 Sergey Poznyakoff + + * src/list.c (decode_header): Call xheader_decode before + the assignment to current_stat_info.archive_file_size. + +2004-02-23 Paul Eggert + + * configure.ac: Invoke AM_ICONV, to define ICONV_CONST if needed. + +2004-02-23 Sergey Poznyakoff + + 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 + + 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 + + * src/create.c (dump_file0): The conditional at line + 1296 prevented incremental backups on individual files + from working, as reported by Andreas Schuldei + . + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + Fix Debian bug 230872, originally reported by Jeff King in + . + + * 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 + + * 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 + + * bootstrap: Bugfix by Marco Gerards : + Use $option instead of $1 so all options will be parsed. + +2004-01-04 Sergey Poznyakoff + + 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 + + * src/sparse.c (sparse_diff_file): Bugfix. Thanks + Martin Simmons for the patch. + * src/create.c (dump_dir0): Bugfix. Thanks Piotr Czerwinski + for the patch. + +2003-12-26 Paul Eggert + + 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 + to + 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 + + Synchronized with the backup repository on Mirddin + +2003-12-19 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * configure.ac: Check for setlocale. Thanks Bruno Haible for + reporting. + +2003-11-25 Sergey Poznyakoff + + * src/create.c (write_gnu_long_link): Use oldgnu + magic with @LongLink blocks. + +2003-11-17 Sergey Poznyakoff + + * src/tar.h: Support for star sparse format. + * src/sparse.c: Likewise. + +2003-11-17 Sergey Poznyakoff + + * 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 + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + 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 + + * src/list.c (decode_header): Initialize st_atime and + st_ctime. + +2003-11-11 Sergey Poznyakoff + + * configure.ac (tar_save_LIBS): Bugfix. Thanks Adrian + Bunk for reporting. + * doc/tar.texi: Fixed spelling. Thanks Martin Buchholz + for spotting. + +2003-11-04 Paul Eggert + + * src/xheader.c (xhdr_tab): Make it extern, not static, as C89 and + C99 require this. + +2003-10-26 Paul Eggert + + * src/system.c (sys_spawn_shell): Cast trailing null to (char *). + Bug reported by Christian Weisgerber. + +2003-10-19 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + 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 + + * src/tar.c: Removed extra precaution regarding + subcommand_option == CAT_SUBCOMMAND + * lib/Makefile.am: Updated + +2003-10-02 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + * 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 + + * bootstrap: Don't use "for option; do"; + Solaris 8 /bin/sh doesn't like that. + +2003-09-17 Sergey Poznyakoff + + * README-alpha: Updated + * bootstrap: Updated + +2003-09-17 Sergey Poznyakoff + + * 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 + + * 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 + + * .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 + + * 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 + + * src/create.c: Support for "linkpath" extended keyword. + * src/xheader.c (decode_record): Reversed the return + condition. + +2003-09-03 Sergey Poznyakoff + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * .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 + + 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 and unconditionally, + now that gnulib handles this. + Include and unconditionally, now that we assume + C89 or better. + Assume that offsetof is defined in stddef.h. + Do not include . + (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 to define. + Include . + (valloc): Define if not defined, and if valloc is not declared. + (xstrdup): Remove decl. + + * src/tar.c: Do not include . + Include . + (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 . + (DEFAULT_PATTERN): Renamed from DEFAULT. + (ZEROS_PATTERN): Renamed from ZEROS. + (main): Use gettext to translate (C), not print_copyright. + +2003-07-04 Paul Eggert + + 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 . + (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 + + * 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 + + * 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 + + * src/buffer.c (child_open_for_compress): Don't try to read + past the end of the buffer. + +2001-10-11 Jim Meyering + + * argmatch.c (argmatch_invalid): Use quotearg_n_style (0, ... + and quote_n (1, ... to avoid clobbering a buffer. + +2001-09-26 Paul Eggert + + * 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 + + * doc/tar.texi (Remote Tape Server): is know -> is known + +2001-09-25 Paul Eggert + + * lib/unicodeio.c (EILSEQ): Include first, since + 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 + + * src/extract.c (maybe_recoverable): + Treat OVERWRITE_OLD_DIRS like DEFAULT_OLD_FILES. + +2001-09-22 Paul Eggert + + * 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 . + (pattern_strings): Remove. + (pattern_args, pattern_types): New constants. + (main): Use XARGMATCH, not argmatch. + +2001-09-20 Jim Meyering + + * 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 + + * fnmatch.m4 (jm_FUNC_FNMATCH): Fix typo in previous patch: yes -> no. + +2001-09-14 Paul Eggert + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * lib/xgetcwd.c: Fix typo in local var; from Jim Meyering. + +2001-09-01 Jim Meyering + + * 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 + + * 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 + + * lib/utime.c: Include full-write.h. + * lib/xstrtol.c (strtoimax): New decl. + +2001-08-29 Paul Eggert + + * 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." + + * 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 + + * 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 ' 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 + + * 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 + + * 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. + (): Include only if HAVE_SYS_TYPES_H. + (, , , , ): + Include if available. + (): Include + (SIZE_MAX): Define if or 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 ; 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 . + (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 + + * lib/addext.c (): 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 + + * lib/alloca.c (alloca): Arg is of type size_t, not unsigned. + +2001-05-10 Paul Eggert + + * lib/addext.c (ISSLASH, base_name): Remove decls; now in dirname.h. + Include and 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 , , 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 , ; no longer needed. + (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h. + Include , . + (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 instead of . + (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 + + * 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 + + * src/compare.c (read_and_process): Use off_t for size. + From Maciej W. Rozycki. + +2001-01-26 Paul Eggert + + * lib/quotearg.c: Include stddef.h. From Jim Meyering. + +2001-01-12 Paul Eggert + + * 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 (): 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 (): 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 (): 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 . + (ISSLASH): New macro. + (find_backup_file_name): Use dirlen to calculate directory lengths. + (max_backup_version): Strip redundant trailing slashes. + + * src/common.h: Include . + (get_directory_contents): No longer has size arg. + (gnu_restore): Arg is size_t, not int. + + * src/system.h: Include . + (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 . + (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. + (, ): Include only if test program. + (main): Use "return 0", not "exit (0)". + +2000-12-08 Paul Eggert + + * lib/dirname.h: New file. + +2000-11-02 Vesselin Atanasov + + * 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 + + * lib/fnmatch.c (FOLD): Do not assume that characters are unsigned. + +2000-10-29 Paul Eggert + + * NEWS, configure.in (AC_INIT_AUTOMAKE): Version 1.13.18. + + * src/tar.c: Include , for FNM_LEADING_DIR. + +2000-10-28 Paul Eggert + + * 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 + + * 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 + + * 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 + + * src/extract.c: Include , 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 . + (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 and directory include files like ; + no longer used. Include instead. + (closedir, signed_char): remove macro; no longer used. + (bool, false, true): Include 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 + + * m4/fnmatch.m4: Mention the GNU C library. + +2000-10-19 Paul Eggert + + * m4/fnmatch.m4: Add a couple more test cases to catch bugs in + glibc 2.1.95. + +2000-10-17 Paul Eggert + + * lib/human.c (): Do not include; human.h does it if needed. + (CHAR_BIT): Remove. + + * lib/human.h (): Include if HAVE_LIMITS_H. + (CHAR_BIT): Define if not defined. + +2000-09-09 Paul Eggert + + * lib/quotearg.c: From fileutils: rename ISASCII to IN_CTYPE_DOMAIN. + +2000-08-07 Paul Eggert + + * lib/xmalloc.c: Memory exhausted -> memory exhausted + + * lib/xalloc.h (xalloc_msg_memory_exhausted): + change to array from char *. + +2000-08-06 Paul Eggert + + * 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 + + * 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 + + * 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 + + * lib/quotearg.c: + Include 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 + + * lib/quotearg.c: + When the system forces us to redefine mbstate_t, shadow its mbsinit + function. From Bruno Haible. + +2000-07-14 Paul Eggert + + * lib/xmalloc.c: Simplify exhausted message. + + * lib/quotearg.h: Update copyright date; from Jim Meyering. + +2000-07-13 Paul Eggert + + * 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 + + * lib/quotearg.c: + : 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 + + * 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 . + + * 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 + + * 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 + + * lib/quotearg.c (mbstate_t): + Do not define; it should be defined with AC_CHECK_TYPE. + +2000-06-26 Paul Eggert + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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. + (): Include if HAVE_WCTYPE_H. + (iswprint): Define to 1 if we lack it + +2000-04-18 Paul Eggert + + * m4/mbstate_t.m4: New file. + +2000-04-17 Bruno Haible + + * tests/ignfail.sh: Test for uid 0 along with user "root". + +2000-04-05 Paul Eggert + + * m4/largefile.m4 (AC_SYS_LARGEFILE_FLAGS): + Don't use -n32 on IRIX if the installer said + otherwise. + +2000-02-28 Paul Eggert + + * lib/quotearg.c (ALERT_CHAR): New macro. + (quotearg_buffer_restyled): Use it. + +2000-02-23 Rainer Orth + + * src/list.c (tartime): Fix off-by-one error when copying year if + OLD_CTIME. + +2000-02-18 Paul Eggert + + * 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 . + (tSNUMBER, tUNUMBER): Now of type . + (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 + + * 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 + + * m4/c-bs-a.m4: + Change quoting to be compatible with future autoconf versions. + +2000-01-11 Paul Eggert + + * lib/exclude.c (FILESYSTEM_PREFIX_LEN, ISSLASH): Remove unused macros. + +2000-01-07 Paul Eggert + + * 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 + + * 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" + + * tests/incremen.sh: Invoke stat on newly created file so that its + ctime is updated on Nextstep. + +1999-12-21 Machael Stone + + * lib/getdate.y (get_date): + Fix typo when checking for time_t overflow in time zone calculations. + +1999-12-13 Paul Eggert + + * 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 (): New include. + (append_file): + Don't assume that gettext preserves errno. + Quote arbitrary strings in diagnostics. + Check for close error. + + * src/names.c (): 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 (): 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 (): 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 (): 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 (): 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 (): 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. + (): 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 + + * 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 + + * src/compare.c (, 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 + + * 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 + + * 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 + + * 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 + + * m4/largefile.m4: Update serial. + +1999-11-18 Paul Eggert + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * NEWS, configure.in (AM_INIT_AUTOMAKE): Version 1.13.12. + + * src/tar.c (): 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 (): 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 (): 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 (): 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 (): 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 + + * lib/lchown.h (ENOSYS): Don't use ENOMSG; it's not in NeXTStep3.3. + Use EINVAL instead. + +1999-08-29 Paul Eggert + + * lib/getdate.y (get_date): + Rename outermost local `probe' to `quarter'. + Rename latter local `tm' to probe_tm. + From: Jim Meyering + Message-ID: + +1999-08-28 Paul Eggert + + * 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 + + * 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. + (): Include only if testing. + (ISUPPER): Remove. + (ISLOWER): New macro. + (): 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 + + * 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 (): 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 + + * configure.in (HAVE_GETHOSTENT, HAVE_SETSOCKOPT): + Don't depend on ac_cv_func variables. + From Albert Chin-A-Young . + +1999-08-18 Paul Eggert + + * 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 + + * 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 + + * 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 + + * src/list.c (read_header): Don't parse OLDGNU_FORMAT + incremental headers as POSIX prefixes. + +1999-08-11 Paul Eggert + + * 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. + (): 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 (): 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. + (): 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 + + * 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 + + * 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 + + * configure.in (AM_INIT_AUTOMAKE), NEWS: Version 1.13.2. + + * m4/xstrtoumax.m4 (jm_AC_PREREQ_XSTRTOUMAX): Check whether + 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 + + * 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 + + * 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 + + * 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 + + * 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 ; 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * doc/tar.texi: Remove -y. + +1999-04-09 Paul Eggert + + * 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 + + * 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 . + (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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 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 + + * src/tar.c: Update copyright. + + * NEWS: 1.12.64004 + +1999-02-01 Paul Eggert + + * 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 + + * 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 + + * 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 + + * incremen.sh: Fix timing bug in regression test. + +1999-01-22 Paul Eggert + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * NEWS, README, configure.in: Unofficial version 1.12.lfs.1. + This is an unofficial version. + +1997-12-17 Paul Eggert + + * 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 + + * src/system.h (ST_NBLOCKS): Fix typo in definition. + +1997-11-19 Paul Eggert + + * configure.in (HAVE_INTTYPES_H): + Don't ignore cache variable if it's already set. + +1997-11-10 Paul Eggert + + * 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 + + * 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. + (, ): 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 3, 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: change-log +version-control: never +End: 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 + + * Release 1.12. + + * configure.in: Check for the inline keyword. + +1997-04-24 François Pinard + + * Makefile.am (BABYL): Delete admin/RMAIL, renamed rmail/announce. + + * PORTS: New file. + (EXTRA_DIST): Adjusted. + +1997-04-23 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * configure.in: Ensure all cpp directives are left justified. + Reported by Kaveh R. Ghazi. + +1997-04-12 François Pinard + + * 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 + + * configure.in: Much simplify the -lsocket and -lnsl tests. + Reported by Larry Schwimmer. + +1997-04-11 François Pinard + + * 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 + + * 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 + + * configure.in (ALL_LINGUAS): Add it. + +1997-03-20 François Pinard + + * configure.in: Require Autoconf 2.12. + +1997-02-25 François Pinard + + * 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 + + * configure.in: Delete README-alpha code, Automake handles it now. + +1996-11-18 François Pinard + + * 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 + + * 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 + + * Prerelease 1.11.13. + + * configure.in: Replace a missing dirname. + +1996-10-07 François Pinard + + * configure.in: Clean out some macro calls made useless since + AM_INIT_AUTOMAKE implies them. + +1996-09-20 François Pinard + + * configure.in: Do not check anymore for regex. + +1996-09-19 François Pinard + + * Prerelease 1.11.12 + + * configure.in: Check echo for newline suppression. + +1996-09-18 François Pinard + + * configure.in: Do not add open3.o to LIBOBJS anymore. + +1996-09-05 François Pinard + + * configure.in (ALL_LINGUAS): Add pl. + +1996-09-04 François Pinard + + * 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 + + * Prerelease 1.11.11. + + * configure.in: Use AC_PREREQ(2.10). + +1996-07-16 François Pinard + + * configure.in (ALL_LINGUAS): Add nl. + Reported by Erick Branderhorst. + +1996-07-12 François Pinard + + * Prerelease 1.11.10. + + * configure.in (ALL_LINGUAS): Add ko and sl. + +1996-05-01 François Pinard + + * configure.in: Check for fsync, and linux/fd.h. + Reported by Marty Leisner. + +1996-04-17 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * Makefile.am (AUTOMAKE_OPTIONS): Select gnits and dist-shar. + (dist-zoo): New goal, experimental for now. + +1996-01-07 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 and for BSDi. + Reported by Chris Arthur and Skip Montanaro. + +1995-12-17 François Pinard + + * configure.in: Be more systematic at caching test results. + Reported by Ulrich Drepper. + + * configure.in: While checking for remote tape header files, only + include if it was found to exist. + + * configure.in: Prefer #if to #ifdef while checking for open3. + +1995-11-30 François Pinard + + * 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 + + * 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 + + * 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 + + * configure.in: Adapt for GNU gettext 0.8. + +1995-07-10 François Pinard + + * Makefile.in (default): Define to all. + +1995-06-18 François Pinard + + * configure.in: For mknod, also include prior to + , 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 + + * 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 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 + + * 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 + + * Makefile.in (pot): New goal, triggering po/tar.pot. + +1995-06-07 François Pinard + + * 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 + + * Makefile.in (check): New goal. + +1995-05-30 François Pinard + + * Makefile.in (DISTFILES): Do not distribute SUPPORT, now + integrated in the documentation. + Reported by Karl Berry. + +1995-05-28 François Pinard + + * configure.in: Check for isascii, not iascii. + Reported by Alan Modra, Bruno Haible and Greg McGary. + +1995-05-16 François Pinard + + * Prerelease 1.11.7. + + * Makefile.in (DISTFILES): Distribute NLS. + * configure.in, acconfig.h: Many adjustments for GNU gettext. + +1995-05-09 François Pinard + + * configure.in: Clean glocale out. + * Makefile.in (SUBDIRS): Add po. + * Makefile.in (pofile): New goal. + +1995-05-08 François Pinard + + * 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 + + * configure.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS. + * acconfig.h: Add description for WITH_CATALOGS. + +1995-02-22 François Pinard + + * configure.in, Makefile.in: Replace `date' by `echo timestamp'. + +1995-02-19 François Pinard + + * Makefile.in: Support ID files. Do not distribute TAGS. + +1995-02-05 François Pinard + + * Makefile.in (maintainer-clean): New name for realclean. + +1995-01-02 François Pinard + + * configure.in: Check for . + Reported by Joseph E. Sacco. + +1995-01-01 François Pinard + + * Makefile.in (DISTFILES): Distribute SUPPORT, with *pre*-releases. + +1994-12-18 François Pinard + + * configure.in: Check for isascii. + Reported by Bruno Haible. + +1994-12-11 François Pinard + + * configure.in: Use fp_WITH_REGEX. + * acconfig.h: Document WITH_REGEX. + +1994-12-10 François Pinard + + * src/de.tt: New file, for German. + Reported by Ulrich Drepper. + +1994-12-03 François Pinard + + * 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 + + * configure.in: Check for and . + +1994-11-02 François Pinard + + * 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 + + * {,*/}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 + + * configure.in: Correct shell assignment for ac_cv_path_RSH. + Reported by Kaveh R. Ghazi. + +1994-09-14 François Pinard + + * 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 + + * 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 + + * configure.in: Delete AC_OS_XENIX, now within AC_HEADER_DIRENT. + +1994-09-01 François Pinard + + * 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 + + * Makefile.in: Distribute it. + + * Makefile.in (distclean-local): Delete config.log. + +1994-08-27 François Pinard + + * acconfig.h: Document HAVE_UNION_WAIT, no more in Autoconf. + +1994-08-24 François Pinard + + * 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 + + * configure.in: Do not define RTAPELIB nor HAVE_RTAPELIB. + +1994-08-22 François Pinard + + 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 + + * 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 + + * configure.in: Correct a checking message. + Reported by Bruno Haible. + +1994-08-17 François Pinard + + * 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 when testing . + 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 + + * 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 , HAVE_SYS_GENTAPE_H + is tested in rmt.c. Check for , 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 + + * Prerelease 1.11.4. + +1994-08-14 François Pinard + + * configure.in: Decide MTIO_CHECK_FIELD by grepping . + * 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 + + * configure.in: Check for . + +1994-08-11 François Pinard + + * configure.in: For , 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 + + * configure.in: Updated for Autoconf 2.0. + +1994-08-08 François Pinard + + * 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 + + * 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 + + * Prerelease 1.11.3. + + * Makefile.in (dist, shar): Distribute the scripts directory. + +1994-08-01 François Pinard + + * configure.in: Check for . + +1994-07-30 François Pinard + + * 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 + + * 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 . 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 + + * configure.in: Check for . Do not define BSD42, do + not look anymore if /vmunix, /sdmach or /../../mach exist. + * acconfig.h: Remove BSD42. + +1994-07-24 François Pinard + + * 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 + + * configure.in: Use provided fnmatch only as a replacement. + + * configure.in: Check for , needed for + defining _IOW and _IOR on the Tektronix XD88. + Reported by Kaveh R. Ghazi. + +1994-07-20 François Pinard + + * Makefile.in (BACKLOG): New goal, for summarizing the + maintainance backlog. Distribute file BACKLOG. + +1994-07-08 François Pinard + + * 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 + + * configure.in: Check for . + +1994-07-05 François Pinard + + * 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 + + * 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 + + * configure.in: Use AC_TIME_WITH_SYS_TIME, test for . + This should solve the problem of multiple inclusions of . + Also, also check for , for getdate.y tests this. + Reported by Jim Meyering, John Rouillard, Karl Berry and Rick + Emerson. + +1994-06-30 François Pinard + + * 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 + + * 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 + + * Prerelease 1.11o. + + * Makefile.am (tar.info): Comment about needed makeinfo version. + Reported by Sherwood Botsford. + +1997-04-10 François Pinard + + * Makefile.am (EXTRA_DIST): Add tar-mew.texi. + +1997-03-16 François Pinard + + * 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 + + * 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 + + * 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 + + * Prerelease 1.11.12. + + * Makefile.am (EXTRA_DIST): Remove texinfo.tex, now that Automake + handles it automatically. + +1996-07-18 François Pinard + + * Prerelease 1.11.11. + + * Makefile.am (tar.info): Remove -I$(srcdir), which was useless. + +1996-07-17 François Pinard + + * Makefile.am (EXTRA_DIST): Include texinfo.tex, until Automake + does it automatically. + +1996-07-16 François Pinard + + * Prerelease 1.11.10. + + * Makefile.am (EXTRA_DIST): Distribute convtexi.pl, for now. + +1996-04-22 François Pinard + + * Makefile.am: Implement rendering levels (QUALITY, DRAFT or DEBUG). + +1996-04-17 François Pinard + + * Makefile.am (EXTRA_DIST): New name for DIST_OTHER. + +1996-03-03 François Pinard + + * Makefile.am (tar.dvi): Comment about needed makeinfo version. + Reported by Jonathan Thornburg. + +1996-02-12 François Pinard + + * Makefile.am: Replace TEXINFO by info_TEXINFOS for Automake 0.29. + +1996-01-14 François Pinard + + * Makefile.am (AUTOMAKE_OPTIONS): Select gnits. + +1996-01-08 François Pinard + + * Makefile.am: New file. + * tar.texi: New name for tar.texinfo. + +1995-12-30 François Pinard + + * Makefile.in (check): New goal, doing nothing. + Reported by Cesar Romani, Joachim Seelig, Mark Bynum and Ulrich + Drepper. + +1995-11-29 François Pinard + + * Makefile.in (clean): Remove tmp-* files. + +1995-11-27 François Pinard + + * 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 + + * Makefile.in (DISTFILES): Distribute ChangeLog. + * ChangeLog: New file, extracted from top-level ChangeLog. + +1995-06-22 François Pinard + + * Makefile.in: Get rid of docwarn.texi, now replaced by + the @UNREVISED macro, right into tar.texinfo. + +1995-06-18 François Pinard + + * Makefile.in (tar.dvi): First macro-expand tar.texinfo. + +1995-06-07 François Pinard + + * Makefile.in: Use subdir and distdir. + +1995-06-03 François Pinard + + * tar.texinfo: Use header.texi. + * Makefile.in: Prepare header.texi from src/tar.h. + Distribute it. + +1995-05-28 François Pinard + + * Makefile.in (DISTFILES): Add tar.info-3. + Reported by Bruno Haible. + +1995-02-22 François Pinard + + * Makefile.in: Replace `date' by `echo timestamp'. + +1995-02-13 François Pinard + + * Makefile.in: Use top_srcdir. + +1995-02-05 François Pinard + + * Makefile.in (maintainer-clean): New name for realclean. + +1994-12-03 François Pinard + + * Makefile.in (DISTFILES): Include docwarn.texi. + +1994-11-07 François Pinard + + * Makefile.in (stamp-vti): Use new -r option to date. + +1994-11-05 François Pinard + + * Makefile.in (realclean): Also remove stamp-vti. + +1994-09-14 François Pinard + + * Makefile.in: Cleanup... + (texclean): Deleted, merged into mostlyclean. + (Makefile): Have ./config.status create this Makefile only. + +1994-08-30 François Pinard + + * Makefile.in (tar.info): Make the documentation in the source + directory only. + +1994-08-21 François Pinard + + * Makefile.in: Correct for when a different build directory. + + * docwarn.texi: New file. + * Makefile.in: Distribute it. + +1994-08-17 François Pinard + + * Makefile.in: New file. + * tar.texinfo: New file. + * texinfo.tex: New, from elsewhere. + + +----- lib/ChangeLog ----- + +1997-04-25 François Pinard + + * Release 1.12. + +1997-04-16 François Pinard + + * 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 + + * Makefile.am (getdate.c): Announce 13 conflicts, not 10. + Reported by Bruno Haible, Bryant Fujimoto and Wolfram Wagner. + +1997-04-11 François Pinard + + * Prerelease 1.11o. + + * getdate.h: New file. + * Makefile.am: Adjusted. + +1997-04-10 François Pinard + + * modechange.c, modechange.h: New files. + * Makefile.am: Adjusted. + +1997-02-25 François Pinard + + * Makefile.am: Adapt library name to Automake 1.1l. + +1996-11-09 François Pinard + + * Prerelease 1.11.14. + + * basename.c: New file. + +1996-11-09 François Pinard + + * 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 + + * 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 + + * safe-stat.h: Deleted. + * Makefile.am (noinst_HEADERS): Adjusted. + Reported by Jim Meyering. + +1996-09-20 François Pinard + + * regex.c, regex.h, rx.c, rx.h: Deleted. + * Makefile.am: Adjusted. + +1996-09-19 François Pinard + + * Prerelease 1.11.12. + + * execlp.c: Include stdio.h, not only stdio! + +1996-09-16 François Pinard + + * 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 + + * Makefile.am (EXTRA_DIST): $(BUILT_SOURCES) is no longer + necessary, as Automake now handles it automatically. + +1996-07-16 François Pinard + + * 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 + + * Prerelease 1.11.10. + + * Makefile.am (EXTRA_DIST): New name for DIST_OTHER. + +1996-02-28 François Pinard + + * msleep.c: New file, from elsewhere. + * Makefile.am: Adjusted. + +1996-02-12 François Pinard + + * Makefile.am: Remove CONFIG_HEADER, not required by Automake 0.29. + +1996-01-14 François Pinard + + * Makefile.am (AUTOMAKE_OPTIONS): Select gnits. + +1996-01-07 François Pinard + + * Makefile.am: Add parts of previous Makefile.in as FIXME comments. + +1996-01-01 François Pinard + + * error.h: New file, from elsewhere. + * Makefile.am: Add error.h to HEADERS. + Reported by Jim Meyering. + +1995-12-30 François Pinard + + * 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 + + * Prerelease 1.11.9. + + * Makefile.am: New file. + +1995-11-22 François Pinard + + * Makefile.in (DISTFILES): Distribute ChangeLog. + * ChangeLog: New, extracted from the top-level ChangeLog. + +1995-06-18 François Pinard + + * 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 + + * Makefile.in (DISTFILES): Remove COPYING.LIB. + * COPYING.LIB: Deleted. + +1995-06-15 François Pinard + + * Makefile.in (dist): Do not hide copying rule. + +1995-06-07 François Pinard + + * 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 + + * insremque.h, insremque.c: New files, from GNU gettext. + * Makefile.in: Take care of insremque.[hc]. + +1995-03-19 François Pinard + + * Makefile.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS. + +1995-02-19 François Pinard + + * Makefile.in: Support ID files. Do not distribute TAGS. + +1995-02-05 François Pinard + + * Makefile.in (maintainer-clean): New name for realclean. + +1994-12-18 François Pinard + + * 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 + + * rx.c, rx.h: New, from elsewhere. + * Makefile.in: Adjust accordingly. + +1994-12-03 François Pinard + + * Makefile.in: Localize, adapting from how it is done in sharutils. + +1994-09-14 François Pinard + + * 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 + + Little cleanup in installation: + * Makefile.in (install, check): Depend on all. + +1994-08-21 François Pinard + + * 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 + + * ftruncate.c: Revised, because there is no ftruncate + capability whatsoever in Interactive Unix. + Reported by Peder Chr. Norgaard. + +1994-08-08 François Pinard + * memset.c, mkdir.c, rename.c, strstr.c and + ftruncate.c: New, from elsewhere. + * Makefile.in: Distribute them. + +1994-08-05 François Pinard + + * 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 + + * xstrdup.c: New, from elsewhere. + * Makefile.in: Adjusted. + +1994-07-29 François Pinard + + * error.c: Add error_print_progname virtual routine. + +1994-07-24 François Pinard + + * 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 + + * Makefile.in (LIBOBJS): Get configured list of replacements. + * fnmatch.h: Undefine FNM_PATHNAME and FNM_PERIOD, for HP-UX + defines them in . + + * 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 + + * xmalloc.c: New file, from elsewhere. + * error.c: New, from elsewhere. + * Makefile.in: Adjusted. + +1994-06-30 François Pinard + + * Makefile.in: New file. + + +----- po/ChangeLog ----- + +1997-04-25 François Pinard + + * Release 1.12. + +1997-04-18 François Pinard + + * Prerelease 1.11p. + + * fr.po: Updated file. + +1997-04-11 François Pinard + + * Prerelease 1.11o. + +1997-03-26 François Pinard + + * it.po: New file. + +1997-02-14 François Pinard + + * pl.po: Updated file. + +1996-11-22 François Pinard + + * POTFILES.in: Add src/common.h. + Reported by Christian Kirsch. + +1996-11-18 François Pinard + + * Prerelease 1.11.14. + + * POTFILES.in: Adjust for changes in src/. + +1996-09-05 François Pinard + + * Prerelease 1.11.12. + + * pl.po: New file. + +1995-06-17 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * intl/Makefile.in, Makefile.in: Many adjustments for GNU gettext. + +1995-05-09 François Pinard + + * 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 + + * intl/*: New, from nlsutils. + +1995-01-09 François Pinard + + * src/de.tt: New file, for Swedish. + Reported by Jan Djarv. + +1994-12-10 François Pinard + + * de.tt: New file, for German. + Reported by Ulrich Drepper. + + +----- scripts/ChangeLog ----- + +1997-04-24 François Pinard + + * Release 1.12. + + * level-1, level-0: Replace --block-size by --blocking. + +1996-04-17 François Pinard + + * Prerelease 1.11.10. + + * Makefile.am (EXTRA_DIST): New name for DIST_OTHER. + +1996-01-14 François Pinard + + * Makefile.am (AUTOMAKE_OPTIONS): Select gnits. + +1996-01-08 François Pinard + + * Makefile.am: New file. + +1995-12-31 François Pinard + + * Makefile.in (check, dvi): New goals, doing nothing. + Reported by Cesar Romani and Ulrich Drepper. + +1995-06-21 François Pinard + + * Prerelease 1.11.9. + + * Makefile.in: Distribute the ChangeLog, now recovered! + Reported by Andreas Schwab. + +1995-06-17 François Pinard + + * Release 1.11.8. + + * WARNING: New file. + * Makefile.in (DISTFILES): Distribute it. + +1995-06-15 François Pinard + + * sripts/Makefile.in (dist): Do not hide copying rule. + +1995-06-07 François Pinard + + * Makefile.in: Use subdir and distdir. + +1995-02-05 François Pinard + + * Prerelease 1.11.7. + + * Makefile.in (maintainer-clean): New name for realclean. + +1994-12-03 François Pinard + + * 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 + + * Makefile.in: Cleanup... + (check): Deleted. + (Makefile): Have ./config.status create this Makefile only. + +1994-06-30 François Pinard + + * Prerelease 1.11.5. + + * ChangeLog: Initialized by moving entries related to + scripts out of this ChangeLog. + +1993-11-24 Noah Friedman + + * 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 + + * level-0, level-1 (LOGFILE): Put logfile in `log' subdirectory. + +1993-03-28 Noah Friedman + + * dump-remind (volno): Don't increment by one. + +1993-03-25 Noah Friedman + + * level-0, level-1 (TAR_PART1): Use `--block-size', not just + `--block', which is now ambiguous. + +1993-03-24 Noah Friedman + + * 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 + + * 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 + + * backup-specs (VOLNO_FILE): Removed abusive comment by Noah. + +1993-03-18 Noah Friedman + + * 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 + + * 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 + + * level-0, level-1: remove $LOGFILE.tmp files before exiting. + +1992-09-24 Michael I Bushnell + + * level-0, level-1 (TAR_PART1): remove --atime-preserve + because of a total screw. + +1992-09-10 Noah Friedman + + * level-0, level-1 (TAR_PART1): put --atime-preserve inside quotes. + +1992-09-09 Michael I Bushnell + + * level-0, level-1 (TAR_PART1): Use --atime-preserve. + +1992-07-10 Michael I Bushnell + + * level-0, level-1: Avoid silly Sun awk lossage. + +1992-04-30 Noah Friedman + + * 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 + + * level-0: Repair damage from previous mod: stdin to rsh must + be the terminal or tar's questions lose. + +1991-08-31 Noah Friedman + + * 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 + + * Fix a misplaced quote in level-0 and change some >& into + 2>&1. + + +----- src/ChangeLog ----- + +1997-04-25 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * tar.c (usage): Update comment about --mode. + +1997-04-19 François Pinard + + * buffer.c: Include 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 + + * 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 + + * 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 + + * 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 + + * delete.c (move_archive): Declare it void. + Reported by Bruno Haible and Kaveh R. Ghazi. + +1997-04-11 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * compare.c (verify_volume) [FDFLUSH]: Use fsync even in that case. + Reported by Marty Leisner. + +1996-11-25 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * rmt.c (private_strerror): Add const's to sys_errlist declaration. + Reported by Fabio d'Alessi. + +1996-11-06 François Pinard + + * 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 + + * 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 + + * 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 + + * tar.c: Write --no-recursion instead of --no-recurse. + Reported by Noah Friedman. + +1996-09-20 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * Makefile.am: Use genfile in check_PROGRAMS, not noinst_PROGRAMS. + (check-local): Do not depend on genfile. + +1996-08-24 François Pinard + + * Makefile.am (EXTRA_DIST): Do not mention ansi2knr.1 nor + ansi2knr.c, as Automake now handle them automatically. + +1996-07-18 François Pinard + + * 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 + + * 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 + + * rmt.c (strerror): It is a macro on some systems. + Reported by Santiago Vila Doncel. + +1996-07-15 François Pinard + + * Prerelease 1.11.10. + + * checktar.sh: Use a more regular WARNING in message. + +1996-07-09 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 if it exists. + (verify_volume): fsync, than ioctl(, FDFLUSH) first. + Reported by Marty Leisner. + +1996-04-29 François Pinard + + * 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 + + * 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 + + * 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 + + 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 + + * 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 + + * create.c (dump_file): Cast %ld argument to (long). + Reported by Constantin Belous and Jörgen Hägg. + +1996-03-21 François Pinard + + * tar.c (main): Return int, not void. + Reported by Timothy J. Lee and Peter Seebach. + +1996-02-28 François Pinard + + * Makefile.am: Use RMT instead of PROGRAMS and noinst_HEADERS + instead of HEADERS. + +1996-02-12 François Pinard + + * Makefile.am: Remove CONFIG_HEADER, not required by Automake 0.29. + +1996-02-03 François Pinard + + 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 + + * rtapelib.c (rmt_open__) [MSDOS]: Do not call setuid/setgid. + Reported by Yasushi Suzudo. + +1996-01-14 François Pinard + + * Makefile.am (AUTOMAKE_OPTIONS): Select gnits and ansi2knr. + +1996-01-08 François Pinard + + * create.c: Initialize linklist to NULL. + Reported by Bradley A. Smith. + +1996-01-07 François Pinard + + * Makefile.am: Add parts of previous Makefile.in as FIXME comments. + +1996-01-03 François Pinard + + * 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 + + * 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 + + * system.h: Include "error.h" instead of declaring error (). + Reported by Jim Meyering. + +1995-12-31 François Pinard + + * Makefile.am: New file. + +1995-12-30 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 and 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 + + * 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 + + * 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 + + * system.h: Conditionally include prior to . + * rmt.c: Do not include 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 + + * 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 + + * tar.c (name_scan, name_match): Avoid labels and gotos. + +1995-11-22 François Pinard + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * Makefile.in (Makefile): Remove some useless lines. + +1995-06-27 François Pinard + + * 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 + + * 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 + + * 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 + + * *.[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 + + * *.[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 + + * 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 + + * 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 + + * 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 + + * checktar.sh: Send a message saying that it is still useless. + +1995-06-11 François Pinard + + * 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 and define + setlocale to void independently of ENABLE_NLS. + Reported by Ulrich Drepper. + +1995-06-10 François Pinard + + * 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 + + * Makefile.in: Use subdir and distdir. + + * system.h [NLS]: Simplify by merely including . + Also, define setlocale to empty only if the setlocale function is + not known, instead of when 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 + + * 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 + + * 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 + + * tar.h: Adjust so extracted doc/header.texi is neater. + +1995-05-30 François Pinard + + * 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 + + * 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 + + * 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 + + * Makefile.in: Clean glocale out. + +1995-05-08 François Pinard + + * Makefile.in: Use libintl.a while linking. + * system.h: Include unconditionally, instead only + if WITH_CATALOG. Let define _() appropriately. + * tar.c (main): Call textdomain. + +1995-05-02 François Pinard + + * 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 + + * port.c (link): Use WARN to report the message. + Reported by Sherwood Botsford. + +1995-03-19 François Pinard + + * Makefile.in: Remove GLOCALE, add LINGUAS, use fp_WITH_CATALOGS. + * system.h: Use WITH_CATALOGS to define _() differently. + +1995-03-14 François Pinard + + * 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 + + * Makefile.in: Replace `date' by `echo timestamp'. + +1995-02-19 François Pinard + + * Makefile.in: Support ID files. Do not distribute TAGS. + +1995-02-13 François Pinard + + * Makefile.in: Use top_srcdir. + +1995-02-11 François Pinard + + * 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 + + * Makefile.in (maintainer-clean): New name for realclean. + +1995-01-04 François Pinard + + * 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 `/...//fs' on OSF's Distributing Computing + Environment (DCE) and Distributed File System (DFS). + Reported by Travis L. Priest. + +1995-01-03 François Pinard + + * 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 + + * 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 , + , , and . + * buffer.c, diffarch.c, rmt.c, rtapelib.c, + update.c: Simplify accordingly. + + * system.h: If it exists, include prior to + , 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 + + * rmt.h: Ensure strrchr is defined to rindex in some cases. + Reported by Karl Vogel. + +1994-12-18 François Pinard + + * tar.h: Include 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 + + * buffer.c, tar.c [WITH_REGEX]: Check it. + +1994-12-03 François Pinard + + * Prerelease 1.11.6. + + * rmt.c: Adjust for localization, by including and + , 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 + + * 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 + + * 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 and declare _ as gettext. + * tar.c: Possibly include 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 + + * 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 + + * tar.h [__STDC__]: Use #if instead of #ifdef. + +1994-10-27 François Pinard + + * 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 + + * rmt.c, rtapelib.c, tar.h: Get rid of CONFIG_BROKETS. + +1994-10-04 François Pinard + + * 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 + + * diffarch.c: Normalize capitalization in diagnostics. + +1994-09-26 François Pinard + + * 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 + + * rtapelib.c: Include "rmt.h" only once 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + Little cleanup in installation: + * Makefile.in: Remove rule for ../lib/libtar.a. + +1994-08-21 François Pinard + + * 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 + + 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 + + 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 + + * rmt.c, buffer.c: Use a more uniform way of including + 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 + + * 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 + + * rtapelib.c: Use MTIO_CHECK_FIELD instead of mt_type. + Reported by Ben A. Mesander. + +1994-08-13 François Pinard + + * tar.h: Include 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 + + * 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 + + * 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 anymore for HP-UX from + HP-UX 8 and after, for which definitions are in , + 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 + + 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 + + * 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 if FNM_LEADING_DIR is not + defined, instead of checking for FNM_PATHNAME, because some + 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 + + * 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 if not _POSIX_SOURCE, then 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 , 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 + + * tar.c: Do not include 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 with BSD42 or + for V7, merely include if it exists, + otherwise . + * buffer.c, diffarch.c, extract.c, list.c, + port.c, update.c: Do not include or + , 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 + + * 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 + + * 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 before , 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 + + * 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 + + * tar.h: Merge "port.h" towards the beginning of tar.h. + Include and , and define errno if needed. + * *.c: Do not include "port.h" anymore after "tar.h", do not + include , nor . 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 , 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 + + * create.c, extract.c [HAVE_UTIME_H]: Instead of _POSIX_VERSION, + for choosing to include . + Reported by Carl Swanson and Thomas Krebs. + +1994-07-05 François Pinard + + * 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 + + 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 from + , 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 . + * getoldopt.c, tar.c: Remove including "option.h". + +1994-07-02 François Pinard + + * *: 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 + + * 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 + + * 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 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 + + * 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 + + * Makefile.in (config.status): Run config.status --recheck, not + configure, to get the right args passed. + +1993-07-19 David J. MacKenzie + + * Makefile.in (libdir): Use standard GNU value -- + $(exec_prefix)/lib, not /etc. + +1993-07-08 David J. MacKenzie + + * Makefile.in (installdirs, configure, config.status, + Makefile): New targets. + +1993-06-14 Noah Friedman + + * Makefile.in (.c.o): Put -I. before -I$(srcdir), and make + $(CFLAGS) last. + +1993-05-22 The King + + * 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 + + * configure.in: Better way of detecting HP-UX. + Reported by Noah Friedman. + +1993-03-25 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * tar.c: Change FNM_TARPATH to FNM_LEADING_DIR to match change + in fnmatch.[ch]. + +1992-10-02 David J. MacKenzie + + * 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 + + * buffer.c (close_archive): Removed leftover `break' from when + this was a switch. + +1992-09-22 Noah Friedman + + * create.c, port.h: indented #pragma directives with 1 space. + +1992-09-18 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * 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 , + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * port.h: If compiling with gcc, use __builtin_alloca. + +1992-09-08 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * gnu.c (collect_and_sort_names): write_dir_file has no argument. + +1992-07-06 David J. MacKenzie + + * 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 + + * 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 + + * rmt.c: Add #ifdefs to work on ISC. + +1992-05-20 David J. MacKenzie + + * port.h: Define major, minor, makedev if the system doesn't. + +1992-05-13 Michael I Bushnell + + * gnu.c (add_dir_name): Store legitimate value into + dir_contents when get_dir_contents returns NULL. + +1992-05-07 Michael I Bushnell + + * 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 + + * tar.h: Make comments for option names say -- instead of +. + +1992-04-29 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * rtapelib.c: SIGTYPE -> RETSIGTYPE. + +1992-03-09 David J. MacKenzie + + * rtapelib.c: Reformat and make comments more complete. + Rename a few variables for clarity. + +1992-03-05 David J. MacKenzie + + * tar.c (describe): Document long options as starting with --. + +1992-01-23 David J. MacKenzie + + * tar.c (options): Check get_date return value for error indication. + +1991-12-24 David J. MacKenzie + + * 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 + + * testpad.c (main): flush stderr so perror and fprintf + cooperate right. + +1991-12-18 David J. MacKenzie + + * 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 + + * mangle.c (extract_mangle): Correctly null terminate name of + link target. + +1991-11-21 Michael I Bushnell + + * 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 + + * tar.h: Use new criteria for STDC version of msg. + +1991-11-02 David J. MacKenzie + + * 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 + + * tar.c (long_options). Fixed info-script long option. + Reported by Eric Norum. + +1991-08-26 David J. MacKenzie + + * 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 + + * create.c: Indent '#pragma alloca' so non-ANSI compilers + don't choke on it. + +1991-08-14 David J. MacKenzie + + * 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 + + * 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 + + * configure [FTIME_MISSING]: Instead of NEED_TZSET. + +1991-07-29 David J. MacKenzie + + * port.c [F_CHSIZE]: Additional version. + +1991-07-27 David J. MacKenzie + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * buffer.c (fl_read): Missing \n in printf. + +1991-07-08 David J. MacKenzie + + * 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 + + * 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 + + * 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 + + * Release of version 1.10; appropriate changes to README. + + * create.c: Removed printf's about sparse files. + +1991-06-21 Michael I Bushnell + + * list.c (skip_extended_headers): Userec was being called in + the wrong place. + +1991-06-20 David J. MacKenzie + + * 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 + + * rtape_lib.c (__rmt_write) [SIGNAL_VOID]: Instead of USG. + +1991-06-05 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * tar.c (long_options): +get and +concatentate don't require arguments + +1991-05-20 Michael I Bushnell + + * 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 + + * 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 + + * port.c (get_date): Renamed from getdate, to avoid SVR4 conflict. + * tar.c: Call get_date instead of getdate. + +1991-05-10 Noah Friedman + + * tar.c: added "\n\" to the end of some documentation strings + where they were left off. + +1991-05-09 Michael I Bushnell + + * 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 + + * 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 + + (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 + + * 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 + + * 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 + + * Makefile: added default flags and options for compiling under + hpux. + + * Added files alloca.c and xmalloc.c. + +1991-03-23 Michael I Bushnell + + * port.c [HPUX]: Define WANT_VALLOC. + +1991-03-15 David J. MacKenzie + + * 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 + + * 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 + + * port.c: Remove a spurious `+' between functions (a remnant + of a context diff, apparently). + +1991-01-09 Michael I Bushnell + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + Remove excess \n from lots of msg() calls. + +1990-11-19 Jay Fenlason + + * tar.c: Rename +volume to +label. + +1990-11-16 David J. MacKenzie + + * tar.c (describe): Include the default values for -b and -f + (as set in the Makefile) in the message. + +1990-11-15 Jay Fenlason + + * 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 + + * port.c (un-quote-string): Don't try to write a null if there's + already one there. + +1990-11-01 Jay Fenlason + + * 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 + + * 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 + + 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 + + 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 + + * gnu.c: Fix A couple of typos. + +1990-09-19 David J. MacKenzie + + * getdate.y [USG && !DAYLIGHT_MISSING] (ftime): Use `daylight'. + +1990-09-17 Jay Fenlason + + * 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 + + * tar.c (add_exclude): Don't bus-error if the exclude file doesn't + end with a newline. + +1990-09-09 David J. MacKenzie + + * Makefile (dist): Remove .fname when done. + +1990-09-06 Jay Fenlason + + * 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 + + * 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 + + * 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 + + * 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 + + * buffer.c (open_archive): If -O, write verbosity to stderr + instead of stdout. + +1990-08-10 Jay Fenlason + + * getdate.y: Handle an explicit DST in the input string. + Reported by Per Foreby. + +1990-07-16 Jay Fenlason + + * tar.c: rename -g -G +incremental, +listed-imcremental, etc. + +1990-07-13 Jay Fenlason + + * 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 + + * 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 + + * tar.c (options): Don't change `c' if it is 0, as getopt now + handles that internally. + +1990-07-02 Jay Fenlason + + * 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 + + * 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 + + * 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 + + * 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 + + * port.c [sparc]: Use instead of SPARC since the lowercase version + is defined, and the uppercase one isn't. + +1990-05-22 Jay Fenlason + + * port.c (ck_malloc): if size==0 pretend size=1 + (ck_realloc): if(!ptr) call ck_malloc instead. + +1990-05-15 Jay Fenlason + + * 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 + + * 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 + + * 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 + + * tar.c: Recognize the +sparse option. It was documented, but + only the short form (-S) was actually recognized. + +1990-04-17 Jay Fenlason + + * create.c: Don't access location 0 if ->dir_contents is null. + +1990-04-11 Jay Fenlason + + * 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 + + * tar.c (long_options): Make it so +append +extract +list +update + +catenate and +delete don't take arguments. + +1990-03-12 Jay Fenlason + + * buffer.c (open_archive, fl_write): Set the mtime of the volume + header to the current time. + +1990-03-07 Jay Fenlason + + * 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 + + * Makefile: Mention the -NO_REMOTE option. + * port.c [i386]: Fix typo, and define WANT_FTRUNCATE. + +1990-02-26 Jim Kingdon + + * getdate.y: Declare yylex and yyerror as static. + #define yyparse to getdate_yyparse. + +1990-02-25 David J. MacKenzie + + * 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 + + * port.c [sparc]: Define LOSING_MSG, since doprnt_msg doesn't work. + [WANT_GETWD]: Fix typo. + +1990-01-26 Jay Fenlason + + 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * port.c [BSD42]: Define DOPRNT_MSG. + tar.h [BSD42]: Do not prototype msg{,_perror}. + +1989-12-08 Jay Fenlason + + * create.c (dump_file): Remove typo in msg. + +1989-12-01 David J. MacKenzie + + * 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 + + * port.c: Move declaration of alloca into #else /* sparc */ + so it will compile on sparcs. + +1989-11-27 David J. MacKenzie + + * tar.c (options): Remove -version option (replaced by +version). + (describe): Mention long options. + +1989-11-25 David J. MacKenzie + + * 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 + + * buffer.c (fl_read): Fix typos in error message + "tar EOF not on block boundary". + +1989-10-23 + + * tar.c (long_options[]): Add an option for blocked compression. + +1989-10-19 + + * buffer.c (writeerror): Print a more useful error msg. + +1989-09-27 + + * tar.c (main): Mention "tar -help" if the luser types a non-workable + set of options. + +1989-09-11 + + * tar.c (options): Have -F correctly set info_script. + +1989-08-29 + + * Makefile Include ChangeLog in tar.tar and tar.tar.Z + +1989-08-28 + + * 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 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 + + * 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 +(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 . + (close_archive): SysV doesn't have ftruncate, so substituted + fmtwrite (just copied the code for MS-DOS). + * create.c: Unos lacks 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 . + Define 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 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 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 + + * 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 + + * 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 + + * 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 + + * 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 + + * Prerelease 1.11p. + + * genfile.c (usage): Add a program description. + (main): Output --version according to recent GNU standards. + +1997-04-15 François Pinard + + * ignfail.sh: Ensure the test does not fail if run as super-user. + Reported by John David Anglin. + +1997-04-12 François Pinard + + * genfile.c (pattern): Remove trailing comma for last enum item. + Reported by Bruno Haible. + +1997-04-11 François Pinard + + * Prerelease 1.11o. + +1997-03-29 François Pinard + + * ignfail.sh: New file. + * Makefile.am (TESTS): Adjusted. + Reported by Ralph Schleicher. + +1997-03-24 François Pinard + + * genfile.c: Implement --pattern=default/zeros. + +1997-02-25 François Pinard + + * old.sh: New file. + * Makefile.am (TESTS): Adjusted. + Reported by Daniel Trinkle. + +1997-01-21 François Pinard + + * 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 + + * genfile.c (usage): Typo in message. + Reported by Christian Kirsch. + +1996-11-22 François Pinard + + * 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 + + * 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 + + * volcheck.sh: New. + * Makefile.am (TESTS): Adjusted. + +1996-09-19 François Pinard + + * 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 + + * childerr.sh, direxist.sh, before, after: New files. + * Makefile.am: Adjusted. + +1996-09-04 François Pinard + + * 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..e8edf5c --- /dev/null +++ b/INSTALL @@ -0,0 +1,237 @@ +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. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +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..61528ca --- /dev/null +++ b/Makefile.am @@ -0,0 +1,31 @@ +# Main Makefile for GNU tar. + +# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2007 Free +# Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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..20fb134 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,994 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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, 2007 Free +# Software Foundation, Inc. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/compile \ + build-aux/config.guess build-aux/config.rpath \ + build-aux/config.sub build-aux/depcomp build-aux/install-sh \ + build-aux/mdate-sh build-aux/missing build-aux/mkinstalldirs \ + build-aux/texinfo.tex build-aux/ylwrap +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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 +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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; nonemtpy = 1; } \ + END { if (nonempty) { 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; nonempty = 1; } \ + END { if (nonempty) { 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=; \ + 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; nonempty = 1; } \ + END { if (nonempty) { 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-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(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.lzma*) \ + unlzma -c $(distdir).tar.lzma | $(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-lzma 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..a9036d5 --- /dev/null +++ b/NEWS @@ -0,0 +1,1027 @@ +GNU tar NEWS - User visible changes. 2008-04-14 +Please send GNU tar bug reports to + + +version 1.20 - Sergey Poznyakoff, 2008-04-14 + +* New option --auto-compress (-a) + +With --create, selects compression algorithm basing on the suffix +of the archive file name. + +* New option --lzma + +Selects LZMA compression algorithm + +* New option --hard-dereference + +During archive creation, dereferences hard links and stores the files +they refer to, instead of creating usual hard link members (type '1'). + +* New option --checkpoint-action + +This action allows to specify an action to be executed upon hitting a +checkpoint. Recognized actions are: dot, echo (the default), +echo=string, ttyout=string, exec=cmdline, and sleep=value. Any number +of `--checkpoint-action' options can be specified, the actions will be +executed in order of their appearance in the command line. See +chapter 3.8 "Checkpoints" for a complete description. + +* New options --no-check-device, --check-device. + +The `--no-check-device' option disables comparing device numbers during +preparatory stage of an incremental dump. This allows to avoid +creating full dumps if the device numbers change (e.g. when using an +LVM snapshot). + +The `--check-device' option enables comparing device numbers. This is +the default. This option is provided to undo the effect of the previous +`--no-check-device' option, e.g. if it was set in TAR_OPTIONS +environment variable. + +* The --transform option. + +Any number of `--transform' options can be given in the command line. +The specified transformations will be applied in turn. + +The argument to `--transform' option can be a list of replace +expressions, separated by a semicolon (as in `sed'). + +Filename transformations are applied to symbolic link targets +during both creation and extraction. Tar 1.19 used them only +during extraction. + +For a detailed description, see chapter 6.7 "Modifying File and Member +Names". + +* Info (end-of-volume) scripts + +The value of the blocking factor is made available to info and +checkpoint scripts via environment variable TAR_BLOCKING_FACTOR. + +* Incremental archives + +Improved (sped up) extracting from incremental archives. + +* Bugfixes. +** Fix bug introduced in version 1.19: tar refused to update non-existing +archives. + + +version 1.19 - Sergey Poznyakoff, 2007-10-10 + +* New option --exclude-vcs + +Excludes directories and files, created by several widely used version +control systems, e.g. "CVS/", ".svn/", etc. + +* --exclude-tag and --exclude-cache options + +The following options now work with incremental archives as well: + + --exclude-caches + --exclude-caches-all + --exclude-tag + --exclude-tag-all + --exclude-tag-under + +* Fix handling of renamed files in listed incremental archives. + +Previous versions always stored absolute file names in rename +records, even if -P was not used. This is fixed: rename records +contain file names processed in accordance with the command line +settings. + +* Fix --version output. + +* Recognition of broken archives. + +When supplied an archive smaller than 512 bytes in reading mode (-x, +-t), the previous version of tar silently ignored it, exiting with +code 0. It is fixed. Tar now issues the following diagnostic message: +'This does not look like a tar archive', and exits with code 2. + +* Fix double-dot recognition in archive member names in case of duplicate '/.'. + +* Fix file padding in case of truncation of the input file to zero size. + + +version 1.18 - Sergey Poznyakoff, 2007-06-29 + +* Licensed under the GPLv3 + +* Fixed several bugs in the testsuite + + +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 --occurrence. 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 + . + 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 . + +* `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 . + + +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, 2008 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 3, 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..d3d5ddf --- /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. + + +* Amiga + +**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/GNUtar-1.11.8.lha + maintained by Enrico Forestieri + 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 + Based on tar 1.11.8, needs ixemul.library. + +**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/gnutar.lha + maintained by + +* 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 + This is not GNU tar, but a separate implementation. + +** maintained by William Bader + 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 + 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 + 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 + 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 + Based on tar 1.10. Support for SCSI (via ASPI). + +**X ftp://wuarchive (?) + Several DOS version based on PDtar. John Gilmore 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 + 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 + 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 + 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 + 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 + 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, 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 3, 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: + diff --git a/README b/README new file mode 100644 index 0000000..f07050c --- /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 +. You can work around the +incompatibility by using a shell command like + `gzip -d 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 . 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 . + + +* Copying + + Copyright (C) 1990, 1991, 1992, 1994, 1997, 1998, 1999, 2000, + 2001, 2003, 2004, 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 3, 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..1b40c3e --- /dev/null +++ b/THANKS @@ -0,0 +1,524 @@ +GNU tar THANKS file + +Please see the AUTHORS file for the list of principal authors. + +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-Louis Martineau martineau@zmanda.com +Jean-Michel Soenen soenen@lectra.fr +Jean-Loup Gailly jloup@chorus.fr +Jeff Moskow jeff@rtr.com +Jean-Ph. Martin-Flatin syj@ecmwf.int +Jean-Pierre Demailly Jean-Pierre.Demailly@ujf-grenoble.fr +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 +Lasse Collin lasse.collin@tukaani.org +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..f440a08 --- /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 + 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, 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 3, 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..bfc23db --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1169 @@ +# generated automatically by aclocal 1.10.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(AC_AUTOCONF_VERSION, [2.61],, +[m4_warning([this file was generated for autoconf 2.61. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# 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"]) + ] +) + +# size_max.m4 serial 6 +dnl Copyright (C) 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 From Bruno Haible. + +AC_DEFUN([gl_SIZE_MAX], +[ + AC_CHECK_HEADERS(stdint.h) + dnl First test whether the system already has SIZE_MAX. + AC_MSG_CHECKING([for SIZE_MAX]) + AC_CACHE_VAL([gl_cv_size_max], [ + gl_cv_size_max= + AC_EGREP_CPP([Found it], [ +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif +], gl_cv_size_max=yes) + if test -z "$gl_cv_size_max"; then + dnl Define it ourselves. Here we assume that the type 'size_t' is not wider + dnl than the type 'unsigned long'. Try hard to find a definition that can + dnl be used in a preprocessor #if, i.e. doesn't contain a cast. + AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1], + [#include +#include ], size_t_bits_minus_1=) + AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)], + [#include ], fits_in_uint=) + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + dnl Even though SIZE_MAX fits in an unsigned int, it must be of type + dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. + AC_TRY_COMPILE([#include + extern size_t foo; + extern unsigned long foo; + ], [], fits_in_uint=0) + fi + dnl We cannot use 'expr' to simplify this expression, because 'expr' + dnl works only with 'long' integers in the host environment, while we + dnl might be cross-compiling from a 32-bit platform to a 64-bit platform. + if test $fits_in_uint = 1; then + gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" + else + gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" + fi + else + dnl Shouldn't happen, but who knows... + gl_cv_size_max='((size_t)~(size_t)0)' + fi + fi + ]) + AC_MSG_RESULT([$gl_cv_size_max]) + if test "$gl_cv_size_max" != yes; then + AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], + [Define as the maximum value of type 'size_t', if the system doesn't define it.]) + fi +]) + +dnl 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])]) +]) + +# Copyright (C) 2002, 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. + +# 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.10' +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.10.1], [], + [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.10.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(AC_AUTOCONF_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, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 13 + +# 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_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 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 +]) + +# Copyright (C) 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_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 +# 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 /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/alloca.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/environ.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/fseeko.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/include_next.m4]) +m4_include([m4/inline.m4]) +m4_include([m4/intlmacosx.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/lseek.m4]) +m4_include([m4/lstat.m4]) +m4_include([m4/malloc.m4]) +m4_include([m4/malloca.m4]) +m4_include([m4/mbchar.m4]) +m4_include([m4/mbiter.m4]) +m4_include([m4/mbrtowc.m4]) +m4_include([m4/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/realloc.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/snprintf.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/strings_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/xsize.m4]) +m4_include([m4/xstrndup.m4]) +m4_include([m4/xstrtol.m4]) diff --git a/build-aux/compile b/build-aux/compile new file mode 100755 index 0000000..1b1d232 --- /dev/null +++ b/build-aux/compile @@ -0,0 +1,142 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +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/build-aux/config.guess b/build-aux/config.guess new file mode 100755 index 0000000..6603908 --- /dev/null +++ b/build-aux/config.guess @@ -0,0 +1,1529 @@ +#! /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, 2007, 2008 +# Free Software Foundation, Inc. + +timestamp='2008-03-12' + +# 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 . +# Please send patches to . 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 ." + +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, 2006, 2007, 2008 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.*:* | i86xen: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 /* 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 + + 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:*:[456]) + 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 + #include + + 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 + 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 ;; + IA64) + echo ia64-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:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + 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 ${UNAME_MACHINE}-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 + #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' /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 + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # 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 ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + 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 < +# include +#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 + 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 +# 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 < 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..35f959b --- /dev/null +++ b/build-aux/config.rpath @@ -0,0 +1,666 @@ +#! /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-2008 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 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* | cygwin* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux* | k*bsd*-gnu) + 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,' + ;; + rdos*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + wl='-Wl,' + ;; + unicos*) + wl='-Wl,' + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's 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 + aix[3-9]*) + # 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 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 + ;; + interix[3-9]*) + hardcode_direct=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + else + ld_shlibs=no + fi + ;; + esac + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = no; then + hardcode_libdir_flag_spec= + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + 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* | 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*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + ;; + sysv5* | sco3.2v5* | sco5v6*) + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +# Unlike libtool.m4, here we don't care about _all_ names of the library, but +# only about the one the linker finds when passed -lNAME. This is the last +# element of library_names_spec in libtool.m4, or possibly two of them if the +# linker has special search rules. +library_names_spec= # the last element of library_names_spec in libtool.m4 +libname_spec='lib$name' +case "$host_os" in + aix3*) + library_names_spec='$libname.a' + ;; + aix[4-9]*) + library_names_spec='$libname$shrext' + ;; + amigaos*) + library_names_spec='$libname.a' + ;; + beos*) + library_names_spec='$libname$shrext' + ;; + bsdi[45]*) + library_names_spec='$libname$shrext' + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + library_names_spec='$libname.dll.a $libname.lib' + ;; + darwin* | rhapsody*) + shrext=.dylib + library_names_spec='$libname$shrext' + ;; + dgux*) + library_names_spec='$libname$shrext' + ;; + freebsd1*) + ;; + freebsd* | dragonfly*) + case "$host_os" in + freebsd[123]*) + library_names_spec='$libname$shrext$versuffix' ;; + *) + library_names_spec='$libname$shrext' ;; + esac + ;; + gnu*) + library_names_spec='$libname$shrext' + ;; + hpux9* | hpux10* | hpux11*) + case $host_cpu in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + library_names_spec='$libname$shrext' + ;; + interix[3-9]*) + library_names_spec='$libname$shrext' + ;; + irix5* | irix6* | nonstopux*) + library_names_spec='$libname$shrext' + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux* | k*bsd*-gnu) + library_names_spec='$libname$shrext' + ;; + knetbsd*-gnu) + library_names_spec='$libname$shrext' + ;; + netbsd*) + library_names_spec='$libname$shrext' + ;; + newsos6) + library_names_spec='$libname$shrext' + ;; + nto-qnx*) + library_names_spec='$libname$shrext' + ;; + openbsd*) + library_names_spec='$libname$shrext$versuffix' + ;; + os2*) + libname_spec='$name' + shrext=.dll + library_names_spec='$libname.a' + ;; + osf3* | osf4* | osf5*) + library_names_spec='$libname$shrext' + ;; + rdos*) + ;; + solaris*) + library_names_spec='$libname$shrext' + ;; + sunos4*) + library_names_spec='$libname$shrext$versuffix' + ;; + sysv4 | sysv4.3*) + library_names_spec='$libname$shrext' + ;; + sysv4*MP*) + library_names_spec='$libname$shrext' + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + library_names_spec='$libname$shrext' + ;; + uts4*) + library_names_spec='$libname$shrext' + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. 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 ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | 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-* | metag-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | 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-* | tile-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # 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 + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 + ;; + cr16) + basic_machine=cr16-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 + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + 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 + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + 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..0f2bf43 --- /dev/null +++ b/build-aux/depcomp @@ -0,0 +1,587 @@ +#! /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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# 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 . + +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 . +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/link-warning.h b/build-aux/link-warning.h new file mode 100644 index 0000000..fda0194 --- /dev/null +++ b/build-aux/link-warning.h @@ -0,0 +1,28 @@ +/* GL_LINK_WARNING("literal string") arranges to emit the literal string as + a linker warning on most glibc systems. + We use a linker warning rather than a preprocessor warning, because + #warning cannot be used inside macros. */ +#ifndef GL_LINK_WARNING + /* This works on platforms with GNU ld and ELF object format. + Testing __GLIBC__ is sufficient for asserting that GNU ld is in use. + Testing __ELF__ guarantees the ELF object format. + Testing __GNUC__ is necessary for the compound expression syntax. */ +# if defined __GLIBC__ && defined __ELF__ && defined __GNUC__ +# define GL_LINK_WARNING(message) \ + GL_LINK_WARNING1 (__FILE__, __LINE__, message) +# define GL_LINK_WARNING1(file, line, message) \ + GL_LINK_WARNING2 (file, line, message) /* macroexpand file and line */ +# define GL_LINK_WARNING2(file, line, message) \ + GL_LINK_WARNING3 (file ":" #line ": warning: " message) +# define GL_LINK_WARNING3(message) \ + ({ static const char warning[sizeof (message)] \ + __attribute__ ((__unused__, \ + __section__ (".gnu.warning"), \ + __aligned__ (1))) \ + = message "\n"; \ + (void)0; \ + }) +# else +# define GL_LINK_WARNING(message) ((void) 0) +# endif +#endif diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh new file mode 100755 index 0000000..757a5dc --- /dev/null +++ b/build-aux/mdate-sh @@ -0,0 +1,204 @@ +#!/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 , 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 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# 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 or send patches to +# . + +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 . +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..68e3a41 --- /dev/null +++ b/build-aux/missing @@ -0,0 +1,365 @@ +#! /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 , 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# 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 ." + 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 +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +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 ." + +# 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..175c320 --- /dev/null +++ b/build-aux/texinfo.tex @@ -0,0 +1,8985 @@ +% 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{2008-03-31.10} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software: you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation, either version 3 of the +% License, or (at your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% 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 +\let\ptextop=\top + +% 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 + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 + \noexpand\or \the\toks4 \the\toks6 + \noexpand\else \the\toks8 + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% 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). + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \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\relax \unvbox#1\relax +\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 occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef\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 environments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At run-time, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Environment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + 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 -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other +} + +\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 + % + % Color manipulation macros based on pdfcolor.tex. + \def\cmykDarkRed{0.28 1 1 0.35} + \def\cmykBlack{0 0 0 1} + % + \def\pdfsetcolor#1{\pdfliteral{#1 k}} + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\cmykBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\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 + \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{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, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \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. + \def\urlcolor{\cmykDarkRed} + \def\linkcolor{\cmykDarkRed} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \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\setcolor{\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}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \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} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\undefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named #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 +% emacs-page end of cmaps + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\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 +\def\textecsize{1095} + +% 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 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for 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} +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @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 +\def\reducedecsize{1000} + +% 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 +\def\textecsize{1000} + +% 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 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for 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} +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @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 +\def\reducedecsize{0900} + +% 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 + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% @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 +} + +% Hacks for glyphs from the EC fonts similar to \euro. We don't +% use \let for the aliases, because sometimes we redefine the original +% macro, and the alias should reflect the redefinition. +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +\def\ecfont{% + % We can't distinguish serif/sanserif and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\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 + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% 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}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\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 . + % + \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\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\expansion + \definedummyword\minus + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \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\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \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 + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% 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 freezes 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 these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\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 to achieve this: TeX expands \the only once, + % simply yielding the contents of . (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} +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% + \hbox to 0pt{}% + \chappager + \endgroup + \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{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rm + % + % Have to define \lastsection 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\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\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\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rm + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#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 + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \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, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\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 + \expandafter \let\csname top\endcsname=\ptextop % outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % 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{...} +% If we want to allow any 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 SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \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 SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + `% + \else \char'22 \fi + \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'{'#1'}'{#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 remaining is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% 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\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\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 \. + +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\scanctxt{% + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\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 +% 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 \lastsection, +% 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{\lastsection}% + \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 + {\indexnofonts + \turnoffactive + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. + \getfilename{#4}% + % + % See comments at \activebackslashdouble. + {\activebackslashdouble \xdef\pdfxrefdest{#1}% + \backslashparens\pdfxrefdest}% + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\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. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from 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\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \fi + % + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. On the other hand, if + % it's at the top level, we don't want the normal paragraph indentation. + \noindent + % + % 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 \medskip \fi % space after the standalone 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 \lastsection 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\lastsection{\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 +% \lastsection 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 (de) or locale (de_DE) +% abbreviation. It would be nice if we could set up a hyphenation file. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{\begingroup + \let_=\normalunderscore % normal _ character for filenames + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore{#1_\finish}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup +\endgroup} +} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\def\documentlanguagetrywithoutunderscore#1_#2\finish{% + \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 +} +% +\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\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\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{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \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{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \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, 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 + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \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{673.2pt}{160mm}% that's 51 lines + {\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\relax + \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..7278b6a --- /dev/null +++ b/build-aux/ylwrap @@ -0,0 +1,223 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. + +scriptversion=2007-11-22.22 + +# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, +# 2007 Free Software Foundation, Inc. +# +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 or send patches to +# . + +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 . +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..3f576f3 --- /dev/null +++ b/config.hin @@ -0,0 +1,1222 @@ +/* config.hin. Generated from configure.ac by autoheader. */ + +/* 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 make the limit macros in visible. */ +#undef GL_TRIGGER_STDC_LIMIT_MACROS + +/* 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 indicate the 'malloc' module. */ +#undef GNULIB_MALLOC_GNU + +/* 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 , a header that + may be supplied by this distribution. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the 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 `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 `snprintf', and to 0 if you + don't. */ +#undef HAVE_DECL_SNPRINTF + +/* Define to 1 if you have the declaration of `strdup', and to 0 if you don't. + */ +#undef HAVE_DECL_STRDUP + +/* Define to 1 if you have the declaration of `strerror', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR + +/* 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 `_snprintf', and to 0 if you + don't. */ +#undef HAVE_DECL__SNPRINTF + +/* 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 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 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 header file. */ +#undef HAVE_FEATURES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the `flockfile' function. */ +#undef HAVE_FLOCKFILE + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#undef HAVE_FSEEKO + +/* 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 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 to 1 if you have the header file. */ +#undef HAVE_GRP_H + +/* Define if you have the iconv() function and it works. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_ICONV_H + +/* Define if your compiler supports the #include_next directive. */ +#undef HAVE_INCLUDE_NEXT + +/* 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 or . */ +#undef HAVE_INTMAX_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#undef HAVE_INTTYPES_H_WITH_UINTMAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_IO_H + +/* Define to 1 if you have the `isblank' function. */ +#undef HAVE_ISBLANK + +/* 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 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 header file. */ +#undef HAVE_LINEWRAP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_FD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you support file names longer than 14 characters. */ +#undef HAVE_LONG_FILE_NAMES + +/* 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 if the 'malloc' function is POSIX compliant. */ +#undef HAVE_MALLOC_POSIX + +/* 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 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 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 header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the 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 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 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 you have the header file. */ +#undef HAVE_PWD_H + +/* Define to 1 if you have the `readlink' function. */ +#undef HAVE_READLINK + +/* Define if the 'realloc' function is POSIX compliant. */ +#undef HAVE_REALLOC_POSIX + +/* Define to 1 if you have the `rmdir' function. */ +#undef HAVE_RMDIR + +/* Define to 1 if you have the `rpmatch' function. */ +#undef HAVE_RPMATCH + +/* Define to 1 if you have the 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 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 you have the header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define if exists, doesn't clash with , and declares + uintmax_t. */ +#undef HAVE_STDINT_H_WITH_UINTMAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_EXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strchrnul' function. */ +#undef HAVE_STRCHRNUL + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the 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 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 . 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 header file. */ +#undef HAVE_SYSEXITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BUF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_DEVICE_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_GENTAPE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_INET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IO_TRIOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MTIO_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_SYS_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TAPE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMEB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TPRINTF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the 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 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 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 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 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 lseek does not detect pipes. */ +#undef LSEEK_PIPE_BROKEN + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Define to 1 if `major', `minor', and `makedev' are declared in . + */ +#undef MAJOR_IN_MKDEV + +/* Define to 1 if `major', `minor', and `makedev' are declared in + . */ +#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 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* 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 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 this to 1 if strerror is broken. */ +#undef REPLACE_STRERROR + +/* 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 as the maximum value of type 'size_t', if the system doesn't define + it. */ +#undef SIZE_MAX + +/* 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 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 and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your 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 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 + +/* 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 to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#undef _LARGEFILE_SOURCE + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define to 1 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 AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#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 + +/* Ensure that defines the limit macros, since gnulib's + relies on them. */ +#if defined __cplusplus && !defined __STDC_LIMIT_MACROS && GL_TRIGGER_STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS 1 +#endif + + +/* Define to `unsigned' if 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 `int' if 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 does not define. */ +#undef ino_t + +/* Define to long or long long if and 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 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 does not define. */ +#undef mode_t + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define as the type of the result of subtracting two pointers, if the system + doesn't define it. */ +#undef ptrdiff_t + +/* Define to rpl_re_comp if the replacement should be used. */ +#undef re_comp + +/* Define to rpl_re_compile_fastmap if the replacement should be used. */ +#undef re_compile_fastmap + +/* Define to rpl_re_compile_pattern if the replacement should be used. */ +#undef re_compile_pattern + +/* Define to rpl_re_exec if the replacement should be used. */ +#undef re_exec + +/* Define to rpl_re_match if the replacement should be used. */ +#undef re_match + +/* Define to rpl_re_match_2 if the replacement should be used. */ +#undef re_match_2 + +/* Define to rpl_re_search if the replacement should be used. */ +#undef re_search + +/* Define to rpl_re_search_2 if the replacement should be used. */ +#undef re_search_2 + +/* Define to rpl_re_set_registers if the replacement should be used. */ +#undef re_set_registers + +/* Define to rpl_re_set_syntax if the replacement should be used. */ +#undef re_set_syntax + +/* Define to rpl_re_syntax_options if the replacement should be used. */ +#undef re_syntax_options + +/* Define to 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 the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict, even + though the corresponding Sun C compiler does, which causes + "#define restrict _Restrict" in the previous line. Perhaps some future + version of Sun C++ will work with _Restrict; if so, it'll probably + define __RESTRICT, just as Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +#endif + +/* Define to `unsigned int' if 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 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..cb1ddae --- /dev/null +++ b/configure @@ -0,0 +1,39305 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.61 for GNU tar 1.20. +# +# Report bugs to . +# +# 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 more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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 + + + + +# 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 /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 +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 &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.20' +PACKAGE_STRING='GNU tar 1.20' +PACKAGE_BUGREPORT='bug-tar@gnu.org' + +ac_unique_file="src/tar.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#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 +EOVERFLOW +ALLOCA +ALLOCA_H +GETOPT_H +GNULIB_CHOWN +GNULIB_DUP2 +GNULIB_ENVIRON +GNULIB_FCHDIR +GNULIB_FTRUNCATE +GNULIB_GETCWD +GNULIB_GETLOGIN_R +GNULIB_GETPAGESIZE +GNULIB_LCHOWN +GNULIB_LSEEK +GNULIB_READLINK +GNULIB_SLEEP +HAVE_DUP2 +HAVE_FTRUNCATE +HAVE_GETPAGESIZE +HAVE_READLINK +HAVE_SLEEP +HAVE_DECL_ENVIRON +HAVE_DECL_GETLOGIN_R +HAVE_OS_H +HAVE_SYS_PARAM_H +REPLACE_CHOWN +REPLACE_FCHDIR +REPLACE_GETCWD +REPLACE_GETPAGESIZE +REPLACE_LCHOWN +REPLACE_LSEEK +LIB_CLOCK_GETTIME +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +INCLUDE_NEXT +NEXT_DIRENT_H +DIRENT_H +GNULIB_OPEN +REPLACE_OPEN +NEXT_FCNTL_H +FCNTL_H +NEXT_FLOAT_H +FLOAT_H +FNMATCH_H +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_FOPEN +GNULIB_FREOPEN +GNULIB_FSEEK +GNULIB_FSEEKO +GNULIB_FTELL +GNULIB_FTELLO +GNULIB_FFLUSH +GNULIB_GETDELIM +GNULIB_GETLINE +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 +REPLACE_FOPEN +REPLACE_FREOPEN +HAVE_FSEEKO +REPLACE_FSEEKO +REPLACE_FSEEK +HAVE_FTELLO +REPLACE_FTELLO +REPLACE_FTELL +REPLACE_FFLUSH +HAVE_DECL_GETDELIM +HAVE_DECL_GETLINE +REPLACE_GETLINE +LIBINTL +LTLIBINTL +NEXT_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 +NEXT_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 +NEXT_INTTYPES_H +PRIPTR_PREFIX +INT32_MAX_LT_INTMAX_MAX +INT64_MAX_EQ_LONG_MAX +UINT32_MAX_LT_UINTMAX_MAX +UINT64_MAX_EQ_ULONG_MAX +INTTYPES_H +GLIBC21 +LOCALCHARSET_TESTS_ENVIRONMENT +HAVE_MALLOC_POSIX +GNULIB_MALLOC_POSIX +GNULIB_REALLOC_POSIX +GNULIB_CALLOC_POSIX +GNULIB_GETSUBOPT +GNULIB_MKDTEMP +GNULIB_MKSTEMP +GNULIB_PUTENV +GNULIB_SETENV +GNULIB_STRTOD +GNULIB_UNSETENV +HAVE_CALLOC_POSIX +HAVE_GETSUBOPT +HAVE_MKDTEMP +HAVE_REALLOC_POSIX +HAVE_SETENV +HAVE_STRTOD +HAVE_UNSETENV +REPLACE_MKSTEMP +REPLACE_PUTENV +REPLACE_STRTOD +VOID_UNSETENV +GNULIB_MEMMEM +GNULIB_MEMPCPY +GNULIB_MEMRCHR +GNULIB_STPCPY +GNULIB_STPNCPY +GNULIB_STRCHRNUL +GNULIB_STRDUP +GNULIB_STRNDUP +GNULIB_STRNLEN +GNULIB_STRPBRK +GNULIB_STRSEP +GNULIB_STRSTR +GNULIB_STRCASESTR +GNULIB_STRTOK_R +GNULIB_MBSLEN +GNULIB_MBSNLEN +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 +GNULIB_STRERROR +GNULIB_STRSIGNAL +HAVE_DECL_MEMMEM +HAVE_MEMPCPY +HAVE_DECL_MEMRCHR +HAVE_STPCPY +HAVE_STPNCPY +HAVE_STRCHRNUL +HAVE_DECL_STRDUP +HAVE_STRNDUP +HAVE_DECL_STRNDUP +HAVE_DECL_STRNLEN +HAVE_STRPBRK +HAVE_STRSEP +HAVE_STRCASESTR +HAVE_DECL_STRTOK_R +HAVE_DECL_STRERROR +HAVE_DECL_STRSIGNAL +REPLACE_STRERROR +REPLACE_STRSIGNAL +REPLACE_MEMMEM +REPLACE_STRCASESTR +REPLACE_STRSTR +STDARG_H +NEXT_STDARG_H +NEXT_STDIO_H +NEXT_STDLIB_H +HAVE_STRCASECMP +HAVE_DECL_STRNCASECMP +NEXT_STRING_H +NEXT_STRINGS_H +HAVE_LSTAT +HAVE_DECL_MKDIR +HAVE_IO_H +NEXT_SYS_STAT_H +SYS_STAT_H +NEXT_SYSEXITS_H +HAVE_SYSEXITS_H +SYSEXITS_H +REPLACE_LOCALTIME_R +REPLACE_NANOSLEEP +REPLACE_STRPTIME +REPLACE_TIMEGM +NEXT_TIME_H +TIME_H_DEFINES_STRUCT_TIMESPEC +SYS_TIME_H_DEFINES_STRUCT_TIMESPEC +NEXT_UNISTD_H +HAVE_UNISTD_H +GNULIB_WCWIDTH +HAVE_DECL_WCWIDTH +REPLACE_WCWIDTH +WCHAR_H +HAVE_WCHAR_H +NEXT_WCHAR_H +HAVE_ISWCNTRL +HAVE_WINT_T +NEXT_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 +GETTEXT_MACRO_VERSION +MSGFMT +GMSGFMT +MSGFMT_015 +GMSGFMT_015 +XGETTEXT +XGETTEXT_015 +MSGMERGE +XGETTEXT_EXTRA_OPTIONS +INTL_MACOSX_LIBS +INTLLIBS +POSUB +AUTOM4TE +BACKUP_LIBEXEC_SCRIPTS +BACKUP_SBIN_SCRIPTS +BACKUP_SED_COND +LTLIBOBJS +gl_LIBOBJS +gl_LTLIBOBJS +gltests_LIBOBJS +gltests_LTLIBOBJS' +ac_subst_files='' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +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.20 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.20:";; + 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 if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + 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 . +_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.20 +generated by GNU Autoconf 2.61 + +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.20, which was +generated by GNU Autoconf 2.61. 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 isblank" +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 __fpending" +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 wchar.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 stdarg.h" +ac_header_list="$ac_header_list stdio.h" +ac_header_list="$ac_header_list stdlib.h" +ac_header_list="$ac_header_list strings.h" +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_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_header_list="$ac_header_list pwd.h" +ac_header_list="$ac_header_list grp.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.10' + +# 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_test_x "$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_test_x "$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_test_x "$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.20' + + +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_test_x "$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_test_x "$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 &5 + ($am__untar &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_test_x "$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_test_x "$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_test_x "$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_test_x "$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_test_x "$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_test_x "$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 + ac_file='' +fi + +{ echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6; } +if test -z "$ac_file"; then + 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 + +# 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +#include +#include +/* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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_test_x "$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_test_x "$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_test_x "$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" + +if test "x$CC" != xcc; then + { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 +echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; } +else + { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 +echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; } +fi +set dummy $CC; ac_cc=`echo $2 | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; 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. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest2.$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 ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&5' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_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_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + test -f conftest2.$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 + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +cat >>confdefs.h <<\_ACEOF +#define NO_MINUS_C_MINUS_O 1 +_ACEOF + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + +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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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_test_x "$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_test_x "$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 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 +#include +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +_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 + +_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 +#include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 _ALL_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _GNU_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _TANDEM_SOURCE 1 +_ACEOF + + + +{ echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5 +echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6; } +if test "${ac_cv_sys_largefile_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +return fseeko (stdin, 0, 0) && (fseeko) (stdin, 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_sys_largefile_source=no; 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_ipa8_conftest.oo \ + conftest$ac_exeext 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 _LARGEFILE_SOURCE 1 +#include +int +main () +{ +return fseeko (stdin, 0, 0) && (fseeko) (stdin, 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_sys_largefile_source=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_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + ac_cv_sys_largefile_source=unknown + break +done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6; } +case $ac_cv_sys_largefile_source in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source +_ACEOF +;; +esac +rm -f conftest* + +# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug +# in glibc 2.1.3, but that breaks too many other things. +# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. +if test $ac_cv_sys_largefile_source != unknown; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FSEEKO 1 +_ACEOF + +fi + + 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 +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static 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 = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // 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); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +#include +#include +/* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + /* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + /* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_sys_file_offset_bits=no; 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 + /* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + ac_cv_sys_file_offset_bits=unknown + 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; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -f conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { 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 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + /* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_sys_large_files=no; 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 + /* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + ac_cv_sys_large_files=unknown + break +done +fi +{ echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 +echo "${ECHO_T}$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -f conftest* + fi +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +#include + +#if defined S_ISBLK && defined S_IFDIR +extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1]; +#endif + +#if defined S_ISBLK && defined S_IFCHR +extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1]; +#endif + +#if defined S_ISLNK && defined S_IFREG +extern char c3[S_ISLNK (S_IFREG) ? -1 : 1]; +#endif + +#if defined S_ISSOCK && defined S_IFREG +extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1]; +#endif + +_ACEOF +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stat_broken=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stat_broken=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +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 +#include +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +_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 + +_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 +#include +#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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + +{ 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 + # The order here caters to the fact that C++ does not require restrict. + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) getenv; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) clearerr_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) feof_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) ferror_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fflush_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fgets_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fputc_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fputs_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fread_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) fwrite_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) getc_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) getchar_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) putc_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) putchar_unlocked; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + + + + + + + + + + XGETTEXT_EXTRA_OPTIONS= + +{ 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 + #include + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) canonicalize_file_name; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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_ENVIRON=0; + GNULIB_FCHDIR=0; + GNULIB_FTRUNCATE=0; + GNULIB_GETCWD=0; + GNULIB_GETLOGIN_R=0; + GNULIB_GETPAGESIZE=0; + GNULIB_LCHOWN=0; + GNULIB_LSEEK=0; + GNULIB_READLINK=0; + GNULIB_SLEEP=0; + HAVE_DUP2=1; + HAVE_FTRUNCATE=1; + HAVE_GETPAGESIZE=1; + HAVE_READLINK=1; + HAVE_SLEEP=1; + HAVE_DECL_ENVIRON=1; + HAVE_DECL_GETLOGIN_R=1; + HAVE_OS_H=0; + HAVE_SYS_PARAM_H=0; + REPLACE_CHOWN=0; + REPLACE_FCHDIR=0; + REPLACE_GETCWD=0; + REPLACE_GETPAGESIZE=0; + REPLACE_LCHOWN=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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 + +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 +#include +#include + + 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 + # . + case $host in + *-cygwin | i370-ibm-openedition) + gl_cv_double_slash_root=yes ;; + *) + # Be optimistic and assume that / and // are the same when we + # don't know. + gl_cv_double_slash_root='unknown, assuming no' ;; + esac + else + set x `ls -di / // 2>/dev/null` + if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then + gl_cv_double_slash_root=no + else + gl_cv_double_slash_root=yes + fi + fi +fi +{ 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 + (void) strerror_r; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 whether the preprocessor supports include_next" >&5 +echo $ECHO_N "checking whether the preprocessor supports include_next... $ECHO_C" >&6; } +if test "${gl_cv_have_include_next+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -rf conftestd1 conftestd2 + mkdir conftestd1 conftestd2 + cat < conftestd1/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd2/conftest.h +#ifndef DEFINED_IN_CONFTESTD1 +#error "include_next test doesn't work" +#endif +#define DEFINED_IN_CONFTESTD2 +EOF + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Iconftestd1 -Iconftestd2" + cat >conftest.$ac_ext <<_ACEOF +#include +_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_have_include_next=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_have_include_next=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$save_CPPFLAGS" + rm -rf conftestd1 conftestd2 + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_have_include_next" >&5 +echo "${ECHO_T}$gl_cv_have_include_next" >&6; } + if test $gl_cv_have_include_next = yes; then + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_INCLUDE_NEXT 1 +_ACEOF + + + INCLUDE_NEXT=include_next + else + INCLUDE_NEXT=include + fi + + + + + + GNULIB_OPEN=0; + REPLACE_OPEN=0; + + + +{ 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + + + + + + + + + + + + + + + + + + + + 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_FOPEN=0; + GNULIB_FREOPEN=0; + GNULIB_FSEEK=0; + GNULIB_FSEEKO=0; + GNULIB_FTELL=0; + GNULIB_FTELLO=0; + GNULIB_FFLUSH=0; + GNULIB_GETDELIM=0; + GNULIB_GETLINE=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; + REPLACE_FOPEN=0; + REPLACE_FREOPEN=0; + HAVE_FSEEKO=1; + REPLACE_FSEEKO=0; + REPLACE_FSEEK=0; + HAVE_FTELLO=1; + REPLACE_FTELLO=0; + REPLACE_FTELL=0; + REPLACE_FFLUSH=0; + HAVE_DECL_GETDELIM=1; + HAVE_DECL_GETLINE=1; + REPLACE_GETLINE=0; + + + { echo "$as_me:$LINENO: checking whether stdin defaults to large file offsets" >&5 +echo $ECHO_N "checking whether stdin defaults to large file offsets... $ECHO_C" >&6; } +if test "${gl_cv_var_stdin_large_offset+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 +int +main () +{ +#if defined __SL64 && defined __SCLE /* cygwin */ + /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making + fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and + it is easier to do a version check than building a runtime test. */ +# include +# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) + choke me +# endif +#endif + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + gl_cv_var_stdin_large_offset=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_var_stdin_large_offset=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gl_cv_var_stdin_large_offset" >&5 +echo "${ECHO_T}$gl_cv_var_stdin_large_offset" >&6; } + + + + + { 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 +# include +# 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 + (void) getcwd; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include + +int +main () +{ +struct tm tm; + int *p = &tm.tm_sec; + return !p; + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) getdelim; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + +{ 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 + (void) getline; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + +int +main () +{ +#ifndef optreset + (void) optreset; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef getopt_clip + (void) getopt_clip; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +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 $gl_cv_have_include_next = yes; then + gl_cv_next_sys_time_h='<'sys/time.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_sys_time_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/sys/time.h#{ + s#.*"\(.*/sys/time.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_sys_time_h='<'sys/time.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_sys_time_h" >&5 +echo "${ECHO_T}$gl_cv_next_sys_time_h" >&6; } + fi + NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h + + + + + if test $ac_cv_header_sys_time_h = yes; then + HAVE_SYS_TIME_H=1 + else + 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 + #endif + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 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. */ +/* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63; +int +main () +{ +/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); + ; + return 0; +} + +_ACEOF +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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 + #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_ipa8_conftest.oo \ + 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 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. */ +/* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63; +int +main () +{ +/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); + ; + return 0; +} + +_ACEOF +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 $gl_cv_have_include_next = yes; then + gl_cv_next_stdint_h='<'stdint.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_stdint_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/stdint.h#{ + s#.*"\(.*/stdint.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_stdint_h='<'stdint.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_stdint_h" >&5 +echo "${ECHO_T}$gl_cv_next_stdint_h" >&6; } + fi + NEXT_STDINT_H=$gl_cv_next_stdint_h + + + + if test $ac_cv_header_stdint_h = yes; then + HAVE_STDINT_H=1 + else + HAVE_STDINT_H=0 + fi + + + if test $ac_cv_header_stdint_h = yes; then + { 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. */ + +#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 _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#endif + + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + +#ifdef INT8_MAX +int8_t a1 = INT8_MAX; +int8_t a1min = INT8_MIN; +#endif +#ifdef INT16_MAX +int16_t a2 = INT16_MAX; +int16_t a2min = INT16_MIN; +#endif +#ifdef INT32_MAX +int32_t a3 = INT32_MAX; +int32_t a3min = INT32_MIN; +#endif +#ifdef INT64_MAX +int64_t a4 = INT64_MAX; +int64_t a4min = INT64_MIN; +#endif +#ifdef UINT8_MAX +uint8_t b1 = UINT8_MAX; +#else +typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; +#endif +#ifdef UINT16_MAX +uint16_t b2 = UINT16_MAX; +#endif +#ifdef UINT32_MAX +uint32_t b3 = UINT32_MAX; +#endif +#ifdef UINT64_MAX +uint64_t b4 = UINT64_MAX; +#endif +int_least8_t c1 = INT8_C (0x7f); +int_least8_t c1max = INT_LEAST8_MAX; +int_least8_t c1min = INT_LEAST8_MIN; +int_least16_t c2 = INT16_C (0x7fff); +int_least16_t c2max = INT_LEAST16_MAX; +int_least16_t c2min = INT_LEAST16_MIN; +int_least32_t c3 = INT32_C (0x7fffffff); +int_least32_t c3max = INT_LEAST32_MAX; +int_least32_t c3min = INT_LEAST32_MIN; +int_least64_t c4 = INT64_C (0x7fffffffffffffff); +int_least64_t c4max = INT_LEAST64_MAX; +int_least64_t c4min = INT_LEAST64_MIN; +uint_least8_t d1 = UINT8_C (0xff); +uint_least8_t d1max = UINT_LEAST8_MAX; +uint_least16_t d2 = UINT16_C (0xffff); +uint_least16_t d2max = UINT_LEAST16_MAX; +uint_least32_t d3 = UINT32_C (0xffffffff); +uint_least32_t d3max = UINT_LEAST32_MAX; +uint_least64_t d4 = UINT64_C (0xffffffffffffffff); +uint_least64_t d4max = UINT_LEAST64_MAX; +int_fast8_t e1 = INT_FAST8_MAX; +int_fast8_t e1min = INT_FAST8_MIN; +int_fast16_t e2 = INT_FAST16_MAX; +int_fast16_t e2min = INT_FAST16_MIN; +int_fast32_t e3 = INT_FAST32_MAX; +int_fast32_t e3min = INT_FAST32_MIN; +int_fast64_t e4 = INT_FAST64_MAX; +int_fast64_t e4min = INT_FAST64_MIN; +uint_fast8_t f1 = UINT_FAST8_MAX; +uint_fast16_t f2 = UINT_FAST16_MAX; +uint_fast32_t f3 = UINT_FAST32_MAX; +uint_fast64_t f4 = UINT_FAST64_MAX; +#ifdef INTPTR_MAX +intptr_t g = INTPTR_MAX; +intptr_t gmin = INTPTR_MIN; +#endif +#ifdef UINTPTR_MAX +uintptr_t h = UINTPTR_MAX; +#endif +intmax_t i = INTMAX_MAX; +uintmax_t j = UINTMAX_MAX; + +#include /* for CHAR_BIT */ +#define TYPE_MINIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) +#define TYPE_MAXIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) +struct s { + int check_PTRDIFF: + PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) + && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) + ? 1 : -1; + /* Detect bug in FreeBSD 6.0 / ia64. */ + int check_SIG_ATOMIC: + SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) + && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) + ? 1 : -1; + int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; + int check_WCHAR: + WCHAR_MIN == TYPE_MINIMUM (wchar_t) + && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) + ? 1 : -1; + /* Detect bug in mingw. */ + int check_WINT: + WINT_MIN == TYPE_MINIMUM (wint_t) + && WINT_MAX == TYPE_MAXIMUM (wint_t) + ? 1 : -1; + + /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ + int check_UINT8_C: + (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; + int check_UINT16_C: + (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; + + /* Detect bugs in OpenBSD 3.9 stdint.h. */ +#ifdef UINT8_MAX + int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; +#endif +#ifdef UINT16_MAX + int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; +#endif +#ifdef UINT32_MAX + int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; +#endif +#ifdef UINT64_MAX + int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; +#endif + int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; + int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; + int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; + int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; + int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; + int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; + int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; + int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; + int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; + int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; + int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; +}; + +int +main () +{ + + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +static long int longval () { return sizeof ($gltype) * CHAR_BIT; } +static unsigned long int ulongval () { return sizeof ($gltype) * CHAR_BIT; } +#include +#include +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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) imaxabs; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) imaxdiv; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) strtoimax; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) strtoumax; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#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 malloc, realloc, calloc are POSIX compliant" >&5 +echo $ECHO_N "checking whether malloc, realloc, calloc are POSIX compliant... $ECHO_C" >&6; } +if test "${gl_cv_func_malloc_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. */ + +int +main () +{ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_func_malloc_posix=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_func_malloc_posix=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_func_malloc_posix" >&5 +echo "${ECHO_T}$gl_cv_func_malloc_posix" >&6; } + + + GNULIB_MALLOC_POSIX=0; + GNULIB_REALLOC_POSIX=0; + GNULIB_CALLOC_POSIX=0; + GNULIB_GETSUBOPT=0; + GNULIB_MKDTEMP=0; + GNULIB_MKSTEMP=0; + GNULIB_PUTENV=0; + GNULIB_SETENV=0; + GNULIB_STRTOD=0; + GNULIB_UNSETENV=0; + HAVE_CALLOC_POSIX=1; + HAVE_GETSUBOPT=1; + HAVE_MALLOC_POSIX=1; + HAVE_MKDTEMP=1; + HAVE_REALLOC_POSIX=1; + HAVE_SETENV=1; + HAVE_STRTOD=1; + HAVE_UNSETENV=1; + REPLACE_MKSTEMP=0; + REPLACE_PUTENV=0; + REPLACE_STRTOD=0; + VOID_UNSETENV=0; + + + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#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 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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_STRSTR=0; + GNULIB_STRCASESTR=0; + GNULIB_STRTOK_R=0; + GNULIB_MBSLEN=0; + GNULIB_MBSNLEN=0; + GNULIB_MBSCHR=0; + GNULIB_MBSRCHR=0; + GNULIB_MBSSTR=0; + GNULIB_MBSCASECMP=0; + GNULIB_MBSNCASECMP=0; + GNULIB_MBSPCASECMP=0; + GNULIB_MBSCASESTR=0; + GNULIB_MBSCSPN=0; + GNULIB_MBSPBRK=0; + GNULIB_MBSSPN=0; + GNULIB_MBSSEP=0; + GNULIB_MBSTOK_R=0; + GNULIB_STRERROR=0; + GNULIB_STRSIGNAL=0; + HAVE_DECL_MEMMEM=1; + HAVE_MEMPCPY=1; + HAVE_DECL_MEMRCHR=1; + HAVE_STPCPY=1; + HAVE_STPNCPY=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; + HAVE_DECL_STRERROR=1; + HAVE_DECL_STRSIGNAL=1; + REPLACE_STRERROR=0; + REPLACE_STRSIGNAL=0; + REPLACE_MEMMEM=0; + REPLACE_STRCASESTR=0; + REPLACE_STRSTR=0; + +{ 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 + (void) memrchr; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + + + + + + + + + + + + + + + + +{ echo "$as_me:$LINENO: checking whether snprintf is declared" >&5 +echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_snprintf+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 snprintf + (void) snprintf; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_snprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6; } +if test $ac_cv_have_decl_snprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SNPRINTF 0 +_ACEOF + + +fi + + + + + + + + + + HAVE_STRCASECMP=1; + HAVE_DECL_STRNCASECMP=1; + +{ 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 + (void) strdup; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 for working strerror function" >&5 +echo $ECHO_N "checking for working strerror function... $ECHO_C" >&6; } +if test "${gl_cv_func_working_strerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + 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 + +int +main () +{ +return !*strerror (-2); + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_func_working_strerror=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_func_working_strerror=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +return !*strerror (-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 + gl_cv_func_working_strerror=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_strerror=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_strerror" >&5 +echo "${ECHO_T}$gl_cv_func_working_strerror" >&6; } + if test $gl_cv_func_working_strerror = no ; then + REPLACE_STRERROR=1 + + { echo "$as_me:$LINENO: checking whether strerror is declared" >&5 +echo $ECHO_N "checking whether strerror is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl_strerror+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 + (void) strerror; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_strerror=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_strerror=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strerror" >&6; } +if test $ac_cv_have_decl_strerror = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR 0 +_ACEOF + + +fi + + + + fi + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_string_h='<'string.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_string_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/string.h#{ + s#.*"\(.*/string.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_string_h='<'string.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_string_h" >&5 +echo "${ECHO_T}$gl_cv_next_string_h" >&6; } + fi + NEXT_STRING_H=$gl_cv_next_string_h + + + + + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_strings_h='<'strings.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_strings_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test $ac_cv_header_strings_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 + +_ACEOF + gl_cv_next_strings_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/strings.h#{ + s#.*"\(.*/strings.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_strings_h='<'strings.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_strings_h" >&5 +echo "${ECHO_T}$gl_cv_next_strings_h" >&6; } + fi + NEXT_STRINGS_H=$gl_cv_next_strings_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 + (void) strndup; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + (void) strnlen; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 " >&5 +echo $ECHO_N "checking for struct timespec in ... $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 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 " >&5 +echo $ECHO_N "checking for struct timespec in ... $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 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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_sys_time_h = yes; then + SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 + fi + fi + + + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_time_h='<'time.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_time_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/time.h#{ + s#.*"\(.*/time.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_time_h='<'time.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_time_h" >&5 +echo "${ECHO_T}$gl_cv_next_time_h" >&6; } + fi + NEXT_TIME_H=$gl_cv_next_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 + #ifdef HAVE_UTIME_H + # include + #endif +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 + #endif + #include + #ifdef HAVE_UTIME_H + #include + #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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +#include +#include +#include +#include +#include +#include +#include + +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 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 + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + { 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 +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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_int = 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 + (void) vsnprintf; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + GNULIB_WCWIDTH=0; + HAVE_DECL_WCWIDTH=1; + REPLACE_WCWIDTH=0; + WCHAR_H= + + + + + + + + +for ac_header in stdint.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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 SIZE_MAX" >&5 +echo $ECHO_N "checking for SIZE_MAX... $ECHO_C" >&6; } + if test "${gl_cv_size_max+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + gl_cv_size_max= + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if HAVE_STDINT_H +#include +#endif +#ifdef SIZE_MAX +Found it +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Found it" >/dev/null 2>&1; then + gl_cv_size_max=yes +fi +rm -f conftest* + + if test -z "$gl_cv_size_max"; 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. */ +#include +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) * CHAR_BIT - 1) >= 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) * CHAR_BIT - 1) <= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) * CHAR_BIT - 1) < 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) * CHAR_BIT - 1) >= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) * CHAR_BIT - 1) <= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +?*) size_t_bits_minus_1=$ac_lo;; +'') size_t_bits_minus_1= ;; +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 +#include +static long int longval () { return sizeof (size_t) * CHAR_BIT - 1; } +static unsigned long int ulongval () { return sizeof (size_t) * CHAR_BIT - 1; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if ((sizeof (size_t) * CHAR_BIT - 1) < 0) + { + long int i = longval (); + if (i != (sizeof (size_t) * CHAR_BIT - 1)) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != (sizeof (size_t) * CHAR_BIT - 1)) + 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 + size_t_bits_minus_1=`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 ) +size_t_bits_minus_1= +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 + 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. */ +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) < 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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. */ +#include +int +main () +{ +static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +?*) fits_in_uint=$ac_lo;; +'') fits_in_uint= ;; +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 +static long int longval () { return sizeof (size_t) <= sizeof (unsigned int); } +static unsigned long int ulongval () { return sizeof (size_t) <= sizeof (unsigned int); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if ((sizeof (size_t) <= sizeof (unsigned int)) < 0) + { + long int i = longval (); + if (i != (sizeof (size_t) <= sizeof (unsigned int))) + return 1; + fprintf (f, "%ld\n", i); + } + else + { + unsigned long int i = ulongval (); + if (i != (sizeof (size_t) <= sizeof (unsigned int))) + 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 + fits_in_uint=`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 ) +fits_in_uint= +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 + if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then + if test $fits_in_uint = 1; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + extern size_t foo; + extern unsigned long 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + fits_in_uint=0 +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 + if test $fits_in_uint = 1; then + gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)" + else + gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)" + fi + else + gl_cv_size_max='((size_t)~(size_t)0)' + fi + fi + +fi + + { echo "$as_me:$LINENO: result: $gl_cv_size_max" >&5 +echo "${ECHO_T}$gl_cv_size_max" >&6; } + if test "$gl_cv_size_max" != yes; then + +cat >>confdefs.h <<_ACEOF +#define SIZE_MAX $gl_cv_size_max +_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' + + + { 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 +#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 +#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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include + +static long int longval () { return EOVERFLOW; } +static unsigned long int ulongval () { return EOVERFLOW; } +#include +#include +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 + + + + + + + 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 + + + + + + + + + + + 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 + +int +main () +{ +#ifndef program_invocation_name + (void) program_invocation_name; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef program_invocation_short_name + (void) program_invocation_short_name; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +int +main () +{ + program_invocation_name = "test"; + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + conftest$ac_exeext 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 +int +main () +{ + program_invocation_short_name = "test"; + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=argp_error:2:c-format" + + + + XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=argp_failure:4:c-format" + + + + + + + + + + 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 +#include +#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 declares fchown. + For example, HP-UX 11i declares gettimeofday. */ +#define fchown innocuous_fchown + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char fchown (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + #include + #include + +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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + #include + +int +main () +{ +#ifndef dirfd + (void) dirfd; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#include +#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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + #include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + # . + case $host in + *-cygwin | i370-ibm-openedition) + gl_cv_double_slash_root=yes ;; + *) + # Be optimistic and assume that / and // are the same when we + # don't know. + gl_cv_double_slash_root='unknown, assuming no' ;; + esac + else + set x `ls -di / // 2>/dev/null` + if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then + gl_cv_double_slash_root=no + else + gl_cv_double_slash_root=yes + fi + fi +fi +{ 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 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 + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + if test $gt_cv_var_environ_declaration != yes; then + HAVE_DECL_ENVIRON=0 + fi + + + + GNULIB_ENVIRON=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. */ +#include +int +main () +{ +error_at_line (0, 0, "", 0, "an error occurred"); + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + + + : + + + + + XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format" + + + + XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format" + + + + + + + + + + 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 + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_dirent_h='<'dirent.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_dirent_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/dirent.h#{ + s#.*"\(.*/dirent.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_dirent_h='<'dirent.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_dirent_h" >&5 +echo "${ECHO_T}$gl_cv_next_dirent_h" >&6; } + fi + NEXT_DIRENT_H=$gl_cv_next_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 + #include + #include + #include + #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 + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_fcntl_h='<'fcntl.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_fcntl_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/fcntl.h#{ + s#.*"\(.*/fcntl.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_fcntl_h='<'fcntl.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_fcntl_h" >&5 +echo "${ECHO_T}$gl_cv_next_fcntl_h" >&6; } + fi + NEXT_FCNTL_H=$gl_cv_next_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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* | openbsd*) + FLOAT_H=float.h + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_float_h='<'float.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_float_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/float.h#{ + s#.*"\(.*/float.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_float_h='<'float.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_float_h" >&5 +echo "${ECHO_T}$gl_cv_next_float_h" >&6; } + fi + NEXT_FLOAT_H=$gl_cv_next_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 + 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 + +int +main () +{ +#ifndef isblank + (void) isblank; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + + + + + + + + + + + + fp_headers=' +# include +# if HAVE_STDIO_EXT_H +# include +# 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 + (void) __fpending; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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)' \ + \ + '# QNX' \ + '(fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 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 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS fpending.$ac_objext" + + fi + + + + + + + + + { echo "$as_me:$LINENO: checking for fseeko" >&5 +echo $ECHO_N "checking for fseeko... $ECHO_C" >&6; } +if test "${gl_cv_func_fseeko+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 +int +main () +{ +fseeko (stdin, 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + gl_cv_func_fseeko=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_func_fseeko=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_func_fseeko" >&5 +echo "${ECHO_T}$gl_cv_func_fseeko" >&6; } + if test $gl_cv_func_fseeko = no; then + HAVE_FSEEKO=0 + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS fseeko.$ac_objext" + + + REPLACE_FSEEKO=1 + + elif test $gl_cv_var_stdin_large_offset = no; then + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS fseeko.$ac_objext" + + + REPLACE_FSEEKO=1 + + fi + + + + GNULIB_FSEEKO=1 + + + + + + + + + + + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +#include +#include +#include +#include +#include +#include + +#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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +#include +#include +#include + +/* 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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef tzname + (void) tzname; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + if test $ac_cv_have_decl_getdelim = no; then + HAVE_DECL_GETDELIM=0 + fi + + + + GNULIB_GETDELIM=1 + + + + + + + + + + + + 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 declares getline. + For example, HP-UX 11i declares gettimeofday. */ +#define getline innocuous_getline + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char getline (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#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 +# include +# include + 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 $ac_cv_have_decl_getline = no; then + HAVE_DECL_GETLINE=0 + fi + + if test $am_cv_func_working_getline = no; then + REPLACE_GETLINE=1 + + + + + + + + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + if test $ac_cv_have_decl_getdelim = no; then + HAVE_DECL_GETDELIM=0 + fi + + + fi + + + + GNULIB_GETLINE=1 + + + + 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_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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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_getpagesize = no; then + HAVE_GETPAGESIZE=0 + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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_OS_h = yes; then + HAVE_OS_H=1 + fi + +for ac_header in sys/param.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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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_param_h = yes; then + HAVE_SYS_PARAM_H=1 + fi + fi + case "$host_os" in + mingw*) + REPLACE_GETPAGESIZE=1 + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS getpagesize.$ac_objext" + + ;; + esac + + + + GNULIB_GETPAGESIZE=1 + + + + + + + + + + + + + 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 + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + #include + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +#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 */ +#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* work if build isn't clean */ +#include + +/* 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 $gl_cv_have_include_next = yes; then + gl_cv_next_inttypes_h='<'inttypes.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_inttypes_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/inttypes.h#{ + s#.*"\(.*/inttypes.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_inttypes_h='<'inttypes.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_inttypes_h" >&5 +echo "${ECHO_T}$gl_cv_next_inttypes_h" >&6; } + fi + NEXT_INTTYPES_H=$gl_cv_next_inttypes_h + + + + + +cat >>confdefs.h <<\_ACEOF +#define GL_TRIGGER_STDC_LIMIT_MACROS 1 +_ACEOF + + + + + 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 + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + { echo "$as_me:$LINENO: checking whether INT32_MAX < INTMAX_MAX" >&5 +echo $ECHO_N "checking whether INT32_MAX < INTMAX_MAX... $ECHO_C" >&6; } +if test "${gl_cv_test_INT32_MAX_LT_INTMAX_MAX+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. */ +/* Work also in C++ mode. */ + #define __STDC_LIMIT_MACROS 1 + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H + + #include + #if HAVE_STDINT_H + #include + #endif + + #if defined INT32_MAX && defined INTMAX_MAX + #define CONDITION (INT32_MAX < INTMAX_MAX) + #elif HAVE_LONG_LONG_INT + #define CONDITION (sizeof (int) < sizeof (long long int)) + #else + #define CONDITION 0 + #endif + int test[CONDITION ? 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_test_INT32_MAX_LT_INTMAX_MAX=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_test_INT32_MAX_LT_INTMAX_MAX=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&5 +echo "${ECHO_T}$gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&6; } + if test $gl_cv_test_INT32_MAX_LT_INTMAX_MAX = yes; then + INT32_MAX_LT_INTMAX_MAX=1; + else + INT32_MAX_LT_INTMAX_MAX=0; + fi + + + + { echo "$as_me:$LINENO: checking whether INT64_MAX == LONG_MAX" >&5 +echo $ECHO_N "checking whether INT64_MAX == LONG_MAX... $ECHO_C" >&6; } +if test "${gl_cv_test_INT64_MAX_EQ_LONG_MAX+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. */ +/* Work also in C++ mode. */ + #define __STDC_LIMIT_MACROS 1 + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H + + #include + #if HAVE_STDINT_H + #include + #endif + + #if defined INT64_MAX + #define CONDITION (INT64_MAX == LONG_MAX) + #elif HAVE_LONG_LONG_INT + #define CONDITION (sizeof (long long int) == sizeof (long int)) + #else + #define CONDITION 0 + #endif + int test[CONDITION ? 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_test_INT64_MAX_EQ_LONG_MAX=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_test_INT64_MAX_EQ_LONG_MAX=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&5 +echo "${ECHO_T}$gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&6; } + if test $gl_cv_test_INT64_MAX_EQ_LONG_MAX = yes; then + INT64_MAX_EQ_LONG_MAX=1; + else + INT64_MAX_EQ_LONG_MAX=0; + fi + + + + { echo "$as_me:$LINENO: checking whether UINT32_MAX < UINTMAX_MAX" >&5 +echo $ECHO_N "checking whether UINT32_MAX < UINTMAX_MAX... $ECHO_C" >&6; } +if test "${gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX+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. */ +/* Work also in C++ mode. */ + #define __STDC_LIMIT_MACROS 1 + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H + + #include + #if HAVE_STDINT_H + #include + #endif + + #if defined UINT32_MAX && defined UINTMAX_MAX + #define CONDITION (UINT32_MAX < UINTMAX_MAX) + #elif HAVE_LONG_LONG_INT + #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int)) + #else + #define CONDITION 0 + #endif + int test[CONDITION ? 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&5 +echo "${ECHO_T}$gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&6; } + if test $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX = yes; then + UINT32_MAX_LT_UINTMAX_MAX=1; + else + UINT32_MAX_LT_UINTMAX_MAX=0; + fi + + + + { echo "$as_me:$LINENO: checking whether UINT64_MAX == ULONG_MAX" >&5 +echo $ECHO_N "checking whether UINT64_MAX == ULONG_MAX... $ECHO_C" >&6; } +if test "${gl_cv_test_UINT64_MAX_EQ_ULONG_MAX+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. */ +/* Work also in C++ mode. */ + #define __STDC_LIMIT_MACROS 1 + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H + + #include + #if HAVE_STDINT_H + #include + #endif + + #if defined UINT64_MAX + #define CONDITION (UINT64_MAX == ULONG_MAX) + #elif HAVE_LONG_LONG_INT + #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int)) + #else + #define CONDITION 0 + #endif + int test[CONDITION ? 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&5 +echo "${ECHO_T}$gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&6; } + if test $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX = yes; then + UINT64_MAX_EQ_ULONG_MAX=1; + else + UINT64_MAX_EQ_ULONG_MAX=0; + fi + + + + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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_lchown = no; then + REPLACE_LCHOWN=1 + fi + + + + GNULIB_LCHOWN=1 + + + + + + + + + + + + LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(top_builddir)/$gl_source_base\"" + + + + + { echo "$as_me:$LINENO: checking whether lseek detects pipes" >&5 +echo $ECHO_N "checking whether lseek detects pipes... $ECHO_C" >&6; } +if test "${gl_cv_func_lseek_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test $cross_compiling = no; then + cat >conftest.$ac_ext <<_ACEOF + +#include /* for off_t */ +#include /* for SEEK_CUR */ +#include +int main () +{ + /* Exit with success only if stdin is seekable. */ + return lseek (0, (off_t)0, SEEK_CUR) < 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + if test -s conftest$ac_exeext \ + && ./conftest$ac_exeext < conftest.$ac_ext \ + && { echo hi | ./conftest$ac_exeext; test $? = 1; }; then + gl_cv_func_lseek_pipe=yes + else + gl_cv_func_lseek_pipe=no + fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_func_lseek_pipe=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + else + cat >conftest.$ac_ext <<_ACEOF + +#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) || defined __BEOS__ +/* mingw and BeOS mistakenly return 0 when trying to seek on pipes. */ + Choke me. +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + gl_cv_func_lseek_pipe=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + gl_cv_func_lseek_pipe=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ echo "$as_me:$LINENO: result: $gl_cv_func_lseek_pipe" >&5 +echo "${ECHO_T}$gl_cv_func_lseek_pipe" >&6; } + if test $gl_cv_func_lseek_pipe = no; then + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS lseek.$ac_objext" + + + REPLACE_LSEEK=1 + +cat >>confdefs.h <<\_ACEOF +#define LSEEK_PIPE_BROKEN 1 +_ACEOF + + + fi + + + + GNULIB_LSEEK=1 + + + { 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 defined STDC_HEADERS || defined HAVE_STDLIB_H +# include +#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 + + + + +cat >>confdefs.h <<\_ACEOF +#define GNULIB_MALLOC_GNU 1 +_ACEOF + + + + if test $gl_cv_func_malloc_posix = yes; then + HAVE_MALLOC_POSIX=1 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC_POSIX 1 +_ACEOF + + else + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext" + + HAVE_MALLOC_POSIX=0 + fi + + + + + GNULIB_MALLOC_POSIX=1 + + + + + + + + + + + + : + + + + + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#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. */ +$ac_includes_default + #include "obstack.h" +int +main () +{ +struct obstack mem; + #define obstack_chunk_alloc malloc + #define obstack_chunk_free free + obstack_init (&mem); + obstack_free (&mem, 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares fchownat. + For example, HP-UX 11i declares gettimeofday. */ +#define fchownat innocuous_fchownat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char fchownat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +#include +#include +#include +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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + + + if test $gl_cv_func_malloc_posix = yes; then + HAVE_REALLOC_POSIX=1 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC_POSIX 1 +_ACEOF + + else + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext" + + HAVE_REALLOC_POSIX=0 + fi + + + + + GNULIB_REALLOC_POSIX=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 + #endif + #include + #include + +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 (®ex, 0, sizeof regex); + s = re_compile_pattern (pat, sizeof pat - 1, ®ex); + if (s) + return 1; + if (re_search (®ex, data, sizeof data - 1, + 0, sizeof data - 1, ®s) + != -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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("a[^x]b", 6, ®ex); + if (s) + return 1; + + /* This should fail, but succeeds for glibc-2.5. */ + if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -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 (®ex, 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, ®ex); + /* 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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("{1", 2, ®ex); + + if (s) + return 1; + + /* The following example is derived from a problem report + against gawk from Jorge Stolfi . */ + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("[an\371]*n", 7, ®ex); + if (s) + return 1; + + /* This should match, but does not for glibc-2.2.1. */ + if (re_match (®ex, "an", 2, 0, ®s) != 2) + return 1; + + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("x", 1, ®ex); + if (s) + return 1; + + /* glibc-2.2.93 does not work with a negative RANGE argument. */ + if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("x", 1, ®ex); + if (s) + return 1; + + if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) + return 1; + + /* Catch a bug reported by Vin Shelton in + http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html + */ + re_set_syntax (RE_SYNTAX_POSIX_BASIC + & ~RE_CONTEXT_INVALID_DUP + & ~RE_NO_EMPTY_RANGES); + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); + if (s) + 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 + +int +main () +{ +#ifndef isblank + (void) isblank; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + HAVE_SETENV=0 + + + + + + + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + + + GNULIB_SETENV=1 + + + + + + + + + + if test $ac_cv_func_sleep = no; then + HAVE_SLEEP=0 + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS sleep.$ac_objext" + + : + fi + + + + GNULIB_SLEEP=1 + + + + +for ac_func in snprintf +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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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_snprintf = no; then + + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext" + + if test $ac_cv_func_snprintf = yes; then + REPLACE_SNPRINTF=1 + fi + : + + fi + + + + + if test $ac_cv_have_decl_snprintf = no; then + HAVE_DECL_SNPRINTF=0 + fi + + + + GNULIB_SNPRINTF=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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + #if HAVE_SYS_TIME_H + # include + #endif + #include + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + #include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + STDARG_H=''; + NEXT_STDARG_H=''; + { 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined _AIX && !defined __GNUC__ + AIX vaccine + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "vaccine" >/dev/null 2>&1; then + gl_aixcc=yes +else + gl_aixcc=no +fi +rm -f conftest* + + if test $gl_aixcc = yes; then + STDARG_H=stdarg.h + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdarg_h='<'stdarg.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_stdarg_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test $ac_cv_header_stdarg_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 + +_ACEOF + gl_cv_next_stdarg_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/stdarg.h#{ + s#.*"\(.*/stdarg.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_stdarg_h='<'stdarg.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_stdarg_h" >&5 +echo "${ECHO_T}$gl_cv_next_stdarg_h" >&6; } + fi + NEXT_STDARG_H=$gl_cv_next_stdarg_h + + + + if test "$gl_cv_next_stdarg_h" = '""'; then + gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' + NEXT_STDARG_H="$gl_cv_next_stdarg_h" + fi + else + 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + 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 $gl_cv_have_include_next = yes; then + gl_cv_next_stdint_h='<'stdint.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_stdint_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/stdint.h#{ + s#.*"\(.*/stdint.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_stdint_h='<'stdint.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_stdint_h" >&5 +echo "${ECHO_T}$gl_cv_next_stdint_h" >&6; } + fi + NEXT_STDINT_H=$gl_cv_next_stdint_h + + + + if test $ac_cv_header_stdint_h = yes; then + HAVE_STDINT_H=1 + else + HAVE_STDINT_H=0 + fi + + + if test $ac_cv_header_stdint_h = yes; then + { 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. */ + +#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 _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#endif + + + /* BSD/OS 4.0.1 has a bug: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + +#ifdef INT8_MAX +int8_t a1 = INT8_MAX; +int8_t a1min = INT8_MIN; +#endif +#ifdef INT16_MAX +int16_t a2 = INT16_MAX; +int16_t a2min = INT16_MIN; +#endif +#ifdef INT32_MAX +int32_t a3 = INT32_MAX; +int32_t a3min = INT32_MIN; +#endif +#ifdef INT64_MAX +int64_t a4 = INT64_MAX; +int64_t a4min = INT64_MIN; +#endif +#ifdef UINT8_MAX +uint8_t b1 = UINT8_MAX; +#else +typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; +#endif +#ifdef UINT16_MAX +uint16_t b2 = UINT16_MAX; +#endif +#ifdef UINT32_MAX +uint32_t b3 = UINT32_MAX; +#endif +#ifdef UINT64_MAX +uint64_t b4 = UINT64_MAX; +#endif +int_least8_t c1 = INT8_C (0x7f); +int_least8_t c1max = INT_LEAST8_MAX; +int_least8_t c1min = INT_LEAST8_MIN; +int_least16_t c2 = INT16_C (0x7fff); +int_least16_t c2max = INT_LEAST16_MAX; +int_least16_t c2min = INT_LEAST16_MIN; +int_least32_t c3 = INT32_C (0x7fffffff); +int_least32_t c3max = INT_LEAST32_MAX; +int_least32_t c3min = INT_LEAST32_MIN; +int_least64_t c4 = INT64_C (0x7fffffffffffffff); +int_least64_t c4max = INT_LEAST64_MAX; +int_least64_t c4min = INT_LEAST64_MIN; +uint_least8_t d1 = UINT8_C (0xff); +uint_least8_t d1max = UINT_LEAST8_MAX; +uint_least16_t d2 = UINT16_C (0xffff); +uint_least16_t d2max = UINT_LEAST16_MAX; +uint_least32_t d3 = UINT32_C (0xffffffff); +uint_least32_t d3max = UINT_LEAST32_MAX; +uint_least64_t d4 = UINT64_C (0xffffffffffffffff); +uint_least64_t d4max = UINT_LEAST64_MAX; +int_fast8_t e1 = INT_FAST8_MAX; +int_fast8_t e1min = INT_FAST8_MIN; +int_fast16_t e2 = INT_FAST16_MAX; +int_fast16_t e2min = INT_FAST16_MIN; +int_fast32_t e3 = INT_FAST32_MAX; +int_fast32_t e3min = INT_FAST32_MIN; +int_fast64_t e4 = INT_FAST64_MAX; +int_fast64_t e4min = INT_FAST64_MIN; +uint_fast8_t f1 = UINT_FAST8_MAX; +uint_fast16_t f2 = UINT_FAST16_MAX; +uint_fast32_t f3 = UINT_FAST32_MAX; +uint_fast64_t f4 = UINT_FAST64_MAX; +#ifdef INTPTR_MAX +intptr_t g = INTPTR_MAX; +intptr_t gmin = INTPTR_MIN; +#endif +#ifdef UINTPTR_MAX +uintptr_t h = UINTPTR_MAX; +#endif +intmax_t i = INTMAX_MAX; +uintmax_t j = UINTMAX_MAX; + +#include /* for CHAR_BIT */ +#define TYPE_MINIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) +#define TYPE_MAXIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) +struct s { + int check_PTRDIFF: + PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) + && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) + ? 1 : -1; + /* Detect bug in FreeBSD 6.0 / ia64. */ + int check_SIG_ATOMIC: + SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) + && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) + ? 1 : -1; + int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; + int check_WCHAR: + WCHAR_MIN == TYPE_MINIMUM (wchar_t) + && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) + ? 1 : -1; + /* Detect bug in mingw. */ + int check_WINT: + WINT_MIN == TYPE_MINIMUM (wint_t) + && WINT_MAX == TYPE_MAXIMUM (wint_t) + ? 1 : -1; + + /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ + int check_UINT8_C: + (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; + int check_UINT16_C: + (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; + + /* Detect bugs in OpenBSD 3.9 stdint.h. */ +#ifdef UINT8_MAX + int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; +#endif +#ifdef UINT16_MAX + int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; +#endif +#ifdef UINT32_MAX + int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; +#endif +#ifdef UINT64_MAX + int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; +#endif + int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; + int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; + int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; + int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; + int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; + int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; + int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; + int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; + int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; + int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; + int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; +}; + +int +main () +{ + + ; + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + +#include +static long int longval () { return sizeof ($gltype) * CHAR_BIT; } +static unsigned long int ulongval () { return sizeof ($gltype) * CHAR_BIT; } +#include +#include +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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif + + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdio_h='<'stdio.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_stdio_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/stdio.h#{ + s#.*"\(.*/stdio.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_stdio_h='<'stdio.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_stdio_h" >&5 +echo "${ECHO_T}$gl_cv_next_stdio_h" >&6; } + fi + NEXT_STDIO_H=$gl_cv_next_stdio_h + + + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_stdlib_h='<'stdlib.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_stdlib_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/stdlib.h#{ + s#.*"\(.*/stdlib.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_stdlib_h='<'stdlib.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_stdlib_h" >&5 +echo "${ECHO_T}$gl_cv_next_stdlib_h" >&6; } + fi + NEXT_STDLIB_H=$gl_cv_next_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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + (void) strncasecmp; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 $gl_cv_func_working_strerror = no; then + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext" + + +cat >>confdefs.h <<_ACEOF +#define REPLACE_STRERROR $REPLACE_STRERROR +_ACEOF + + fi + + + + GNULIB_STRERROR=1 + + + + + + + + + + + + + + + + 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 declares strndup. + For example, HP-UX 11i declares gettimeofday. */ +#define strndup innocuous_strndup + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char strndup (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + #include +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 doesn'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 defines strtoimax as a macro" >&5 +echo $ECHO_N "checking whether defines strtoimax as a macro... $ECHO_C" >&6; } +if test "${gl_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 +#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 + gl_cv_func_strtoimax_macro=yes +else + gl_cv_func_strtoimax_macro=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_func_strtoimax_macro" >&5 +echo "${ECHO_T}$gl_cv_func_strtoimax_macro" >&6; } + + if test "$gl_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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + (void) strtoll; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 defines strtoumax as a macro" >&5 +echo $ECHO_N "checking whether defines strtoumax as a macro... $ECHO_C" >&6; } +if test "${gl_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 +#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 + gl_cv_func_strtoumax_macro=yes +else + gl_cv_func_strtoumax_macro=no +fi +rm -f conftest* + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_func_strtoumax_macro" >&5 +echo "${ECHO_T}$gl_cv_func_strtoumax_macro" >&6; } + + if test "$gl_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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + (void) strtoull; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef mkdir + (void) mkdir; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 + + + + + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_sys_stat_h='<'sys/stat.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_sys_stat_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/sys/stat.h#{ + s#.*"\(.*/sys/stat.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_sys_stat_h='<'sys/stat.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_sys_stat_h" >&5 +echo "${ECHO_T}$gl_cv_next_sys_stat_h" >&6; } + fi + NEXT_SYS_STAT_H=$gl_cv_next_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_test_x "$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_test_x "$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 + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_sysexits_h='<'sysexits.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_sysexits_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/sysexits.h#{ + s#.*"\(.*/sysexits.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_sysexits_h='<'sysexits.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_sysexits_h" >&5 +echo "${ECHO_T}$gl_cv_next_sysexits_h" >&6; } + fi + NEXT_SYSEXITS_H=$gl_cv_next_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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 +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; + /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ + *localtime_r (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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 $gl_cv_have_include_next = yes; then + gl_cv_next_unistd_h='<'unistd.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_unistd_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/unistd.h#{ + s#.*"\(.*/unistd.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_unistd_h='<'unistd.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_unistd_h" >&5 +echo "${ECHO_T}$gl_cv_next_unistd_h" >&6; } + fi + NEXT_UNISTD_H=$gl_cv_next_unistd_h + + + + + + + + + + + if test $ac_cv_header_unistd_h = yes; then + HAVE_UNISTD_H=1 + 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 . + # 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + HAVE_UNSETENV=0 + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext" + + + + + + + + + + + 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + VOID_UNSETENV=1 + fi + fi + + + + GNULIB_UNSETENV=1 + + + + 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 +#include +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + : +else + +cat >>confdefs.h <<\_ACEOF +#define ptrdiff_t long +_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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 _snprintf is declared" >&5 +echo $ECHO_N "checking whether _snprintf is declared... $ECHO_C" >&6; } +if test "${ac_cv_have_decl__snprintf+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 + +int +main () +{ +#ifndef _snprintf + (void) _snprintf; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl__snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl__snprintf=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_have_decl__snprintf" >&5 +echo "${ECHO_T}$ac_cv_have_decl__snprintf" >&6; } +if test $ac_cv_have_decl__snprintf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SNPRINTF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL__SNPRINTF 0 +_ACEOF + + +fi + + + + + + + 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 is standalone" >&5 +echo $ECHO_N "checking whether 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_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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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=wchar.h + fi + + + + + + + + if test $ac_cv_header_wchar_h = yes; then + HAVE_WCHAR_H=1 + else + HAVE_WCHAR_H=0 + fi + + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_wchar_h='<'wchar.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_wchar_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/wchar.h#{ + s#.*"\(.*/wchar.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_wchar_h='<'wchar.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_wchar_h" >&5 +echo "${ECHO_T}$gl_cv_next_wchar_h" >&6; } + fi + NEXT_WCHAR_H=$gl_cv_next_wchar_h + + + + + + + + + + + + if test $ac_cv_func_iswcntrl = yes; then + HAVE_ISWCNTRL=1 + else + HAVE_ISWCNTRL=0 + fi + + + + + + + + + + + if test $gt_cv_c_wint_t = yes; then + HAVE_WINT_T=1 + else + HAVE_WINT_T=0 + fi + + + WCTYPE_H=wctype.h + if test $ac_cv_header_wctype_h = yes; then + if test $ac_cv_func_iswcntrl = yes; then + WCTYPE_H= + fi + + + + + + + + + + + if test $gl_cv_have_include_next = yes; then + gl_cv_next_wctype_h='<'wctype.h'>' + else + { echo "$as_me:$LINENO: checking absolute name of " >&5 +echo $ECHO_N "checking absolute name of ... $ECHO_C" >&6; } +if test "${gl_cv_next_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 + +_ACEOF + gl_cv_next_wctype_h='"'`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | + sed -n '\#/wctype.h#{ + s#.*"\(.*/wctype.h\)".*#\1# + s#^/[^/]#//&# + p + q + }'`'"' + else + gl_cv_next_wctype_h='<'wctype.h'>' + fi + +fi +{ echo "$as_me:$LINENO: result: $gl_cv_next_wctype_h" >&5 +echo "${ECHO_T}$gl_cv_next_wctype_h" >&6; } + fi + NEXT_WCTYPE_H=$gl_cv_next_wctype_h + + + + HAVE_WCTYPE_H=1 + else + 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 . */ +#include +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include + + +int +main () +{ +#ifndef wcwidth + (void) wcwidth; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + + + if test $ac_cv_have_decl_wcwidth != yes; then + HAVE_DECL_WCWIDTH=0 + fi + + if test $ac_cv_func_wcwidth = no; then + REPLACE_WCWIDTH=1 + else + { echo "$as_me:$LINENO: checking whether wcwidth works reasonably in UTF-8 locales" >&5 +echo $ECHO_N "checking whether wcwidth works reasonably in UTF-8 locales... $ECHO_C" >&6; } +if test "${gl_cv_func_wcwidth_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + gl_cv_func_wcwidth_works="guessing 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 +/* AIX 3.2.5 declares wcwidth in . */ +#include +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include +#if !HAVE_DECL_WCWIDTH +extern +# ifdef __cplusplus +"C" +# endif +int wcwidth (int); +#endif +int main () +{ + if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL) + if (wcwidth (0x0301) > 0 || wcwidth (0x200B) > 0) + 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 + gl_cv_func_wcwidth_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_wcwidth_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_wcwidth_works" >&5 +echo "${ECHO_T}$gl_cv_func_wcwidth_works" >&6; } + case "$gl_cv_func_wcwidth_works" in + *yes) ;; + *no) REPLACE_WCWIDTH=1 ;; + esac + fi + if test $REPLACE_WCWIDTH = 1; then + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext" + + fi + + if test $REPLACE_WCWIDTH = 1 || test $HAVE_DECL_WCWIDTH = 0; then + WCHAR_H=wchar.h + fi + + + + GNULIB_WCWIDTH=1 + + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS xmalloc.$ac_objext" + + + + + : + + + : + + + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS xgetcwd.$ac_objext" + + + + + + + + +for ac_header in stdint.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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 + + + + + : + + + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS xstrtol.$ac_objext" + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS xstrtoul.$ac_objext" + + + + + + + + + gl_LIBOBJS="$gl_LIBOBJS xstrtol-error.$ac_objext" + + + + + + + gltests_libdeps= + gltests_ltlibdeps= + + + + gl_source_base='.#bootmp/tests' + + + + + 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 +#include +#include + +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#endif +#include +_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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 + +_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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + +int +main () +{ +#ifndef getgrgid + (void) getgrgid; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef getpwuid + (void) getpwuid; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 + +int +main () +{ +#ifndef time + (void) time; +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 . + # 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 &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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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 && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.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 +#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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; 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; } + + + + + GETTEXT_MACRO_VERSION=0.17 + + + + +# 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_test_x "$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' + + + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + + + 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +$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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +#include +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 +$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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 +$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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; 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_ipa8_conftest.oo \ + 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 + + + + gltests_libobjs= + gltests_ltlibobjs= + if test -n "$gltests_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed "$sed_drop_objext" | sort | uniq`; do + gltests_libobjs="$gltests_libobjs $i.$ac_objext" + gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" + done + fi + gltests_LIBOBJS=$gltests_libobjs + + gltests_LTLIBOBJS=$gltests_ltlibobjs + + + +: ${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 more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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 + + + + +# 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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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.20, which was +generated by GNU Autoconf 2.61. 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 and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +GNU tar config.status 1.20 +configured by $0, generated by GNU Autoconf 2.61, + 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 +EOVERFLOW!$EOVERFLOW$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_ENVIRON!$GNULIB_ENVIRON$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_GETPAGESIZE!$GNULIB_GETPAGESIZE$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 >$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 +GNULIB_LCHOWN!$GNULIB_LCHOWN$ac_delim +GNULIB_LSEEK!$GNULIB_LSEEK$ac_delim +GNULIB_READLINK!$GNULIB_READLINK$ac_delim +GNULIB_SLEEP!$GNULIB_SLEEP$ac_delim +HAVE_DUP2!$HAVE_DUP2$ac_delim +HAVE_FTRUNCATE!$HAVE_FTRUNCATE$ac_delim +HAVE_GETPAGESIZE!$HAVE_GETPAGESIZE$ac_delim +HAVE_READLINK!$HAVE_READLINK$ac_delim +HAVE_SLEEP!$HAVE_SLEEP$ac_delim +HAVE_DECL_ENVIRON!$HAVE_DECL_ENVIRON$ac_delim +HAVE_DECL_GETLOGIN_R!$HAVE_DECL_GETLOGIN_R$ac_delim +HAVE_OS_H!$HAVE_OS_H$ac_delim +HAVE_SYS_PARAM_H!$HAVE_SYS_PARAM_H$ac_delim +REPLACE_CHOWN!$REPLACE_CHOWN$ac_delim +REPLACE_FCHDIR!$REPLACE_FCHDIR$ac_delim +REPLACE_GETCWD!$REPLACE_GETCWD$ac_delim +REPLACE_GETPAGESIZE!$REPLACE_GETPAGESIZE$ac_delim +REPLACE_LCHOWN!$REPLACE_LCHOWN$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 +INCLUDE_NEXT!$INCLUDE_NEXT$ac_delim +NEXT_DIRENT_H!$NEXT_DIRENT_H$ac_delim +DIRENT_H!$DIRENT_H$ac_delim +GNULIB_OPEN!$GNULIB_OPEN$ac_delim +REPLACE_OPEN!$REPLACE_OPEN$ac_delim +NEXT_FCNTL_H!$NEXT_FCNTL_H$ac_delim +FCNTL_H!$FCNTL_H$ac_delim +NEXT_FLOAT_H!$NEXT_FLOAT_H$ac_delim +FLOAT_H!$FLOAT_H$ac_delim +FNMATCH_H!$FNMATCH_H$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_FOPEN!$GNULIB_FOPEN$ac_delim +GNULIB_FREOPEN!$GNULIB_FREOPEN$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 +GNULIB_GETDELIM!$GNULIB_GETDELIM$ac_delim +GNULIB_GETLINE!$GNULIB_GETLINE$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 +REPLACE_FOPEN!$REPLACE_FOPEN$ac_delim +REPLACE_FREOPEN!$REPLACE_FREOPEN$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 +HAVE_DECL_GETDELIM!$HAVE_DECL_GETDELIM$ac_delim +HAVE_DECL_GETLINE!$HAVE_DECL_GETLINE$ac_delim +REPLACE_GETLINE!$REPLACE_GETLINE$ac_delim +LIBINTL!$LIBINTL$ac_delim +LTLIBINTL!$LTLIBINTL$ac_delim +NEXT_SYS_TIME_H!$NEXT_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 +NEXT_STDINT_H!$NEXT_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 +_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 >$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 +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 +NEXT_INTTYPES_H!$NEXT_INTTYPES_H$ac_delim +PRIPTR_PREFIX!$PRIPTR_PREFIX$ac_delim +INT32_MAX_LT_INTMAX_MAX!$INT32_MAX_LT_INTMAX_MAX$ac_delim +INT64_MAX_EQ_LONG_MAX!$INT64_MAX_EQ_LONG_MAX$ac_delim +UINT32_MAX_LT_UINTMAX_MAX!$UINT32_MAX_LT_UINTMAX_MAX$ac_delim +UINT64_MAX_EQ_ULONG_MAX!$UINT64_MAX_EQ_ULONG_MAX$ac_delim +INTTYPES_H!$INTTYPES_H$ac_delim +GLIBC21!$GLIBC21$ac_delim +LOCALCHARSET_TESTS_ENVIRONMENT!$LOCALCHARSET_TESTS_ENVIRONMENT$ac_delim +HAVE_MALLOC_POSIX!$HAVE_MALLOC_POSIX$ac_delim +GNULIB_MALLOC_POSIX!$GNULIB_MALLOC_POSIX$ac_delim +GNULIB_REALLOC_POSIX!$GNULIB_REALLOC_POSIX$ac_delim +GNULIB_CALLOC_POSIX!$GNULIB_CALLOC_POSIX$ac_delim +GNULIB_GETSUBOPT!$GNULIB_GETSUBOPT$ac_delim +GNULIB_MKDTEMP!$GNULIB_MKDTEMP$ac_delim +GNULIB_MKSTEMP!$GNULIB_MKSTEMP$ac_delim +GNULIB_PUTENV!$GNULIB_PUTENV$ac_delim +GNULIB_SETENV!$GNULIB_SETENV$ac_delim +GNULIB_STRTOD!$GNULIB_STRTOD$ac_delim +GNULIB_UNSETENV!$GNULIB_UNSETENV$ac_delim +HAVE_CALLOC_POSIX!$HAVE_CALLOC_POSIX$ac_delim +HAVE_GETSUBOPT!$HAVE_GETSUBOPT$ac_delim +HAVE_MKDTEMP!$HAVE_MKDTEMP$ac_delim +HAVE_REALLOC_POSIX!$HAVE_REALLOC_POSIX$ac_delim +HAVE_SETENV!$HAVE_SETENV$ac_delim +HAVE_STRTOD!$HAVE_STRTOD$ac_delim +HAVE_UNSETENV!$HAVE_UNSETENV$ac_delim +REPLACE_MKSTEMP!$REPLACE_MKSTEMP$ac_delim +REPLACE_PUTENV!$REPLACE_PUTENV$ac_delim +REPLACE_STRTOD!$REPLACE_STRTOD$ac_delim +VOID_UNSETENV!$VOID_UNSETENV$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_STRSTR!$GNULIB_STRSTR$ac_delim +GNULIB_STRCASESTR!$GNULIB_STRCASESTR$ac_delim +GNULIB_STRTOK_R!$GNULIB_STRTOK_R$ac_delim +GNULIB_MBSLEN!$GNULIB_MBSLEN$ac_delim +GNULIB_MBSNLEN!$GNULIB_MBSNLEN$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 +GNULIB_STRERROR!$GNULIB_STRERROR$ac_delim +GNULIB_STRSIGNAL!$GNULIB_STRSIGNAL$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 +HAVE_STPNCPY!$HAVE_STPNCPY$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 +HAVE_DECL_STRERROR!$HAVE_DECL_STRERROR$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 >$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_DECL_STRSIGNAL!$HAVE_DECL_STRSIGNAL$ac_delim +REPLACE_STRERROR!$REPLACE_STRERROR$ac_delim +REPLACE_STRSIGNAL!$REPLACE_STRSIGNAL$ac_delim +REPLACE_MEMMEM!$REPLACE_MEMMEM$ac_delim +REPLACE_STRCASESTR!$REPLACE_STRCASESTR$ac_delim +REPLACE_STRSTR!$REPLACE_STRSTR$ac_delim +STDARG_H!$STDARG_H$ac_delim +NEXT_STDARG_H!$NEXT_STDARG_H$ac_delim +NEXT_STDIO_H!$NEXT_STDIO_H$ac_delim +NEXT_STDLIB_H!$NEXT_STDLIB_H$ac_delim +HAVE_STRCASECMP!$HAVE_STRCASECMP$ac_delim +HAVE_DECL_STRNCASECMP!$HAVE_DECL_STRNCASECMP$ac_delim +NEXT_STRING_H!$NEXT_STRING_H$ac_delim +NEXT_STRINGS_H!$NEXT_STRINGS_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 +NEXT_SYS_STAT_H!$NEXT_SYS_STAT_H$ac_delim +SYS_STAT_H!$SYS_STAT_H$ac_delim +NEXT_SYSEXITS_H!$NEXT_SYSEXITS_H$ac_delim +HAVE_SYSEXITS_H!$HAVE_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 +NEXT_TIME_H!$NEXT_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 +NEXT_UNISTD_H!$NEXT_UNISTD_H$ac_delim +HAVE_UNISTD_H!$HAVE_UNISTD_H$ac_delim +GNULIB_WCWIDTH!$GNULIB_WCWIDTH$ac_delim +HAVE_DECL_WCWIDTH!$HAVE_DECL_WCWIDTH$ac_delim +REPLACE_WCWIDTH!$REPLACE_WCWIDTH$ac_delim +WCHAR_H!$WCHAR_H$ac_delim +HAVE_WCHAR_H!$HAVE_WCHAR_H$ac_delim +NEXT_WCHAR_H!$NEXT_WCHAR_H$ac_delim +HAVE_ISWCNTRL!$HAVE_ISWCNTRL$ac_delim +HAVE_WINT_T!$HAVE_WINT_T$ac_delim +NEXT_WCTYPE_H!$NEXT_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 +GETTEXT_MACRO_VERSION!$GETTEXT_MACRO_VERSION$ac_delim +MSGFMT!$MSGFMT$ac_delim +GMSGFMT!$GMSGFMT$ac_delim +MSGFMT_015!$MSGFMT_015$ac_delim +GMSGFMT_015!$GMSGFMT_015$ac_delim +XGETTEXT!$XGETTEXT$ac_delim +XGETTEXT_015!$XGETTEXT_015$ac_delim +MSGMERGE!$MSGMERGE$ac_delim +XGETTEXT_EXTRA_OPTIONS!$XGETTEXT_EXTRA_OPTIONS$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 +gltests_LIBOBJS!$gltests_LIBOBJS$ac_delim +gltests_LTLIBOBJS!$gltests_LTLIBOBJS$ac_delim +_ACEOF + + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 77; 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 >$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_arg=$ac_file +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :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 </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..27d2e32 --- /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, 2008 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +AC_INIT([GNU tar], [1.20], [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 +#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 +#include ], [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 symlink setlocale utimes) +AC_CHECK_DECLS([getgrgid],,, [#include ]) +AC_CHECK_DECLS([getpwuid],,, [#include ]) +AC_CHECK_DECLS([time],,, [#include ]) + +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 . + # 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 +#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..1715d35 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,144 @@ +# Makefile for GNU tar documentation. + +# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 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 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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\ + tar-snapshot-edit.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 untabify.el + +# 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) + +untabify: + emacs -batch -l untabify.el $(info_TEXINFOS) $(tar_TEXINFOS) + +final: untabify master-menu + +# Checking +check-format: + @if test -n "`cat $(info_TEXINFOS) $(tar_TEXINFOS) | tr -d -c '\t'`"; then \ + echo "Sources contain tabs; run make untabify"; \ + false; \ + fi + +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.$$$$ + +check-refs: + @for file in $(info_TEXINFOS) $(tar_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@FIXME-.*ref/{s/\(^[0-9][0-9]*\).*@FIXME-.*ref{\([^}]*\).*/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved cross-references:"; \ + cat $@-t;\ + rm $@-t; \ + else \ + rm -f $@-t; \ + fi + +check-fixmes: + @for file in $(info_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@FIXME{/{s/\(^[0-9][0-9]*\).*@FIXME{\([^}]*\).*/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved FIXMEs:"; \ + cat $@-t; \ + rm $@-t; \ + false; \ + else \ + rm -f $@-t; \ + fi + +check-unrevised: + @grep -Hn @UNREVISED $(info_TEXINFOS) > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unrevised nodes:"; \ + cat $@-t; \ + rm $@-t; \ + false;\ + else \ + rm $@-t; \ + fi + +all-check-docs: check-format check-options check-refs check-fixmes check-unrevised + +check-docs: + $(MAKE) -k all-check-docs + +# + +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) --texi2html tar 'GNU tar manual' + diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..73bebcd --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,1049 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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, +# 2007 Free Software Foundation, Inc. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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 = $(srcdir)/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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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\ + tar-snapshot-edit.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 untabify.el + +# 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 .html .info .pdf .ps .texi +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && 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 + +.texi.info: + restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && cd $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + cd $(srcdir); \ + else \ + rc=$$?; \ + cd $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texi.dvi: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $< + +.texi.pdf: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $< + +.texi.html: + rm -rf $(@:.html=.htp) + if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + 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)/tar.info: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS) +tar.dvi: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS) +tar.pdf: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS) +tar.html: tar.texi $(srcdir)/version.texi $(tar_TEXINFOS) +$(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) + +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) + +untabify: + emacs -batch -l untabify.el $(info_TEXINFOS) $(tar_TEXINFOS) + +final: untabify master-menu + +# Checking +check-format: + @if test -n "`cat $(info_TEXINFOS) $(tar_TEXINFOS) | tr -d -c '\t'`"; then \ + echo "Sources contain tabs; run make untabify"; \ + false; \ + fi + +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.$$$$ + +check-refs: + @for file in $(info_TEXINFOS) $(tar_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@FIXME-.*ref/{s/\(^[0-9][0-9]*\).*@FIXME-.*ref{\([^}]*\).*/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved cross-references:"; \ + cat $@-t;\ + rm $@-t; \ + else \ + rm -f $@-t; \ + fi + +check-fixmes: + @for file in $(info_TEXINFOS); \ + do \ + sed -e = $$file | \ + sed -n 'N;/@FIXME{/{s/\(^[0-9][0-9]*\).*@FIXME{\([^}]*\).*/'$$file':\1: \2/gp}'; \ + done > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unresolved FIXMEs:"; \ + cat $@-t; \ + rm $@-t; \ + false; \ + else \ + rm -f $@-t; \ + fi + +check-unrevised: + @grep -Hn @UNREVISED $(info_TEXINFOS) > $@-t; \ + if [ -s $@-t ]; then \ + echo "Unrevised nodes:"; \ + cat $@-t; \ + rm $@-t; \ + false;\ + else \ + rm $@-t; \ + fi + +all-check-docs: check-format check-options check-refs check-fixmes check-unrevised + +check-docs: + $(MAKE) -k all-check-docs + +# + +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) --texi2html 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..faf9ca2 --- /dev/null +++ b/doc/dumpdir.texi @@ -0,0 +1,132 @@ +@c This is part of the paxutils manual. +@c Copyright (C) 2006, 2007 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 @samp{T} command, that immediately follows it. + +@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 the existing directory. +To correctly process it, @GNUTAR{} needs a temporary directory, so +it creates 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..2f989ed --- /dev/null +++ b/doc/gendocs_template @@ -0,0 +1,125 @@ + + + + + + +%%TITLE%% - GNU Project - Free Software Foundation (FSF) + + + + + + + + + + + + + + +

%%TITLE%%

+ +
Free Software Foundation
+
last updated %%DATE%%
+

+ +  [image of the head of a GNU] + +

+
+ +

The manual for %%PACKAGE%% is available in the following formats:

+ + + +

(This page generated by the %%SCRIPTNAME%% script.) +

+ +

+Valid XHTML 1.0! +

+ + + + + 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..6efb8f2 --- /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, 2007 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 3, 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..3580a7b --- /dev/null +++ b/doc/intern.texi @@ -0,0 +1,333 @@ +@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}. + +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. + +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..5f1dbe1 --- /dev/null +++ b/doc/mastermenu.el @@ -0,0 +1,91 @@ +;;; mastermenu.el --- Redefinition of texinfo-master-menu-list + +;; Copyright (C) 2006, 2007 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 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, 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..558772a --- /dev/null +++ b/doc/rendition.texi @@ -0,0 +1,99 @@ +@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{} \string\ @strong{} +@end cartouche +@end ifclear +@end ifset + +@end macro + +@macro FIXME-ref{string} +@ifset PROOF +@strong{} \string\ @strong{} +@end ifset +@ifclear PROOF +@cite{\string\} +@end ifclear +@end macro + +@macro FIXME-pxref{string} +@ifset PROOF +See @strong{} \string\ @strong{} +@end ifset +@ifclear PROOF +See @cite{\string\} +@end ifclear + +@end macro + +@macro FIXME-xref{string} +@ifset PROOF +See @strong{} \string\ @strong{} +@end ifset +@ifclear PROOF +See @cite{\string\} +@end ifclear +@end macro + +@c End of rendition.texi diff --git a/doc/snapshot.texi b/doc/snapshot.texi new file mode 100644 index 0000000..3366402 --- /dev/null +++ b/doc/snapshot.texi @@ -0,0 +1,141 @@ +@c This is part of the paxutils manual. +@c Copyright (C) 2005, 2007 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 three 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. It was used by version +1.15.1. Starting from version 1.16 and up to @value{VERSION}, the +@dfn{format 2} is used. + + @GNUTAR{} is able to read all three formats, but will create +snapshots only in format 2. + + This appendix describes all three formats in detail. + +@enumerate 0 +@cindex format 0, snapshot file +@cindex snapshot file, format 0 +@item + @samp{Format 0} snapshot file begins with a line containing a +decimal number that represents a @acronym{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: + +@table @var +@item nfs +A single plus character (@samp{+}), if this directory is located on +an @acronym{NFS}-mounted partition, or a single space otherwise; + +@item dev +Device number of the directory; + +@item inode +I-node number of the directory; + +@item name +Name of the directory. Any special characters (white-space, +backslashes, etc.) are quoted. +@end table + +@cindex format 1, snapshot file +@cindex snapshot file, format 1 +@item + @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 number 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}). + + Next 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. + + Lines that follow contain directory metadata, one line per +directory. Each line is formatted as follows: + +@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 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}. + +@cindex format 2, snapshot file +@cindex snapshot file, format 2 +@item +@FIXME{} + A snapshot file begins with a format identifier, as described for +version 1, e.g.: + +@smallexample +GNU tar-@value{VERSION}-2 +@end smallexample + + This line is followed by newline. Rest of file consists of +records, separated by null (@acronym{ASCII} 0) +characters. Thus, in contrast to the previous formats, format 2 +snapshot is a binary file. + + First two records are 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. These are followed by arbitrary number of directory records. + + Each @dfn{directory record} contains a set of metadata describing a +particular directory. Parts of a directory record are delimited with +@acronym{ASCII} 0 characters. The following table describes each +part. The @dfn{Number} type in this table stands for a decimal number +in @acronym{ASCII} notation. + +@multitable @columnfractions 0.2 0.2 0.6 +@headitem Field @tab Type @tab Description +@item nfs @tab Character @tab @samp{1} if the directory is located on +an @acronym{NFS}-mounted partition, or @samp{0} otherwise; +@item mtime-sec @tab Number @tab Modification time, seconds; +@item mtime-nano @tab Number @tab Modification time, nanoseconds; +@item dev-no @tab Number @tab Device number; +@item i-no @tab Number @tab I-node number; +@item name @tab String @tab Directory name; In contrast to the +previous versions it is not quoted. +@item contents @tab Dumpdir @tab Contents of the directory; +@xref{Dumpdir}, for a description of its format. +@item +@end multitable + + Dumpdirs stored in snapshot files contain only records of types +@samp{Y}, @samp{N} and @samp{D}. + +@end enumerate + +@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..580b586 --- /dev/null +++ b/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 14 April 2008 +@set UPDATED-MONTH April 2008 +@set EDITION 1.20 +@set VERSION 1.20 diff --git a/doc/tar-snapshot-edit.texi b/doc/tar-snapshot-edit.texi new file mode 100644 index 0000000..9c01a4a --- /dev/null +++ b/doc/tar-snapshot-edit.texi @@ -0,0 +1,58 @@ +@c This is part of the paxutils manual. +@c Copyright (C) 2007 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 Device numbers, changing +@cindex snapshot files, editing +@cindex snapshot files, fixing device numbers + Sometimes device numbers can change after upgrading your kernel +version or recofiguring the harvare. Reportedly this is the case with +some newer @i{Linux} kernels, when using @acronym{LVM}. In majority of +cases this change is unnoticed by the users. However, it influences +@command{tar} incremental backups: the device number is stored in tar +snapshot files (@pxref{Snapshot Files}) and is used to determine whether +the file has changed since the last backup. If the device numbers +change for some reason, the next backup you run will be a full backup. + +@pindex tar-snapshot-edit + To minimize the impact in these cases, GNU @command{tar} comes with +the @command{tar-snapshot-edit} utility for inspecting and updating +device numbers in snapshot files. The utility, written by +Dustin J.@: Mitchell, is available from +@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/tar-snapshot-edit.html, +@GNUTAR{} home page}. + + To obtain the device numbers used in the snapshot file, run + +@smallexample +$ @kbd{tar-snapshot-edit @var{snapfile}} +@end smallexample + +@noindent +where @var{snapfile} is the name of the snapshot file (you can supply as many +files as you wish in a single command line ). + +To update all occurrences of the given device number in the file, use +@option{-r} option. It takes a single argument of the form +@samp{@var{olddev}-@var{newdev}}, where @var{olddev} is the device number +used in the snapshot file, and @var{newdev} is the corresponding new device +number. Both numbers may be specified in hex (e.g., @samp{0xfe01}), +decimal (e.g., @samp{65025}), or as a major:minor number pair (e.g., +@samp{254:1}). To change several device numbers at once, specify them +in a single comma-separated list, as in +@option{-r 0x3060-0x4500,0x307-0x4600}. + +Before updating the snapshot file, it is a good idea to create a backup +copy of it. This is accomplished by @samp{-b} option. The name of the +backup file is obtained by appending @samp{~} to the original file name. + +An example session: +@smallexample +$ @kbd{tar-snapshot-edit /var/backup/snap.a} +file version 2 +/tmp/snap: Device 0x0306 occurs 634 times. +$ @kbd{tar-snapshot-edit -b -r 0x0306-0x4500 /var/backup/snap.a} +file version 2 +@end smallexample + diff --git a/doc/tar.info b/doc/tar.info new file mode 100644 index 0000000..542ce30 --- /dev/null +++ b/doc/tar.info @@ -0,0 +1,402 @@ +This is tar.info, produced by makeinfo version 4.8.90 from tar.texi. + + This manual is for GNU `tar' (version 1.20, 14 April 2008), which +creates and extracts files from archives. + + Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, +2004, 2005, 2006, 2007, 2008 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 have the freedom to copy + and modify this GNU manual. Buying copies from the FSF supports + it 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: 1246 +tar.info-2: 303205 + +Tag Table: +(Indirect) +Node: Top1246 +Node: Introduction10511 +Node: Book Contents11298 +Node: Definitions13470 +Node: What tar Does15273 +Node: Naming tar Archives18039 +Node: Authors18759 +Node: Reports20572 +Node: Tutorial20932 +Node: assumptions21745 +Node: stylistic conventions24220 +Node: basic tar options24663 +Node: frequent operations28301 +Node: Two Frequent Options28953 +Node: file tutorial29584 +Node: verbose tutorial30945 +Ref: verbose member listing33159 +Node: help tutorial35912 +Node: create36266 +Node: prepare for examples37767 +Node: Creating the archive39535 +Node: create verbose42367 +Node: short create43188 +Node: create dir45941 +Node: list48648 +Ref: listing member and file names49922 +Node: list dir52203 +Node: extract53192 +Node: extracting archives54369 +Node: extracting files54859 +Ref: extracting files-Footnote-157506 +Node: extract dir57886 +Node: extracting untrusted archives60269 +Node: failing commands61148 +Node: going further62248 +Node: tar invocation62461 +Node: Synopsis63973 +Node: using tar options68942 +Ref: TAR_OPTIONS70527 +Node: Styles71544 +Node: Long Options73256 +Node: Short Options75428 +Ref: Short Options-Footnote-177236 +Node: Old Options77453 +Ref: Old Options-Footnote-180403 +Node: Mixing80573 +Ref: Mixing-Footnote-182939 +Node: All Options83059 +Node: Operation Summary83664 +Ref: --append83784 +Ref: --catenate83864 +Ref: --compare83935 +Ref: --concatenate84138 +Ref: --create84248 +Ref: --delete84316 +Ref: --diff84429 +Ref: --extract84485 +Ref: --get84587 +Ref: --list84645 +Ref: --update84713 +Node: Option Summary84923 +Ref: --absolute-names85078 +Ref: --after-date85256 +Ref: --anchored85308 +Ref: --atime-preserve85441 +Ref: --auto-compress87956 +Ref: --backup88112 +Ref: --block-number88303 +Ref: --blocking-factor88477 +Ref: --bzip288629 +Ref: --check-device88736 +Ref: --checkpoint88931 +Ref: --checkpoint-action89372 +Ref: --check-links90523 +Ref: --compress90800 +Ref: --uncompress90800 +Ref: --confirmation91004 +Ref: --delay-directory-restore91072 +Ref: --dereference91273 +Ref: --directory91458 +Ref: --exclude91711 +Ref: --exclude-from91830 +Ref: --exclude-caches91976 +Ref: --exclude-caches-under92170 +Ref: --exclude-caches-all92348 +Ref: --exclude-tag92477 +Ref: --exclude-tag-under92632 +Ref: --exclude-tag-all92800 +Ref: --exclude-vcs92914 +Ref: --file93069 +Ref: --files-from93269 +Ref: --force-local93472 +Ref: --format93663 +Ref: --group94333 +Ref: --gzip94681 +Ref: --gunzip94681 +Ref: --ungzip94681 +Ref: --hard-dereference94904 +Ref: --help95091 +Ref: --ignore-case95225 +Ref: --ignore-command-error95352 +Ref: --ignore-failed-read95463 +Ref: --ignore-zeros95593 +Ref: --incremental95738 +Ref: --index-file96003 +Ref: --info-script96088 +Ref: --new-volume-script96088 +Ref: --interactive96409 +Ref: --keep-newer-files96621 +Ref: --keep-old-files96763 +Ref: --label96894 +Ref: --listed-incremental97182 +Ref: --lzma97546 +Ref: --mode97646 +Ref: --mtime97937 +Ref: --multi-volume98378 +Ref: --newer98579 +Ref: --newer-mtime98857 +Ref: --no-anchored99081 +Ref: --no-check-device99218 +Ref: --no-delay-directory-restore99401 +Ref: --no-ignore-case99654 +Ref: --no-ignore-command-error99747 +Ref: --no-overwrite-dir99902 +Ref: --no-quote-chars100045 +Ref: --no-recursion100226 +Ref: --no-same-owner100331 +Ref: --no-same-permissions100514 +Ref: --no-unquote100716 +Ref: --no-wildcards100854 +Ref: --no-wildcards-match-slash100938 +Ref: --null101040 +Ref: --numeric-owner101268 +Ref: --occurrence101919 +Ref: --old-archive102486 +Ref: --one-file-system102535 +Ref: --overwrite102713 +Ref: --overwrite-dir102855 +Ref: --owner103000 +Ref: --pax-option103379 +Ref: --portability103678 +Ref: --posix103743 +Ref: --preserve103785 +Ref: --preserve-order103923 +Ref: --preserve-permissions103987 +Ref: --same-permissions103987 +Ref: --quote-chars104401 +Ref: --quoting-style104554 +Ref: --read-full-records104875 +Ref: --record-size105040 +Ref: --recursion105171 +Ref: --recursive-unlink105274 +Ref: --remove-files105441 +Ref: --restrict105587 +Ref: --rmt-command105775 +Ref: --rsh-command105916 +Ref: --same-order106038 +Ref: --same-owner106330 +Ref: --seek106707 +Ref: --show-defaults106964 +Ref: --show-omitted-dirs107332 +Ref: --show-transformed-names107486 +Ref: --show-stored-names107486 +Ref: --sparse107875 +Ref: --sparse-version108014 +Ref: --starting-file108238 +Ref: --strip-components108427 +Ref: --suffix108739 +Ref: --tape-length108874 +Ref: --test-label109029 +Ref: --to-command109181 +Ref: --to-stdout109340 +Ref: --totals109493 +Ref: --touch109724 +Ref: --transform109926 +Ref: --unlink-first110518 +Ref: --unquote110686 +Ref: --use-compress-program110793 +Ref: --utc110961 +Ref: --verbose111054 +Ref: --verify111306 +Ref: --version111424 +Ref: --volno-file111596 +Ref: --wildcards111783 +Ref: --wildcards-match-slash111903 +Ref: Option Summary-Footnote-1112031 +Node: Short Option Summary112249 +Node: help114420 +Ref: help-Footnote-1118250 +Node: defaults118460 +Node: verbose119477 +Ref: totals121778 +Ref: Progress information123368 +Ref: show-omitted-dirs124347 +Ref: block-number124766 +Ref: verbose-Footnote-1125793 +Node: checkpoints125900 +Node: interactive131291 +Node: operations133374 +Node: Basic tar133633 +Ref: Basic tar-Footnote-1136737 +Node: Advanced tar136881 +Node: Operations137726 +Node: append139696 +Ref: append-Footnote-1142861 +Node: appending files143027 +Node: multiple144808 +Node: update147498 +Node: how to update148537 +Node: concatenate150320 +Ref: concatenate-Footnote-1153569 +Node: delete153707 +Node: compare155550 +Node: create options157040 +Node: override157498 +Node: Ignore Failed Read160936 +Node: extract options161156 +Node: Reading162052 +Node: read full records163615 +Node: Ignore Zeros163951 +Node: Writing164942 +Node: Dealing with Old Files165499 +Node: Overwrite Old Files167926 +Node: Keep Old Files169383 +Node: Keep Newer Files169893 +Node: Unlink First170183 +Node: Recursive Unlink170587 +Node: Data Modification Times171140 +Node: Setting Access Permissions171950 +Node: Directory Modification Times and Permissions172582 +Node: Writing to Standard Output176188 +Node: Writing to an External Program177723 +Node: remove files180460 +Node: Scarce180653 +Node: Starting File180901 +Node: Same Order181721 +Node: backup182557 +Node: Applications185781 +Node: looking ahead187294 +Node: Backups188120 +Node: Full Dumps189952 +Node: Incremental Dumps191758 +Ref: device numbers194894 +Ref: incremental-op198876 +Ref: Incremental Dumps-Footnote-1199250 +Ref: Incremental Dumps-Footnote-2199400 +Node: Backup Levels199887 +Node: Backup Parameters202274 +Node: General-Purpose Variables203455 +Ref: RSH206612 +Node: Magnetic Tape Control208491 +Node: User Hooks209828 +Node: backup-specs example211156 +Node: Scripted Backups212299 +Ref: Scripted Backups-Footnote-1215161 +Node: Scripted Restoration215545 +Node: Choosing218153 +Node: file219338 +Ref: remote-dev222037 +Ref: local and remote archives222429 +Node: Selecting Archive Members223459 +Ref: input name quoting224140 +Node: files226126 +Ref: files-Footnote-1229400 +Node: nul229558 +Node: exclude230855 +Node: problems with exclude235619 +Node: wildcards237664 +Node: controlling pattern-matching240248 +Ref: controlling pattern-matching-Footnote-1244238 +Node: quoting styles244454 +Ref: escape sequences244800 +Node: transform250936 +Ref: show-transformed-names252926 +Node: after256915 +Node: recurse260580 +Node: one263349 +Node: directory264845 +Node: absolute267918 +Ref: absolute-Footnote-1271108 +Node: Date input formats271459 +Node: General date syntax273775 +Node: Calendar date items276726 +Node: Time of day items278723 +Node: Time zone items280839 +Node: Day of week items282073 +Node: Relative items in date strings283062 +Node: Pure numbers in date strings285864 +Node: Seconds since the Epoch286845 +Node: Specifying time zone rules288466 +Node: Authors of get_date290830 +Node: Formats291582 +Node: Compression296270 +Node: gzip296562 +Ref: auto-compress299320 +Ref: gzip-Footnote-1303156 +Node: sparse303205 +Node: Attributes306259 +Node: Portability312230 +Node: Portable Names313716 +Node: dereference314421 +Node: hard links315822 +Ref: hard links-Footnote-1318780 +Node: old318836 +Node: ustar320020 +Node: gnu320611 +Node: posix321488 +Node: PAX keywords321969 +Node: Checksumming326297 +Node: Large or Negative Values328221 +Node: Other Tars329821 +Node: Split Recovery330957 +Node: Sparse Recovery334689 +Ref: extracting sparse v.0.x338322 +Ref: Sparse Recovery-Footnote-1341611 +Ref: Sparse Recovery-Footnote-2341634 +Node: cpio341755 +Node: Media346511 +Node: Device348441 +Node: Remote Tape Server353509 +Node: Common Problems and Solutions357239 +Node: Blocking357631 +Node: Format Variations364138 +Node: Blocking Factor365050 +Node: Many376704 +Node: Tape Positioning380498 +Node: mt382371 +Node: Using Multiple Tapes383926 +Node: Multi-Volume Archives385992 +Ref: tape-length387477 +Ref: change volume prompt387781 +Ref: volno-file388651 +Ref: info-script389203 +Ref: Multi-Volume Archives-Footnote-1394387 +Ref: Multi-Volume Archives-Footnote-2394497 +Node: Tape Files394564 +Node: Tarcat396048 +Node: label397093 +Ref: --test-label option398722 +Ref: label-Footnote-1401767 +Node: verify402002 +Node: Write Protection405302 +Node: Changes406132 +Node: Configuring Help Summary409717 +Node: Fixing Snapshot Files416220 +Node: Tar Internals418405 +Node: Standard418737 +Node: Extensions440938 +Node: Sparse Formats443498 +Node: Old GNU Format444788 +Node: PAX 0447199 +Node: PAX 1450326 +Node: Snapshot Files452060 +Node: Dumpdir456513 +Node: Genfile459759 +Node: Generate Mode460852 +Node: Status Mode465149 +Node: Exec Mode466948 +Node: Free Software Needs Free Documentation469184 +Node: Copying This Manual474155 +Node: GNU Free Documentation License474437 +Node: Index of Command Line Options496844 +Node: Index520649 + +End Tag Table diff --git a/doc/tar.info-1 b/doc/tar.info-1 new file mode 100644 index 0000000..67f9cf9 --- /dev/null +++ b/doc/tar.info-1 @@ -0,0 +1,7723 @@ +This is tar.info, produced by makeinfo version 4.8.90 from tar.texi. + + This manual is for GNU `tar' (version 1.20, 14 April 2008), which +creates and extracts files from archives. + + Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, +2004, 2005, 2006, 2007, 2008 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 have the freedom to copy + and modify this GNU manual. Buying copies from the FSF supports + it 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.20, 14 April 2008), which +creates and extracts files from archives. + + Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, +2004, 2005, 2006, 2007, 2008 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 have the freedom to copy + and modify this GNU manual. Buying copies from the FSF supports + it 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:: +* Fixing Snapshot Files:: +* 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:: +* checkpoints:: +* 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 + +* Compression:: Using Less Space through Compression +* Attributes:: Handling File Attributes +* Portability:: Making `tar' Archives More Portable +* cpio:: Comparison of `tar' and `cpio' + +Using Less Space through Compression + +* gzip:: Creating and Reading Compressed Archives +* sparse:: Archiving Sparse Files + +Making `tar' Archives More Portable + +* Portable Names:: Portable Names +* dereference:: Symbolic Links +* hard links:: Hard 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 + +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.20 +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 +====================================== + + _(This message will disappear, once this node revised.)_ + + +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:: +* checkpoints:: +* 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. + +`--auto-compress' +`-a' + During a `--create' operation, enables automatic compressed format + recognition based on the archive suffix. *Note gzip::. + +`--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::. + +`--check-device' + Check device numbers when creating a list of modified files for + incremental archiving. This is the default. *Note device + numbers::, for a detailed description. + +`--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. You can also instruct `tar' to execute a + list of actions on each checkpoint, see `--checklist-action' + below. For a detailed description, see *note checkpoints::. + +`--checkpoint-action=ACTION' + Instruct `tar' to execute an action upon hitting a breakpoint. + Here we give only a brief outline. *Note checkpoints::, for a + complete description. + + The ACTION argument can be one of the following: + + bell + Produce an audible bell on the console. + + dot + . + Print a single dot on the standard listing stream. + + echo + Display a textual message on the standard error, with the + status and number of the checkpoint. This is the default. + + echo=STRING + Display STRING on the standard error. Before output, the + string is subject to meta-character expansion. + + exec=COMMAND + Execute the given COMMAND. + + sleep=TIME + Wait for TIME seconds. + + ttyout=STRING + Output STRING on the current console (`/dev/tty'). + + Several `--checkpoint-action' options can be specified. The + supplied actions will be executed in order of their appearance in + the command line. + + Using `--checkpoint-action' without `--checkpoint' assumes default + checkpoint frequency of one checkpoint per 10 records. + +`--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). + + *Note hard links::. + +`--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::. + +`--exclude-vcs' + Exclude from dump directories and files, that are internal for some + widely used version control systems. + + *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::. + +`--hard-dereference' + When creating an archive, dereference hard links and store the + files they refer to, instead of creating usual hard link members. + + *Note hard links::. + +`--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::. + +`--lzma' + This option tells `tar' to read or write archives through `lzma'. + *Note gzip::. + +`--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-check-device' + Do not check device numbers when creating a list of modified files + for incremental archiving. *Note device numbers::, for a detailed + description. + +`--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. + +`--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. + + +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.20 + Copyright (C) 2008 Free Software Foundation, Inc. + This is free software. You may redistribute copies of it under the terms + of the GNU General Public License . + 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: checkpoints, 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(1). For example: + + $ tar -c --checkpoint=.1000 /var + ... + + The `--checkpoint' option provides a flexible mechanism for +executing arbitrary actions upon hitting checkpoints, see the next +section (*note checkpoints::), for more information on it. + + 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::. + + ---------- Footnotes ---------- + + (1) This is actually a shortcut for `--checkpoint=N +--checkpoint-action=dot'. *Note dot: checkpoints. + + +File: tar.info, Node: checkpoints, Next: interactive, Prev: verbose, Up: tar invocation + +3.8 Checkpoints +=============== + +A "checkpoint" is a moment of time before writing Nth record to the +archive (a "write checkpoint"), or before reading Nth record from the +archive (a "read checkpoint"). Checkpoints allow to periodically +execute arbitrary actions. + + The checkpoint facility is enabled using the following option: + +`--checkpoint[=N]' + Schedule checkpoints before writing or reading each Nth record. + The default value for N is 10. + + A list of arbitrary "actions" can be executed at each checkpoint. +These actions include: pausing, displaying textual messages, and +executing arbitrary external programs. Actions are defined using the +`--checkpoint-action' option. + +`--checkpoint-action=ACTION' + Execute an ACTION at each checkpoint. + + The simplest value of ACTION is `echo'. It instructs `tar' to +display the default message on the standard error stream upon arriving +at each checkpoint. The default message is (in POSIX locale) `Write +checkpoint N', for write checkpoints, and `Read checkpoint N', for read +checkpoints. Here, N represents ordinal number of the checkpoint. + + In another locales, translated versions of this message are used. + + This is the default action, so running: + + $ tar -c --checkpoint=1000 --checkpoint-action=echo /var + +is equivalent to: + + $ tar -c --checkpoint=1000 /var + + The `echo' action also allows to supply a customized message. You +do so by placing an equals sign and the message right after it, e.g.: + + --checkpoint-action="echo=Hit %s checkpoint #%u" + + The `%s' and `%u' in the above example are "meta-characters". The +`%s' meta-character is replaced with the "type" of the checkpoint: +`write' or `read' (or a corresponding translated version in locales +other than POSIX). The `%u' meta-character is replaced with the +ordinal number of the checkpoint. Thus, the above example could +produce the following output when used with the `--create' option: + + tar: Hit write checkpoint #10 + tar: Hit write checkpoint #20 + tar: Hit write checkpoint #30 + + Aside from meta-character expansion, the message string is subject to +"unquoting", during which the backslash "escape sequences" are replaced +with their corresponding ASCII characters (*note escape sequences::). +E.g. the following action will produce an audible bell and the message +described above at each checkpoint: + + --checkpoint-action='echo=\aHit %s checkpoint #%u' + + There is also a special action which produces an audible signal: +`bell'. It is not equivalent to `echo='\a'', because `bell' sends the +bell directly to the console (`/dev/tty'), whereas `echo='\a'' sends it +to the standard error. + + The `ttyout=STRING' action outputs STRING to `/dev/tty', so it can +be used even if the standard output is redirected elsewhere. The +STRING is subject to the same modifications as with `echo' action. In +contrast to the latter, `ttyout' does not prepend `tar' executable name +to the string, nor does it output a newline after it. For example, the +following action will print the checkpoint message at the same screen +line, overwriting any previous message: + + --checkpoint-action="ttyout=\rHit %s checkpoint #%u" + + Another available checkpoint action is `dot' (or `.'). It instructs +`tar' to print a single dot on the standard listing stream, e.g.: + + $ tar -c --checkpoint=1000 --checkpoint-action=dot /var + ... + + For compatibility with previous GNU `tar' versions, this action can +be abbreviated by placing a dot in front of the checkpoint frequency, +as shown in the previous section. + + Yet another action, `sleep', pauses `tar' for a specified amount of +seconds. The following example will stop for 30 seconds at each +checkpoint: + + $ tar -c --checkpoint=1000 --checkpoint-action=sleep=30 + + Finally, the `exec' action executes a given external program. For +example: + + $ tar -c --checkpoint=1000 --checkpoint-action=exec=/sbin/cpoint + + This program is executed using `/bin/sh -c', with no additional +arguments. Its exit code is ignored. It gets a copy of `tar''s +environment plus the following variables: + +`TAR_VERSION' + GNU `tar' version number. + +`TAR_ARCHIVE' + The name of the archive `tar' is processing. + +`TAR_BLOCKING_FACTOR' + Current blocking factor (*note Blocking::. + +`TAR_CHECKPOINT' + The checkpoint number. + +`TAR_SUBCOMMAND' + A 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. + + Any number of actions can be defined, by supplying several +`--checkpoint-action' options in the command line. For example, the +command below displays two messages, pauses execution for 30 seconds +and executes the `/sbin/cpoint' script: + + $ tar -c -f arc.tar \ + --checkpoint-action='\aecho=Hit %s checkpoint #%u' \ + --checkpoint-action='echo=Sleeping for 30 seconds' \ + --checkpoint-action='sleep=30' \ + --checkpoint-action='exec=/sbin/cpoint' + + This example also illustrates the fact that `--checkpoint-action' +can be used without `--checkpoint'. In this case, the default +checkpoint frequency (at each 10th record) is assumed. + + +File: tar.info, Node: interactive, Prev: checkpoints, Up: tar invocation + +3.9 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 are supposed to be a non-volatile values. 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. + + Apart from using NFS, there are a number of cases where relying on +device numbers can cause spurious redumping of unmodified files. For +example, this occurs when archiving LVM snapshot volumes. To avoid +this, use `--no-check-device' option: + +`--no-check-device' + Do not rely on device numbers when preparing a list of changed + files for an incremental dump. + +`--check-device' + Use device numbers when preparing a list of changed files for an + incremental dump. This is the default behavior. The purpose of + this option is to undo the effect of the `--no-check-device' if it + was given in `TAR_OPTIONS' environment variable (*note + TAR_OPTIONS::). + + There is also another way to cope with changing device numbers. It +is described in detail in *note Fixing Snapshot Files::. + + 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. + + Notice, that lines from FILE are read verbatim. One of the frequent +errors is leaving some extra whitespace after a file name, which is +difficult to catch using text editors. + + However, empty lines are OK. + +`--exclude-vcs' + Exclude files and directories used by some version control systems. + + As of version 1.20, the following files are excluded: + + * `CVS/', and everything under it + + * `RCS/', and everything under it + + * `SCCS/', and everything under it + + * `.git/', and everything under it + + * `.gitignore' + + * `.cvsignore' + + * `.svn/', and everything under it + + * `.arch-ids/', and everything under it + + * `{arch}/', and everything under it + + * `=RELEASE-ID' + + * `=meta-update' + + * `=update' + + 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' options, each 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. + + As in `sed', you can give several replace expressions, separated by +a semicolon. + + 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. + + You can use as many `--transform' options in a single command line +as you want. The specified expressions will then be applied in order +of their appearance. For example, the following two invocations are +equivalent: + + $ tar -cf arch.tar --transform='s,/usr/var,/var/' \ + --transform='s,/usr/local,/usr/,' + $ tar -cf arch.tar \ + --transform='s,/usr/var,/var/;s,/usr/local,/usr/,' + + +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 +() 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 () and +Jim Berets () 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 +() from the `getdate.y' source code, and then +edited by K. Berry (). + + +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.20 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', `bzip2' and `lzma' compression programs. For backward +compatibility, it also supports `compress' command, although we +strongly recommend against using it, because it is by far less +effective than other compression programs(1). + + 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, +`--lzma' to create an LZMA compressed archive and `-Z' (`--compress') +to use `compress' program. For example: + + $ tar cfz archive.tar.gz . + + You can also let GNU `tar' select the compression program basing on +the suffix of the archive file name. This is done using +`--auto-compress' (`-a') command line option. For example, the +following invocation will use `bzip2' for compression: + + $ tar cfa archive.tar.bz2 . + +whereas the following one will use `lzma': + + $ tar cfa archive.tar.lzma . + + For a complete list of file name suffixes recognized by GNU `tar', +*note auto-compress::. + + 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 or add (`--append' (`-r')) members to +them. Likewise, you cannot append another `tar' archive to a +compressed archive using `--concatenate' (`-A')). Secondly, +multi-volume archives cannot be compressed. + + The following table summarizes compression options used by GNU `tar'. + +`--auto-compress' +`-a' + Select a compression program to use by the archive file name + suffix. The following suffixes are recognized: + + Suffix Compression program + -------------------------------------------------------------- + `.gz' `gzip' + `.tgz' `gzip' + `.taz' `gzip' + `.Z' `compress' + `.taZ' `compress' + `.bz2' `bzip2' + `.tz2' `bzip2' + `.tbz2' `bzip2' + `.tbz' `bzip2' + `.lzma' `lzma' + `.tlz' `lzma' + +`-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'. + +`--lzma' + Filter the archive through `lzma'. Otherwise like `--gzip'. + +`-Z' +`--compress' +`--uncompress' + Filter the archive through `compress'. Otherwise like `--gzip'. + +`--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 . + + ---------- Footnotes ---------- + + (1) It also had patent problems in the past. + diff --git a/doc/tar.info-2 b/doc/tar.info-2 new file mode 100644 index 0000000..bd7e2b3 --- /dev/null +++ b/doc/tar.info-2 @@ -0,0 +1,5226 @@ +This is tar.info, produced by makeinfo version 4.8.90 from tar.texi. + + This manual is for GNU `tar' (version 1.20, 14 April 2008), which +creates and extracts files from archives. + + Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, +2004, 2005, 2006, 2007, 2008 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 have the freedom to copy + and modify this GNU manual. Buying copies from the FSF supports + it 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: 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'. + + + +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 +* hard links:: Hard 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: hard links, 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: hard links, Next: old, Prev: dereference, Up: Portability + +8.3.3 Hard Links +---------------- + + _(This message will disappear, once this node revised.)_ + +Normally, when `tar' archives a hard link, it writes a block to the +archive naming the target of the link (a `1' type block). In that way, +the actual file contents is stored in file only once. For example, +consider the following two files: + + $ ls + -rw-r--r-- 2 gray staff 4 2007-10-30 15:11 one + -rw-r--r-- 2 gray staff 4 2007-10-30 15:11 jeden + + Here, `jeden' is a link to `one'. When archiving this directory +with a verbose level 2, you will get an output similar to the following: + + $ tar cfvv ../archive.tar . + drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./ + -rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden + hrw-r--r-- gray/staff 0 2007-10-30 15:11 ./one link to ./jeden + + The last line shows that, instead of storing two copies of the file, +`tar' stored it only once, under the name `jeden', and stored file +`one' as a hard link to this file. + + It may be important to know that all hard links to the given file are +stored in the archive. For example, this may be necessary for exact +reproduction of the file system. The following option does that: + +`--check-links' +`-l' + 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, + print a warning message. + + For example, trying to archive only file `jeden' with this option +produces the following diagnostics: + + $ tar -c -f ../archive.tar jeden + tar: Missing links to `jeden'. + + Although creating special records for hard links helps keep a +faithful record of the file system contents and makes archives more +compact, it may present some difficulties when extracting individual +members from the archive. For example, trying to extract file `one' +from the archive created in previous examples produces, in the absense +of file `jeden': + + $ tar xf archive.tar ./one + tar: ./one: Cannot hard link to `./jeden': No such file or directory + tar: Error exit delayed from previous errors + + The reason for this behavior is that `tar' cannot seek back in the +archive to the previous member (in this case, `one'), to extract it(1). +If you wish to avoid such problems at the cost of a bigger archive, use +the following option: + +`--hard-dereference' + Dereference hard links and store the files they refer to. + + For example, trying this option on our two sample files, we get two +copies in the archive, each of which can then be extracted +independently of the other: + + $ tar -c -vv -f ../archive.tar --hard-dereference . + drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./ + -rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden + -rw-r--r-- gray/staff 4 2007-10-30 15:11 ./one + + ---------- Footnotes ---------- + + (1) There are plans to fix this in future releases. + + +File: tar.info, Node: old, Next: ustar, Prev: hard links, Up: Portability + +8.3.4 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.5 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.6 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.7 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.7.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.8 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.9 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.10 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.10.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.10.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 `'. + +`--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_BLOCKING_FACTOR' + Current blocking factor (*note Blocking::. + +`TAR_VOLUME' + Ordinal number of the volume `tar' is about to start. + +`TAR_SUBCOMMAND' + A 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 can 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.20 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: Fixing Snapshot Files, 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: Fixing Snapshot Files, Next: Tar Internals, Prev: Configuring Help Summary, Up: Top + +Appendix C Fixing Snapshot Files +******************************** + +Sometimes device numbers can change after upgrading your kernel version +or recofiguring the harvare. Reportedly this is the case with some +newer Linux kernels, when using LVM. In majority of cases this change +is unnoticed by the users. However, it influences `tar' incremental +backups: the device number is stored in tar snapshot files (*note +Snapshot Files::) and is used to determine whether the file has changed +since the last backup. If the device numbers change for some reason, +the next backup you run will be a full backup. + + To minimize the impact in these cases, GNU `tar' comes with the +`tar-snapshot-edit' utility for inspecting and updating device numbers +in snapshot files. The utility, written by Dustin J. Mitchell, is +available from GNU `tar' home page +(http://www.gnu.org/software/tar/utils/tar-snapshot-edit.html). + + To obtain the device numbers used in the snapshot file, run + + $ tar-snapshot-edit SNAPFILE + +where SNAPFILE is the name of the snapshot file (you can supply as many +files as you wish in a single command line ). + + To update all occurrences of the given device number in the file, use +`-r' option. It takes a single argument of the form `OLDDEV-NEWDEV', +where OLDDEV is the device number used in the snapshot file, and NEWDEV +is the corresponding new device number. Both numbers may be specified +in hex (e.g., `0xfe01'), decimal (e.g., `65025'), or as a major:minor +number pair (e.g., `254:1'). To change several device numbers at once, +specify them in a single comma-separated list, as in `-r +0x3060-0x4500,0x307-0x4600'. + + Before updating the snapshot file, it is a good idea to create a +backup copy of it. This is accomplished by `-b' option. The name of +the backup file is obtained by appending `~' to the original file name. + + An example session: + $ tar-snapshot-edit /var/backup/snap.a + file version 2 + /tmp/snap: Device 0x0306 occurs 634 times. + $ tar-snapshot-edit -b -r 0x0306-0x4500 /var/backup/snap.a + file version 2 + + +File: tar.info, Node: Tar Internals, Next: Genfile, Prev: Fixing Snapshot Files, Up: Top + +Appendix D 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 + +D.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 + +D.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 + +D.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.20 supports three 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. It was used by version 1.15.1. Starting from +version 1.16 and up to 1.20, the "format 2" is used. + + GNU `tar' is able to read all three formats, but will create +snapshots only in format 2. + + This appendix describes all three formats in detail. + + 0. `Format 0' snapshot file begins with a line containing a decimal + number that represents a 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: + + NFSDEV INODE NAME + + where: + + NFS + A single plus character (`+'), if this directory is located on + an NFS-mounted partition, or a single space otherwise; + + DEV + Device number of the directory; + + INODE + I-node number of the directory; + + NAME + Name of the directory. Any special characters (white-space, + backslashes, etc.) are quoted. + + 1. `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 number of GNU `tar' + implementation that created this snapshot, and INCR-FORMAT-VERSION + is the version number of the snapshot format (in this case `1'). + + Next 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. + + Lines that follow contain directory metadata, one line per + directory. Each line is formatted as follows: + + [NFS]MTIME-SEC MTIME-NSEC DEV INODE NAME + + where MTIME-SEC and MTIME-NSEC represent last modification time of + this directory with nanosecond precision; NFS, DEV, INODE and NAME + have the same meaning as with `format 0'. + + 2. A snapshot file begins with a format identifier, as described + for version 1, e.g.: + + GNU tar-1.20-2 + + This line is followed by newline. Rest of file consists of + records, separated by null (ASCII 0) characters. Thus, in contrast + to the previous formats, format 2 snapshot is a binary file. + + First two records are 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. These are followed by arbitrary number of directory + records. + + Each "directory record" contains a set of metadata describing a + particular directory. Parts of a directory record are delimited + with ASCII 0 characters. The following table describes each part. + The "Number" type in this table stands for a decimal number in + ASCII notation. + + Field Type Description + --------------------------------------------------------------------- + nfs Character `1' if the directory is located on an + NFS-mounted partition, or `0' otherwise; + mtime-sec Number Modification time, seconds; + mtime-nano Number Modification time, nanoseconds; + dev-no Number Device number; + i-no Number I-node number; + name String Directory name; In contrast to the + previous versions it is not quoted. + contents Dumpdir Contents of the directory; *Note + Dumpdir::, for a description of its + format. + + + Dumpdirs stored in snapshot files contain only records of types + `Y', `N' and `D'. + + + +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 `T' command, that immediately follows it. + +`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 the existing directory. To correctly +process it, GNU `tar' needs a temporary directory, so it creates 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 E 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 + +E.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 + +E.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 + +E.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 F 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 . + + 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 G 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 + +G.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. + +G.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 H 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::. + +[index] +* 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) +* auto-compress: gzip. (line 69) +* auto-compress, summary: Option Summary. (line 65) +* backup: backup. (line 41) +* backup, summary: Option Summary. (line 70) +* block-number: verbose. (line 115) +* block-number, summary: Option Summary. (line 75) +* blocking-factor: Blocking Factor. (line 8) +* blocking-factor, summary: Option Summary. (line 81) +* bzip2: gzip. (line 122) +* bzip2, summary: Option Summary. (line 86) +* catenate: concatenate. (line 6) +* catenate, summary: Operation Summary. (line 10) +* check-device, described: Incremental Dumps. (line 99) +* check-device, summary: Option Summary. (line 91) +* check-links, described: hard links. (line 33) +* check-links, summary: Option Summary. (line 142) +* checkpoint: checkpoints. (line 6) +* checkpoint, defined: checkpoints. (line 13) +* checkpoint, summary: Option Summary. (line 96) +* checkpoint-action: checkpoints. (line 6) +* checkpoint-action, defined: checkpoints. (line 22) +* checkpoint-action, summary: Option Summary. (line 104) +* compare: compare. (line 8) +* compare, summary: Operation Summary. (line 14) +* compress: gzip. (line 129) +* compress, summary: Option Summary. (line 151) +* concatenate: concatenate. (line 6) +* concatenate, summary: Operation Summary. (line 20) +* confirmation, summary: Option Summary. (line 158) +* 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 161) +* delete: delete. (line 8) +* delete, summary: Operation Summary. (line 29) +* dereference: dereference. (line 6) +* dereference, summary: Option Summary. (line 166) +* diff, summary: Operation Summary. (line 33) +* directory: directory. (line 11) +* directory, summary: Option Summary. (line 172) +* 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 179) +* exclude-caches: exclude. (line 80) +* exclude-caches, summary: Option Summary. (line 188) +* exclude-caches-all: exclude. (line 88) +* exclude-caches-all, summary: Option Summary. (line 201) +* exclude-caches-under: exclude. (line 84) +* exclude-caches-under, summary: Option Summary. (line 195) +* exclude-from: exclude. (line 22) +* exclude-from, summary: Option Summary. (line 183) +* exclude-tag: exclude. (line 97) +* exclude-tag, summary: Option Summary. (line 205) +* exclude-tag-all: exclude. (line 105) +* exclude-tag-all, summary: Option Summary. (line 213) +* exclude-tag-under: exclude. (line 101) +* exclude-tag-under, summary: Option Summary. (line 209) +* exclude-vcs: exclude. (line 39) +* exclude-vcs, summary: Option Summary. (line 217) +* 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 112) +* file, short description: file. (line 17) +* file, summary: Option Summary. (line 223) +* file, tutorial: file tutorial. (line 6) +* files-from: files. (line 14) +* files-from, summary: Option Summary. (line 229) +* force-local, short description: Device. (line 70) +* force-local, summary: Option Summary. (line 235) +* format, summary: Option Summary. (line 240) +* get, summary: Operation Summary. (line 42) +* group: override. (line 73) +* group, summary: Option Summary. (line 265) +* gunzip, summary: Option Summary. (line 273) +* gzip: gzip. (line 88) +* gzip, summary: Option Summary. (line 273) +* hard-dereference, described: hard links. (line 61) +* hard-dereference, summary: Option Summary. (line 281) +* help: help tutorial. (line 6) +* help, introduction: help. (line 26) +* help, summary: Option Summary. (line 287) +* ignore-case: controlling pattern-matching. + (line 86) +* ignore-case, summary: Option Summary. (line 292) +* ignore-command-error: Writing to an External Program. + (line 82) +* ignore-command-error, summary: Option Summary. (line 296) +* ignore-failed-read: Ignore Failed Read. (line 7) +* ignore-failed-read, summary: Option Summary. (line 300) +* ignore-zeros: Ignore Zeros. (line 6) +* ignore-zeros, short description: Blocking Factor. (line 156) +* ignore-zeros, summary: Option Summary. (line 304) +* incremental, summary: Option Summary. (line 309) +* incremental, using with --list: Incremental Dumps. (line 177) +* index-file, summary: Option Summary. (line 316) +* info-script: Multi-Volume Archives. + (line 80) +* info-script, short description: Device. (line 104) +* info-script, summary: Option Summary. (line 319) +* interactive: interactive. (line 14) +* interactive, summary: Option Summary. (line 327) +* keep-newer-files: Keep Newer Files. (line 6) +* keep-newer-files, summary: Option Summary. (line 334) +* 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 338) +* label: label. (line 8) +* label, summary: Option Summary. (line 343) +* list: list. (line 6) +* list, summary: Operation Summary. (line 46) +* list, using with --incremental: Incremental Dumps. (line 177) +* list, using with --listed-incremental: Incremental Dumps. (line 177) +* 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 350) +* listed-incremental, using with --extract: Incremental Dumps. + (line 112) +* listed-incremental, using with --list: Incremental Dumps. (line 177) +* lzma: gzip. (line 126) +* lzma, summary: Option Summary. (line 358) +* mode: override. (line 14) +* mode, summary: Option Summary. (line 362) +* mtime: override. (line 29) +* mtime, summary: Option Summary. (line 368) +* multi-volume: Multi-Volume Archives. + (line 6) +* multi-volume, short description: Device. (line 88) +* multi-volume, summary: Option Summary. (line 377) +* new-volume-script: Multi-Volume Archives. + (line 80) +* new-volume-script, short description: Device. (line 104) +* new-volume-script, summary: Option Summary. (line 319) +* newer: after. (line 26) +* newer, summary: Option Summary. (line 385) +* newer-mtime: after. (line 37) +* newer-mtime, summary: Option Summary. (line 393) +* no-anchored: controlling pattern-matching. + (line 79) +* no-anchored, summary: Option Summary. (line 398) +* no-check-device, described: Incremental Dumps. (line 95) +* no-check-device, summary: Option Summary. (line 402) +* no-delay-directory-restore: Directory Modification Times and Permissions. + (line 68) +* no-delay-directory-restore, summary: Option Summary. (line 407) +* no-ignore-case: controlling pattern-matching. + (line 86) +* no-ignore-case, summary: Option Summary. (line 413) +* no-ignore-command-error: Writing to an External Program. + (line 87) +* no-ignore-command-error, summary: Option Summary. (line 416) +* no-overwrite-dir, summary: Option Summary. (line 420) +* no-quote-chars, summary: Option Summary. (line 424) +* no-recursion: recurse. (line 13) +* no-recursion, summary: Option Summary. (line 429) +* no-same-owner: Attributes. (line 67) +* no-same-owner, summary: Option Summary. (line 433) +* no-same-permissions, summary: Option Summary. (line 439) +* no-unquote: Selecting Archive Members. + (line 42) +* no-unquote, summary: Option Summary. (line 444) +* no-wildcards: controlling pattern-matching. + (line 41) +* no-wildcards, summary: Option Summary. (line 448) +* no-wildcards-match-slash: controlling pattern-matching. + (line 92) +* no-wildcards-match-slash, summary: Option Summary. (line 451) +* null: nul. (line 11) +* null, summary: Option Summary. (line 454) +* numeric-owner: Attributes. (line 73) +* numeric-owner, summary: Option Summary. (line 460) +* occurrence, summary: Option Summary. (line 477) +* old-archive, summary: Option Summary. (line 491) +* one-file-system: one. (line 16) +* one-file-system, summary: Option Summary. (line 494) +* overwrite: Overwrite Old Files. (line 6) +* overwrite, introduced: Dealing with Old Files. + (line 22) +* overwrite, summary: Option Summary. (line 499) +* overwrite-dir: Overwrite Old Files. (line 28) +* overwrite-dir, introduced: Dealing with Old Files. + (line 6) +* overwrite-dir, summary: Option Summary. (line 503) +* owner: override. (line 57) +* owner, summary: Option Summary. (line 507) +* pax-option: PAX keywords. (line 6) +* pax-option, summary: Option Summary. (line 516) +* portability, summary: Option Summary. (line 522) +* posix, summary: Option Summary. (line 526) +* preserve: Attributes. (line 126) +* preserve, summary: Option Summary. (line 529) +* preserve-order: Same Order. (line 6) +* preserve-order, summary: Option Summary. (line 533) +* preserve-permissions: Setting Access Permissions. + (line 10) +* preserve-permissions, short description: Attributes. (line 113) +* preserve-permissions, summary: Option Summary. (line 536) +* quote-chars, summary: Option Summary. (line 546) +* quoting-style: quoting styles. (line 39) +* quoting-style, summary: Option Summary. (line 550) +* 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 557) +* record-size, summary: Option Summary. (line 562) +* recursion: recurse. (line 24) +* recursion, summary: Option Summary. (line 566) +* recursive-unlink: Recursive Unlink. (line 6) +* recursive-unlink, summary: Option Summary. (line 570) +* remove-files: remove files. (line 6) +* remove-files, summary: Option Summary. (line 575) +* restrict, summary: Option Summary. (line 579) +* rmt-command, summary: Option Summary. (line 584) +* rsh-command: Device. (line 73) +* rsh-command, summary: Option Summary. (line 588) +* same-order: Same Order. (line 6) +* same-order, summary: Option Summary. (line 592) +* same-owner: Attributes. (line 48) +* same-owner, summary: Option Summary. (line 600) +* same-permissions: Setting Access Permissions. + (line 10) +* same-permissions, short description: Attributes. (line 113) +* same-permissions, summary: Option Summary. (line 536) +* seek, summary: Option Summary. (line 609) +* show-defaults: defaults. (line 6) +* show-defaults, summary: Option Summary. (line 616) +* show-omitted-dirs: verbose. (line 107) +* show-omitted-dirs, summary: Option Summary. (line 625) +* show-stored-names: list. (line 60) +* show-stored-names, summary: Option Summary. (line 629) +* show-transformed-names: transform. (line 45) +* show-transformed-names, summary: Option Summary. (line 629) +* sparse: sparse. (line 22) +* sparse, summary: Option Summary. (line 637) +* sparse-version: sparse. (line 57) +* sparse-version, summary: Option Summary. (line 642) +* starting-file: Starting File. (line 6) +* starting-file, summary: Option Summary. (line 647) +* strip-components: transform. (line 25) +* strip-components, summary: Option Summary. (line 653) +* suffix: backup. (line 68) +* suffix, summary: Option Summary. (line 662) +* tape-length: Multi-Volume Archives. + (line 33) +* tape-length, short description: Device. (line 96) +* tape-length, summary: Option Summary. (line 668) +* test-label: label. (line 37) +* test-label, summary: Option Summary. (line 673) +* to-command: Writing to an External Program. + (line 9) +* to-command, summary: Option Summary. (line 677) +* to-stdout: Writing to Standard Output. + (line 14) +* to-stdout, summary: Option Summary. (line 681) +* totals: verbose. (line 46) +* totals, summary: Option Summary. (line 686) +* touch <1>: Attributes. (line 37) +* touch: Data Modification Times. + (line 15) +* touch, summary: Option Summary. (line 691) +* transform: transform. (line 74) +* transform, summary: Option Summary. (line 697) +* uncompress: gzip. (line 129) +* uncompress, summary: Option Summary. (line 151) +* ungzip: gzip. (line 88) +* ungzip, summary: Option Summary. (line 273) +* unlink-first: Unlink First. (line 6) +* unlink-first, introduced: Dealing with Old Files. + (line 42) +* unlink-first, summary: Option Summary. (line 716) +* unquote: Selecting Archive Members. + (line 39) +* unquote, summary: Option Summary. (line 722) +* update: update. (line 8) +* update, summary: Operation Summary. (line 50) +* usage: help. (line 53) +* use-compress-program: gzip. (line 134) +* use-compress-program, summary: Option Summary. (line 726) +* utc, summary: Option Summary. (line 730) +* verbose: verbose. (line 18) +* verbose, introduced: verbose tutorial. (line 6) +* verbose, summary: Option Summary. (line 734) +* 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 741) +* verify, using with --create: verify. (line 24) +* version: help. (line 6) +* version, summary: Option Summary. (line 746) +* volno-file: Multi-Volume Archives. + (line 71) +* volno-file, summary: Option Summary. (line 751) +* wildcards: controlling pattern-matching. + (line 38) +* wildcards, summary: Option Summary. (line 756) +* wildcards-match-slash: controlling pattern-matching. + (line 92) +* wildcards-match-slash, summary: Option Summary. (line 760) + + +File: tar.info, Node: Index, Prev: Index of Command Line Options, Up: Top + +Appendix I Index +**************** + +[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) +* bell, checkpoint action: checkpoints. (line 65) +* 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 115) +* 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) +* checkpoints, defined: checkpoints. (line 6) +* 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 107) +* corrupted archives: Full Dumps. (line 8) +* Creation of the archive: create. (line 8) +* CVS, excluding files: exclude. (line 39) +* 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) +* dereferencing hard links: hard links. (line 8) +* Descending directories, avoiding: recurse. (line 8) +* Device numbers, changing: Fixing Snapshot Files. + (line 6) +* Device numbers, using in incremental backups: Incremental Dumps. + (line 81) +* 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) +* dot, checkpoint action: checkpoints. (line 80) +* 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) +* echo, checkpoint action: checkpoints. (line 25) +* 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 125) +* Exabyte blocking: Blocking Factor. (line 204) +* exclude: exclude. (line 14) +* exclude-caches: exclude. (line 68) +* exclude-from: exclude. (line 27) +* exclude-tag: exclude. (line 91) +* 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) +* exec, checkpoint action: checkpoints. (line 96) +* 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 hard links: hard links. (line 8) +* 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 0, snapshot file: Snapshot Files. (line 23) +* format 1, snapshot file: Snapshot Files. (line 47) +* format 2, snapshot file: Snapshot Files. (line 69) +* 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) +* git, excluding files: exclude. (line 39) +* 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 146) +* gpg, using with tar: gzip. (line 146) +* hard links, dereferencing: hard links. (line 8) +* 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) +* RCS, excluding files: exclude. (line 39) +* 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) +* SCCS, excluding files: exclude. (line 39) +* short-opt-col: Configuring Help Summary. + (line 79) +* simple backup method: backup. (line 64) +* SIMPLE_BACKUP_SUFFIX: backup. (line 68) +* sleep, checkpoint action: checkpoints. (line 90) +* SLEEP_MESSAGE: General-Purpose Variables. + (line 111) +* SLEEP_TIME: General-Purpose Variables. + (line 97) +* Small memory: Scarce. (line 8) +* snapshot file, format 0: Snapshot Files. (line 23) +* snapshot file, format 1: Snapshot Files. (line 47) +* snapshot file, format 2: Snapshot Files. (line 69) +* snapshot files, editing: Fixing Snapshot Files. + (line 6) +* snapshot files, fixing device numbers: Fixing Snapshot Files. + (line 6) +* 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) +* SVN, excluding files: exclude. (line 39) +* 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-snapshot-edit: Fixing Snapshot Files. + (line 15) +* TAR_ARCHIVE, checkpoint script environment: checkpoints. (line 108) +* TAR_ARCHIVE, info script environment variable: Multi-Volume Archives. + (line 100) +* TAR_ATIME, to-command environment: Writing to an External Program. + (line 49) +* TAR_BLOCKING_FACTOR, checkpoint script environment: checkpoints. + (line 111) +* TAR_BLOCKING_FACTOR, info script environment variable: Multi-Volume Archives. + (line 103) +* TAR_CHECKPOINT, checkpoint script environment: checkpoints. (line 114) +* TAR_CTIME, to-command environment: Writing to an External Program. + (line 58) +* TAR_FD, info script environment variable: Multi-Volume Archives. + (line 117) +* 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, checkpoint script environment: checkpoints. (line 121) +* TAR_FORMAT, info script environment variable: Multi-Volume Archives. + (line 113) +* 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, checkpoint script environment: checkpoints. (line 117) +* TAR_SUBCOMMAND, info script environment variable: Multi-Volume Archives. + (line 109) +* 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, checkpoint script environment: checkpoints. (line 105) +* TAR_VERSION, info script environment variable: Multi-Volume Archives. + (line 97) +* TAR_VOLUME, info script environment variable: Multi-Volume Archives. + (line 106) +* 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) +* ttyout, checkpoint action: checkpoints. (line 70) +* 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 146) +* ustar archive format: ustar. (line 6) +* uuencode: Applications. (line 8) +* v7 archive format: old. (line 6) +* VCS, excluding files: exclude. (line 39) +* Verbose operation: verbose. (line 18) +* Verifying a write operation: verify. (line 6) +* Verifying the currency of an archive: compare. (line 6) +* version control system, excluding files: exclude. (line 39) +* 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..5898792 --- /dev/null +++ b/doc/tar.texi @@ -0,0 +1,11458 @@ +\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, 2008 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 have the freedom to +copy and modify this GNU manual. Buying copies from the FSF +supports it 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:: +* Fixing Snapshot Files:: +* 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:: +* checkpoints:: +* 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 + +* 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} + +Using Less Space through Compression + +* gzip:: Creating and Reading Compressed Archives +* sparse:: Archiving Sparse Files + +Making @command{tar} Archives More Portable + +* Portable Names:: Portable Names +* dereference:: Symbolic Links +* hard links:: Hard 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 + +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. + +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 @samp{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. 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 +@UNREVISED + +@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:: +* checkpoints:: +* 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{auto-compress} +@item --auto-compress +@itemx -a + +During a @option{--create} operation, enables automatic compressed +format recognition based on the archive suffix. @xref{gzip}. + +@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{check-device} +@item --check-device +Check device numbers when creating a list of modified files for +incremental archiving. This is the default. @xref{device numbers}, +for a detailed description. + +@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. You can also instruct +@command{tar} to execute a list of actions on each checkpoint, see +@option{--checklist-action} below. For a detailed description, see +@ref{checkpoints}. + +@opsummary{checkpoint-action} +@item --checkpoint-action=@var{action} +Instruct @command{tar} to execute an action upon hitting a +breakpoint. Here we give only a brief outline. @xref{checkpoints}, +for a complete description. + +The @var{action} argument can be one of the following: + +@table @asis +@item bell +Produce an audible bell on the console. + +@item dot +@itemx . +Print a single dot on the standard listing stream. + +@item echo +Display a textual message on the standard error, with the status and +number of the checkpoint. This is the default. + +@item echo=@var{string} +Display @var{string} on the standard error. Before output, the string +is subject to meta-character expansion. + +@item exec=@var{command} +Execute the given @var{command}. + +@item sleep=@var{time} +Wait for @var{time} seconds. + +@item ttyout=@var{string} +Output @var{string} on the current console (@file{/dev/tty}). +@end table + +Several @option{--checkpoint-action} options can be specified. The +supplied actions will be executed in order of their appearance in the +command line. + +Using @option{--checkpoint-action} without @option{--checkpoint} +assumes default checkpoint frequency of one checkpoint per 10 records. + +@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.}. + +@xref{hard links}. + +@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{exclude-vcs} +@item --exclude-vcs + +Exclude from dump directories and files, that are internal for some +widely used version control systems. + +@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{hard-dereference} +@item --hard-dereference +When creating an archive, dereference hard links and store the files +they refer to, instead of creating usual hard link members. + +@xref{hard links}. + +@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{lzma} +@item --lzma + +This option tells @command{tar} to read or write archives through +@command{lzma}. @xref{gzip}. + +@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-check-device} +@item --no-check-device +Do not check device numbers when creating a list of modified files +for incremental archiving. @xref{device numbers}, for +a detailed description. + +@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. + +@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) 2008 Free Software Foundation, Inc. +This is free software. You may redistribute copies of it under the terms +of the GNU General Public License . +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 +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@footnote{This is +actually a shortcut for @option{--checkpoint=@var{n} +--checkpoint-action=dot}. @xref{checkpoints, dot}.}. For example: + +@smallexample +$ @kbd{tar -c --checkpoint=.1000} /var +... +@end smallexample + +The @option{--checkpoint} option provides a flexible mechanism for +executing arbitrary actions upon hitting checkpoints, see the next +section (@pxref{checkpoints}), for more information on it. + +@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 checkpoints +@section Checkpoints +@cindex checkpoints, defined +@opindex checkpoint +@opindex checkpoint-action + +A @dfn{checkpoint} is a moment of time before writing @var{n}th record to +the archive (a @dfn{write checkpoint}), or before reading @var{n}th record +from the archive (a @dfn{read checkpoint}). Checkpoints allow to +periodically execute arbitrary actions. + +The checkpoint facility is enabled using the following option: + +@table @option +@xopindex{checkpoint, defined} +@item --checkpoint[=@var{n}] +Schedule checkpoints before writing or reading each @var{n}th record. +The default value for @var{n} is 10. +@end table + +A list of arbitrary @dfn{actions} can be executed at each checkpoint. +These actions include: pausing, displaying textual messages, and +executing arbitrary external programs. Actions are defined using +the @option{--checkpoint-action} option. + +@table @option +@xopindex{checkpoint-action, defined} +@item --checkpoint-action=@var{action} +Execute an @var{action} at each checkpoint. +@end table + +@cindex @code{echo}, checkpoint action +The simplest value of @var{action} is @samp{echo}. It instructs +@command{tar} to display the default message on the standard error +stream upon arriving at each checkpoint. The default message is (in +@acronym{POSIX} locale) @samp{Write checkpoint @var{n}}, for write +checkpoints, and @samp{Read checkpoint @var{n}}, for read checkpoints. +Here, @var{n} represents ordinal number of the checkpoint. + +In another locales, translated versions of this message are used. + +This is the default action, so running: + +@smallexample +$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=echo} /var +@end smallexample + +@noindent +is equivalent to: + +@smallexample +$ @kbd{tar -c --checkpoint=1000} /var +@end smallexample + +The @samp{echo} action also allows to supply a customized message. +You do so by placing an equals sign and the message right after it, +e.g.: + +@smallexample +--checkpoint-action="echo=Hit %s checkpoint #%u" +@end smallexample + +The @samp{%s} and @samp{%u} in the above example are +@dfn{meta-characters}. The @samp{%s} meta-character is replaced with +the @dfn{type} of the checkpoint: @samp{write} or +@samp{read} (or a corresponding translated version in locales other +than @acronym{POSIX}). The @samp{%u} meta-character is replaced with +the ordinal number of the checkpoint. Thus, the above example could +produce the following output when used with the @option{--create} +option: + +@smallexample +tar: Hit write checkpoint #10 +tar: Hit write checkpoint #20 +tar: Hit write checkpoint #30 +@end smallexample + +Aside from meta-character expansion, the message string is subject to +@dfn{unquoting}, during which the backslash @dfn{escape sequences} are +replaced with their corresponding @acronym{ASCII} characters +(@pxref{escape sequences}). E.g. the following action will produce an +audible bell and the message described above at each checkpoint: + +@smallexample +--checkpoint-action='echo=\aHit %s checkpoint #%u' +@end smallexample + +@cindex @code{bell}, checkpoint action +There is also a special action which produces an audible signal: +@samp{bell}. It is not equivalent to @samp{echo='\a'}, because +@samp{bell} sends the bell directly to the console (@file{/dev/tty}), +whereas @samp{echo='\a'} sends it to the standard error. + +@cindex @code{ttyout}, checkpoint action +The @samp{ttyout=@var{string}} action outputs @var{string} to +@file{/dev/tty}, so it can be used even if the standard output is +redirected elsewhere. The @var{string} is subject to the same +modifications as with @samp{echo} action. In contrast to the latter, +@samp{ttyout} does not prepend @command{tar} executable name to the +string, nor does it output a newline after it. For example, the +following action will print the checkpoint message at the same screen +line, overwriting any previous message: + +@smallexample +--checkpoint-action="ttyout=\rHit %s checkpoint #%u" +@end smallexample + +@cindex @code{dot}, checkpoint action +Another available checkpoint action is @samp{dot} (or @samp{.}). It +instructs @command{tar} to print a single dot on the standard listing +stream, e.g.: + +@smallexample +$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=dot} /var +... +@end smallexample + +For compatibility with previous @GNUTAR{} versions, this action can +be abbreviated by placing a dot in front of the checkpoint frequency, +as shown in the previous section. + +@cindex @code{sleep}, checkpoint action +Yet another action, @samp{sleep}, pauses @command{tar} for a specified +amount of seconds. The following example will stop for 30 seconds at each +checkpoint: + +@smallexample +$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=sleep=30} +@end smallexample + +@cindex @code{exec}, checkpoint action +Finally, the @code{exec} action executes a given external program. +For example: + +@smallexample +$ @kbd{tar -c --checkpoint=1000 --checkpoint-action=exec=/sbin/cpoint} +@end smallexample + +This program is executed using @command{/bin/sh -c}, with no +additional arguments. Its exit code is ignored. It gets a copy of +@command{tar}'s environment plus the following variables: + +@table @env +@vrindex TAR_VERSION, checkpoint script environment +@item TAR_VERSION +@GNUTAR{} version number. + +@vrindex TAR_ARCHIVE, checkpoint script environment +@item TAR_ARCHIVE +The name of the archive @command{tar} is processing. + +@vrindex TAR_BLOCKING_FACTOR, checkpoint script environment +@item TAR_BLOCKING_FACTOR +Current blocking factor (@pxref{Blocking}. + +@vrindex TAR_CHECKPOINT, checkpoint script environment +@item TAR_CHECKPOINT +The checkpoint number. + +@vrindex TAR_SUBCOMMAND, checkpoint script environment +@item TAR_SUBCOMMAND +A short option describing the operation @command{tar} is executing +@xref{Operations}, for a complete list of subcommand options. + +@vrindex TAR_FORMAT, checkpoint script environment +@item TAR_FORMAT +Format of the archive being processed. @xref{Formats}, for a complete +list of archive format names. +@end table + +Any number of actions can be defined, by supplying several +@option{--checkpoint-action} options in the command line. For +example, the command below displays two messages, pauses +execution for 30 seconds and executes the @file{/sbin/cpoint} script: + +@example +@group +$ @kbd{tar -c -f arc.tar \ + --checkpoint-action='\aecho=Hit %s checkpoint #%u' \ + --checkpoint-action='echo=Sleeping for 30 seconds' \ + --checkpoint-action='sleep=30' \ + --checkpoint-action='exec=/sbin/cpoint'} +@end group +@end example + +This example also illustrates the fact that +@option{--checkpoint-action} can be used without +@option{--checkpoint}. In this case, the default checkpoint frequency +(at each 10th record) is assumed. + +@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 @env +@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. + +@anchor{device numbers} +@cindex Device numbers, using in incremental backups +Metadata stored in snapshot files include device numbers, which, +obviously are supposed to be a non-volatile values. However, it turns +out that @acronym{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 @acronym{NFS} devices numbers over time. The solution implemented +currently is to considers all @acronym{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. + +Apart from using @acronym{NFS}, there are a number of cases where +relying on device numbers can cause spurious redumping of unmodified +files. For example, this occurs when archiving @acronym{LVM} snapshot +volumes. To avoid this, use @option{--no-check-device} option: + +@table @option +@xopindex{no-check-device, described} +@item --no-check-device +Do not rely on device numbers when preparing a list of changed files +for an incremental dump. + +@xopindex{check-device, described} +@item --check-device +Use device numbers when preparing a list of changed files +for an incremental dump. This is the default behavior. The purpose +of this option is to undo the effect of the @option{--no-check-device} +if it was given in @env{TAR_OPTIONS} environment variable +(@pxref{TAR_OPTIONS}). +@end table + +There is also another way to cope with changing device numbers. It is +described in detail in @ref{Fixing Snapshot Files}. + +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 @acronym{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. + +Notice, that lines from @var{file} are read verbatim. One of the +frequent errors is leaving some extra whitespace after a file name, +which is difficult to catch using text editors. + +However, empty lines are OK. + +@cindex version control system, excluding files +@cindex VCS, excluding files +@cindex SCCS, excluding files +@cindex RCS, excluding files +@cindex CVS, excluding files +@cindex SVN, excluding files +@cindex git, excluding files +@table @option +@opindex exclude-vcs +@item --exclude-vcs +Exclude files and directories used by some version control systems. +@end table + +As of version @value{VERSION}, the following files are excluded: + +@itemize @bullet +@item @file{CVS/}, and everything under it +@item @file{RCS/}, and everything under it +@item @file{SCCS/}, and everything under it +@item @file{.git/}, and everything under it +@item @file{.gitignore} +@item @file{.cvsignore} +@item @file{.svn/}, and everything under it +@item @file{.arch-ids/}, and everything under it +@item @file{@{arch@}/}, and everything under it +@item @file{=RELEASE-ID} +@item @file{=meta-update} +@item @file{=update} +@end itemize + +@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} options, each 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: +@anchor{escape sequences} +@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}. + +As in @command{sed}, you can give several replace expressions, +separated by a semicolon. + +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. + +You can use as many @option{--transform} options in a single command +line as you want. The specified expressions will then be applied in +order of their appearance. For example, the following two invocations +are equivalent: + +@smallexample +$ @kbd{tar -cf arch.tar --transform='s,/usr/var,/var/' \ + --transform='s,/usr/local,/usr/,'} +$ @kbd{tar -cf arch.tar \ + --transform='s,/usr/var,/var/;s,/usr/local,/usr/,'} +@end smallexample + +@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}, @command{bzip2} and @command{lzma} compression +programs. For backward compatibility, it also supports +@command{compress} command, although we strongly recommend against +using it, because it is by far less effective than other compression +programs@footnote{It also had patent problems in the past.}. + +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, +@option{--lzma} to create an @asis{LZMA} compressed archive and +@option{-Z} (@option{--compress}) to use @command{compress} program. +For example: + +@smallexample +$ @kbd{tar cfz archive.tar.gz .} +@end smallexample + +You can also let @GNUTAR{} select the compression program basing on +the suffix of the archive file name. This is done using +@option{--auto-compress} (@option{-a}) command line option. For +example, the following invocation will use @command{bzip2} for +compression: + +@smallexample +$ @kbd{tar cfa archive.tar.bz2 .} +@end smallexample + +@noindent +whereas the following one will use @command{lzma}: + +@smallexample +$ @kbd{tar cfa archive.tar.lzma .} +@end smallexample + +For a complete list of file name suffixes recognized by @GNUTAR{}, +@ref{auto-compress}. + +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 or +add (@option{--append} (@option{-r})) members to them. Likewise, you +cannot append another @command{tar} archive to a compressed archive using +@option{--concatenate} (@option{-A})). Secondly, multi-volume +archives cannot be compressed. + +The following table summarizes compression options used by @GNUTAR{}. + +@table @option +@anchor{auto-compress} +@opindex auto-compress +@item --auto-compress +@itemx -a +Select a compression program to use by the archive file name +suffix. The following suffixes are recognized: + +@multitable @columnfractions 0.3 0.6 +@headitem Suffix @tab Compression program +@item @samp{.gz} @tab @command{gzip} +@item @samp{.tgz} @tab @command{gzip} +@item @samp{.taz} @tab @command{gzip} +@item @samp{.Z} @tab @command{compress} +@item @samp{.taZ} @tab @command{compress} +@item @samp{.bz2} @tab @command{bzip2} +@item @samp{.tz2} @tab @command{bzip2} +@item @samp{.tbz2} @tab @command{bzip2} +@item @samp{.tbz} @tab @command{bzip2} +@item @samp{.lzma} @tab @command{lzma} +@item @samp{.tlz} @tab @command{lzma} +@end multitable + +@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 lzma +@item --lzma +Filter the archive through @command{lzma}. Otherwise like @option{--gzip}. + +@opindex compress +@opindex uncompress +@item -Z +@itemx --compress +@itemx --uncompress +Filter the archive through @command{compress}. Otherwise like @option{--gzip}. + +@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 +* hard links:: Hard 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 hard links +@subsection Hard Links +@UNREVISED{} +@cindex File names, using hard links +@cindex hard links, dereferencing +@cindex dereferencing hard links + +Normally, when @command{tar} archives a hard link, it writes a +block to the archive naming the target of the link (a @samp{1} type +block). In that way, the actual file contents is stored in file only +once. For example, consider the following two files: + +@smallexample +@group +$ ls +-rw-r--r-- 2 gray staff 4 2007-10-30 15:11 one +-rw-r--r-- 2 gray staff 4 2007-10-30 15:11 jeden +@end group +@end smallexample + +Here, @file{jeden} is a link to @file{one}. When archiving this +directory with a verbose level 2, you will get an output similar to +the following: + +@smallexample +$ tar cfvv ../archive.tar . +drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./ +-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden +hrw-r--r-- gray/staff 0 2007-10-30 15:11 ./one link to ./jeden +@end smallexample + +The last line shows that, instead of storing two copies of the file, +@command{tar} stored it only once, under the name @file{jeden}, and +stored file @file{one} as a hard link to this file. + +It may be important to know that all hard links to the given file are +stored in the archive. For example, this may be necessary for exact +reproduction of the file system. The following option does that: + +@table @option +@xopindex{check-links, described} +@item --check-links +@itemx -l +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, print +a warning message. +@end table + +For example, trying to archive only file @file{jeden} with this option +produces the following diagnostics: + +@smallexample +$ tar -c -f ../archive.tar jeden +tar: Missing links to `jeden'. +@end smallexample + +Although creating special records for hard links helps keep a faithful +record of the file system contents and makes archives more compact, it +may present some difficulties when extracting individual members from +the archive. For example, trying to extract file @file{one} from the +archive created in previous examples produces, in the absense of file +@file{jeden}: + +@smallexample +$ tar xf archive.tar ./one +tar: ./one: Cannot hard link to `./jeden': No such file or directory +tar: Error exit delayed from previous errors +@end smallexample + +The reason for this behavior is that @command{tar} cannot seek back in +the archive to the previous member (in this case, @file{one}), to +extract it@footnote{There are plans to fix this in future releases.}. +If you wish to avoid such problems at the cost of a bigger archive, +use the following option: + +@table @option +@xopindex{hard-dereference, described} +@item --hard-dereference +Dereference hard links and store the files they refer to. +@end table + +For example, trying this option on our two sample files, we get two +copies in the archive, each of which can then be extracted +independently of the other: + +@smallexample +@group +$ tar -c -vv -f ../archive.tar --hard-dereference . +drwxr-xr-x gray/staff 0 2007-10-30 15:13 ./ +-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./jeden +-rw-r--r-- gray/staff 4 2007-10-30 15:11 ./one +@end group +@end smallexample + +@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{}. + +@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_BLOCKING_FACTOR, info script environment variable +@item TAR_BLOCKING_FACTOR +Current blocking factor (@pxref{Blocking}. + +@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 +A 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 can 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 Fixing Snapshot Files +@appendix Fixing Snapshot Files +@include tar-snapshot-edit.texi + +@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..a070b11 --- /dev/null +++ b/doc/texify.sed @@ -0,0 +1,26 @@ +# Copyright (C) 2006, 2007 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 3, 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/untabify.el b/doc/untabify.el new file mode 100644 index 0000000..77dd5c0 --- /dev/null +++ b/doc/untabify.el @@ -0,0 +1,13 @@ +;;;; Untabify the sources. +;;;; Usage: emacs -batch -l untabify.el [file ...] + +(defun global-untabify (buflist) + (mapcar + (lambda (bufname) + (set-buffer (find-file bufname)) + (untabify (point-min) (point-max)) + (save-buffer) + (kill-buffer (current-buffer))) + buflist)) + +(global-untabify command-line-args-left) 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..580b586 --- /dev/null +++ b/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 14 April 2008 +@set UPDATED-MONTH April 2008 +@set EDITION 1.20 +@set VERSION 1.20 diff --git a/lib/Makefile.am b/lib/Makefile.am new file mode 100644 index 0000000..466a477 --- /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, 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 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have 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..1dbc635 --- /dev/null +++ b/lib/Makefile.in @@ -0,0 +1,1630 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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, 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 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have 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) 2002-2008 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 --no-libtool --macro-prefix=gl alloca argmatch argp backupfile closeout configmake dirname error exclude exitfail fileblocks fnmatch-gnu fseeko 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 snprintf 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@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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__dirstamp = $(am__leading_dot)dirstamp +am_libtar_a_OBJECTS = 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) \ + malloca.$(OBJEXT) mbchar.$(OBJEXT) mbscasecmp.$(OBJEXT) \ + openat-die.$(OBJEXT) strnlen1.$(OBJEXT) \ + uniwidth/width.$(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.@am__isrc@ -I$(top_builddir) +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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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 subdir-objects +noinst_HEADERS = system.h system-ioctl.h rmt.h paxlib.h stdopen.h +noinst_LIBRARIES = libtar.a +noinst_LTLIBRARIES = + +# 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 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 +EXTRA_DIST = alloca.c alloca.in.h 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.in.h \ + fchdir.c fcntl.in.h creat-safer.c fcntl--.h fcntl-safer.h \ + open-safer.c fileblocks.c float.in.h fnmatch.c fnmatch.in.h \ + fnmatch_loop.c fpending.c fpending.h fseeko.c ftruncate.c \ + getcwd.c getdate.c getdate.h getdelim.c getline.c getopt.c \ + getopt.in.h getopt1.c getopt_int.h getpagesize.c \ + $(top_srcdir)/build-aux/config.rpath gettime.c gettimeofday.c \ + hash.c hash.h $(top_srcdir)/build-aux/config.rpath human.c \ + human.h intprops.h imaxtostr.c inttostr.c inttostr.h \ + offtostr.c uinttostr.c umaxtostr.c inttypes.in.h lchown.c \ + $(top_srcdir)/build-aux/link-warning.h config.charset \ + ref-add.sin ref-del.sin lseek.c lstat.c lstat.h malloc.c \ + malloc.c malloca.h malloca.valgrind 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 realloc.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 sleep.c \ + snprintf.c stat-macros.h stat-time.h stdarg.in.h stdbool.in.h \ + stdint.in.h stdio.in.h stdlib.in.h stpcpy.c strcasecmp.c \ + strncasecmp.c strchrnul.c strdup.c streq.h strerror.c \ + string.in.h strings.in.h strndup.c strnlen.c strtoimax.c \ + strtol.c strtoll.c strtoul.c strtoull.c strtoumax.c \ + sys_stat.in.h sys_time.in.h sysexits.in.h tempname.c \ + tempname.h time.in.h time_r.c timespec.h unistd.in.h \ + dup-safer.c fd-safer.c pipe-safer.c unistd--.h unistd-safer.h \ + unitypes.h localcharset.h uniwidth.h uniwidth/cjk.h \ + unlinkdir.c unlinkdir.h unlocked-io.h unsetenv.c 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.in.h wctype.in.h wcwidth.c \ + xalloc.h xmalloc.c xgetcwd.c xgetcwd.h xstrtol-error.c \ + 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) \ + $(STDARG_H) $(STDBOOL_H) $(STDINT_H) stdio.h stdlib.h string.h \ + strings.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 \ + stdarg.h stdarg.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 \ + strings.h strings.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 = +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 \ + full-write.h full-write.c getdate.y gettext.h localcharset.h \ + localcharset.c malloca.c mbchar.c mbscasecmp.c mbuiter.h \ + openat-die.c strnlen1.h strnlen1.c uniwidth/width.c verify.h \ + version-etc.h version-etc.c version-etc-fsf.c xalloc-die.c \ + xsize.h 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 fseeko.c ftruncate.c getcwd.c \ + getdelim.c getline.c getopt.c getopt1.c getpagesize.c \ + gettime.c gettimeofday.c hash.c human.c imaxtostr.c inttostr.c \ + offtostr.c uinttostr.c umaxtostr.c lchown.c lseek.c lstat.c \ + malloc.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 realloc.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 sleep.c snprintf.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 unsetenv.c \ + utime.c utimens.c asnprintf.c printf-args.c printf-parse.c \ + vasnprintf.c vsnprintf.c wcwidth.c xmalloc.c xgetcwd.c \ + xstrtol-error.c xstrtol.c xstrtoul.c +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) +uniwidth/$(am__dirstamp): + @$(MKDIR_P) uniwidth + @: > uniwidth/$(am__dirstamp) +uniwidth/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) uniwidth/$(DEPDIR) + @: > uniwidth/$(DEPDIR)/$(am__dirstamp) +uniwidth/width.$(OBJEXT): uniwidth/$(am__dirstamp) \ + uniwidth/$(DEPDIR)/$(am__dirstamp) +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) + -rm -f uniwidth/width.$(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)/alloca.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)/fpending.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseeko.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)/getpagesize.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)/lseek.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)/malloca.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)/realloc.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)/snprintf.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)/wcwidth.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-error.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@ +@AMDEP_TRUE@@am__include@ @am__quote@uniwidth/$(DEPDIR)/width.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.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 -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.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 -o $@ `$(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; nonemtpy = 1; } \ + END { if (nonempty) { 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; nonempty = 1; } \ + END { if (nonempty) { 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=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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) + -rm -f uniwidth/$(DEPDIR)/$(am__dirstamp) + -rm -f uniwidth/$(am__dirstamp) + -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) uniwidth/$(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) uniwidth/$(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 when the system +# doesn't have one that works with the given compiler. +alloca.h: alloca.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/alloca.in.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 when the system +# doesn't have one that works with the given compiler. +dirent.h: dirent.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \ + -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ + < $(srcdir)/dirent.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +fcntl.h: fcntl.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ + -e 's|@''GNULIB_OPEN''@|$(GNULIB_OPEN)|g' \ + -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ + < $(srcdir)/fcntl.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +float.h: float.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ + < $(srcdir)/float.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that supports the required API. +fnmatch.h: fnmatch.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/fnmatch.in.h; \ + } > $@-t + mv -f $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +getopt.h: getopt.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/getopt.in.h; \ + } > $@-t + mv -f $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +inttypes.h: inttypes.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|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 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \ + -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \ + -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \ + -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/inttypes.in.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 when the system +# doesn't have one that works with the given compiler. +stdarg.h: stdarg.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ + < $(srcdir)/stdarg.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works. +stdbool.h: stdbool.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdint.h: stdint.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ + -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ + -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ + -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ + -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ + -e 's/@''HAVE_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.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdio.h: stdio.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|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_FOPEN''@|$(GNULIB_FOPEN)|g' \ + -e 's|@''GNULIB_FREOPEN''@|$(GNULIB_FREOPEN)|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|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \ + -e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|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_FOPEN''@|$(REPLACE_FOPEN)|g' \ + -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|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 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ + -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ + -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/stdio.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdlib.h: stdlib.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ + -e 's|@''GNULIB_MALLOC_POSIX''@|$(GNULIB_MALLOC_POSIX)|g' \ + -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \ + -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ + -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \ + -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \ + -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \ + -e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \ + -e 's|@''GNULIB_SETENV''@|$(GNULIB_SETENV)|g' \ + -e 's|@''GNULIB_STRTOD''@|$(GNULIB_STRTOD)|g' \ + -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \ + -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \ + -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ + -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \ + -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ + -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \ + -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \ + -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ + -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \ + -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ + -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ + -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ + -e 's|@''VOID_UNSETENV''@|$(VOID_UNSETENV)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/stdlib.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +string.h: string.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ + -e 's|@''GNULIB_MBSLEN''@|$(GNULIB_MBSLEN)|g' \ + -e 's|@''GNULIB_MBSNLEN''@|$(GNULIB_MBSNLEN)|g' \ + -e 's|@''GNULIB_MBSCHR''@|$(GNULIB_MBSCHR)|g' \ + -e 's|@''GNULIB_MBSRCHR''@|$(GNULIB_MBSRCHR)|g' \ + -e 's|@''GNULIB_MBSSTR''@|$(GNULIB_MBSSTR)|g' \ + -e 's|@''GNULIB_MBSCASECMP''@|$(GNULIB_MBSCASECMP)|g' \ + -e 's|@''GNULIB_MBSNCASECMP''@|$(GNULIB_MBSNCASECMP)|g' \ + -e 's|@''GNULIB_MBSPCASECMP''@|$(GNULIB_MBSPCASECMP)|g' \ + -e 's|@''GNULIB_MBSCASESTR''@|$(GNULIB_MBSCASESTR)|g' \ + -e 's|@''GNULIB_MBSCSPN''@|$(GNULIB_MBSCSPN)|g' \ + -e 's|@''GNULIB_MBSPBRK''@|$(GNULIB_MBSPBRK)|g' \ + -e 's|@''GNULIB_MBSSPN''@|$(GNULIB_MBSSPN)|g' \ + -e 's|@''GNULIB_MBSSEP''@|$(GNULIB_MBSSEP)|g' \ + -e 's|@''GNULIB_MBSTOK_R''@|$(GNULIB_MBSTOK_R)|g' \ + -e 's|@''GNULIB_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_STRSTR''@|$(GNULIB_STRSTR)|g' \ + -e 's|@''GNULIB_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \ + -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|g' \ + -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \ + -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|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_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 's|@''HAVE_DECL_STRERROR''@|$(HAVE_DECL_STRERROR)|g' \ + -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ + -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ + -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ + -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ + -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ + -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/string.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +strings.h: strings.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ + -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ + -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/strings.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# has one that is incomplete. +sys/stat.h: sys_stat.in.h + @MKDIR_P@ sys + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|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.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +sys/time.h: sys_time.in.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/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ + -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ + -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ + < $(srcdir)/sys_time.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +sysexits.h: sysexits.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''HAVE_SYSEXITS_H''@|$(HAVE_SYSEXITS_H)|g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYSEXITS_H''@|$(NEXT_SYSEXITS_H)|g' \ + < $(srcdir)/sysexits.in.h; \ + } > $@-t + mv -f $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +time.h: time.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@NEXT_TIME_H''@|$(NEXT_TIME_H)|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.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create an empty placeholder for +# when the system doesn't have one. +unistd.h: unistd.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ + -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \ + -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \ + -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|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_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \ + -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|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_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ + -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ + -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ + -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ + -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ + -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ + -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|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_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ + -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ + -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ + < $(srcdir)/unistd.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# version does not work standalone. +wchar.h: wchar.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ + -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ + -e 's|@''GNULIB_WCWIDTH''@|$(GNULIB_WCWIDTH)|g' \ + -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ + -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/wchar.in.h; \ + } > $@-t + mv $@-t $@ + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +wctype.h: wctype.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ + -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ + -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ + < $(srcdir)/wctype.in.h; \ + } > $@-t + mv $@-t $@ + +mostlyclean-local: mostlyclean-generic + @for dir in '' $(MOSTLYCLEANDIRS); do \ + if test -n "$$dir" && test -d $$dir; then \ + echo "rmdir $$dir"; rmdir $$dir; \ + fi; \ + done; \ + : + +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/alloca.c b/lib/alloca.c new file mode 100644 index 0000000..0af8467 --- /dev/null +++ b/lib/alloca.c @@ -0,0 +1,491 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 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 + +#include + +#include +#include + +#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 +# 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 3 */ diff --git a/lib/alloca.in.h b/lib/alloca.in.h new file mode 100644 index 0000000..c65b4de --- /dev/null +++ b/lib/alloca.in.h @@ -0,0 +1,58 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Memory allocation on the stack. + + Copyright (C) 1995, 1999, 2001-2004, 2006-2008 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, 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 +# define alloca _alloca +# elif defined __DECC && defined __VMS +# define alloca __ALLOCA +# else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +# endif +#endif + +#endif /* _GL_ALLOCA_H */ diff --git a/lib/argmatch.c b/lib/argmatch.c new file mode 100644 index 0000000..925449b --- /dev/null +++ b/lib/argmatch.c @@ -0,0 +1,277 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#include + +/* Specification. */ +#include "argmatch.h" + +#include +#include +#include +#include + +#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 + */ +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..cc40314 --- /dev/null +++ b/lib/argmatch.h @@ -0,0 +1,102 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#ifndef ARGMATCH_H_ +# define ARGMATCH_H_ 1 + +# include + +# 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..3e8bb96 --- /dev/null +++ b/lib/argp-ba.c @@ -0,0 +1,24 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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..0a81c27 --- /dev/null +++ b/lib/argp-eexst.c @@ -0,0 +1,30 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#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 + . */ +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..c89a99c --- /dev/null +++ b/lib/argp-fmtstream.c @@ -0,0 +1,434 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* This package emulates glibc `line_wrap_stream' semantics for systems that + don't have that. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#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 +# include +# 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..1cd6eac --- /dev/null +++ b/lib/argp-fmtstream.h @@ -0,0 +1,325 @@ +/* Word-wrapping and line-truncating streams. + Copyright (C) 1997, 2006-2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 +#include +#include + +#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 +/* 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 + +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))); + +#if _LIBC || !defined __OPTIMIZE__ +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); +#endif + +/* 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 + +#if _LIBC || !defined __OPTIMIZE__ +/* 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); +#endif + +/* 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 +# ifdef __GNUC__ + /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, unless -fgnu89-inline is used. It defines a macro + __GNUC_STDC_INLINE__ to indicate this situation or a macro + __GNUC_GNU_INLINE__ to indicate the opposite situation. + GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline + semantics but warns, unless -fgnu89-inline is used: + warning: C99 inline functions are not supported; using GNU89 + warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute + It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ +# if defined __GNUC_STDC_INLINE__ +# define ARGP_FS_EI inline +# elif defined __GNUC_GNU_INLINE__ +# define ARGP_FS_EI extern inline __attribute__ ((__gnu_inline__)) +# else +# define ARGP_FS_EI extern inline +# endif +# else + /* With other compilers, assume the ISO C99 meaning of 'inline', if + the compiler supports 'inline' at all. */ +# define ARGP_FS_EI inline +# endif +#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..af4f085 --- /dev/null +++ b/lib/argp-fs-xinl.c @@ -0,0 +1,42 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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..4c0ca60 --- /dev/null +++ b/lib/argp-help.c @@ -0,0 +1,1953 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef USE_IN_LIBIO +# include +#endif + +#ifdef _LIBC +# include +# 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 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..fcb082a --- /dev/null +++ b/lib/argp-namefrob.h @@ -0,0 +1,157 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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..d86256a --- /dev/null +++ b/lib/argp-parse.c @@ -0,0 +1,952 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _LIBC +# include +# 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..6707b0d --- /dev/null +++ b/lib/argp-pin.c @@ -0,0 +1,27 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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..411f6ed --- /dev/null +++ b/lib/argp-pv.c @@ -0,0 +1,23 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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..2ba037b --- /dev/null +++ b/lib/argp-pvh.c @@ -0,0 +1,30 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#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..0904e9d --- /dev/null +++ b/lib/argp-xinl.c @@ -0,0 +1,42 @@ +/* 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 . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if defined _LIBC || defined HAVE_FEATURES_H +# include +#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..90c4528 --- /dev/null +++ b/lib/argp.h @@ -0,0 +1,646 @@ +/* Hierarchial argument parsing, layered over getopt. + Copyright (C) 1995-1999,2003-2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Miles Bader . + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _ARGP_H +#define _ARGP_H + +#include +#include +#include +#include + +#define __need_error_t +#include + +#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) +# 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 + . */ +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); + +#if _LIBC || !defined __USE_EXTERN_INLINES +/* 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); +#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). */ +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))); + +#if _LIBC || !defined __USE_EXTERN_INLINES +/* 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; +#endif + +/* 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 +# ifdef __GNUC__ + /* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, unless -fgnu89-inline is used. It defines a macro + __GNUC_STDC_INLINE__ to indicate this situation or a macro + __GNUC_GNU_INLINE__ to indicate the opposite situation. + GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline + semantics but warns, unless -fgnu89-inline is used: + warning: C99 inline functions are not supported; using GNU89 + warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute + It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. */ +# if defined __GNUC_STDC_INLINE__ +# define ARGP_EI __inline__ +# elif defined __GNUC_GNU_INLINE__ +# define ARGP_EI extern __inline__ __attribute__ ((__gnu_inline__)) +# else +# define ARGP_EI extern __inline__ +# endif +# else + /* With other compilers, assume the ISO C99 meaning of 'inline', if + the compiler supports 'inline' at all. */ +# define ARGP_EI inline +# endif +# 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..754a271 --- /dev/null +++ b/lib/asnprintf.c @@ -0,0 +1,37 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include "vasnprintf.h" + +#include + +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..c7963fe --- /dev/null +++ b/lib/at-func.c @@ -0,0 +1,85 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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..1420edd --- /dev/null +++ b/lib/backupfile.c @@ -0,0 +1,362 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and David MacKenzie. + Some algorithms adapted from GNU Emacs. */ + +#include + +#include "backupfile.h" + +#include "argmatch.h" +#include "dirname.h" +#include "xalloc.h" + +#include +#include +#include +#include + +#include + +#include + +#include +#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..3cfdd8c --- /dev/null +++ b/lib/backupfile.h @@ -0,0 +1,59 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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..426ed40 --- /dev/null +++ b/lib/basename.c @@ -0,0 +1,128 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include +#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..80bef72 --- /dev/null +++ b/lib/canonicalize-lgpl.c @@ -0,0 +1,362 @@ +/* Return the canonical absolute name of a given file. + Copyright (C) 1996-2003, 2005-2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Avoid a clash of our rpl_realpath() function with the prototype in + on Solaris 2.5.1. */ +#undef realpath + +#if !HAVE_CANONICALIZE_FILE_NAME || defined _LIBC + +#include + +/* Specification. */ +#include "canonicalize.h" + +#include +#include +#include + +#if HAVE_UNISTD_H || defined _LIBC +# include +#endif + +#include + +#if HAVE_SYS_PARAM_H || defined _LIBC +# include +#endif +#ifndef MAXSYMLINKS +# define MAXSYMLINKS 20 +#endif + +#include + +#include +#ifndef _LIBC +# define __set_errno(e) errno = (e) +# ifndef ENAMETOOLONG +# define ENAMETOOLONG EINVAL +# endif +#endif + +#ifdef _LIBC +# include +#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 "malloca.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_ISLNK && !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) + { + /* It's easier to set errno to ENOMEM than to rely on the + 'malloc-posix' gnulib module. */ + errno = ENOMEM; + 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) + { + /* It's easier to set errno to ENOMEM than to rely on the + 'realloc-posix' gnulib module. */ + errno = ENOMEM; + 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 = malloca (path_max); + if (!buf) + { + errno = ENOMEM; + goto error; + } + + n = __readlink (rpath, buf, path_max); + if (n < 0) + { + int saved_errno = errno; + freea (buf); + errno = saved_errno; + goto error; + } + buf[n] = '\0'; + + if (!extra_buf) + { + extra_buf = malloca (path_max); + if (!extra_buf) + { + freea (buf); + errno = ENOMEM; + goto error; + } + } + + len = strlen (end); + if ((long int) (n + len) >= path_max) + { + freea (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) + freea (extra_buf); + + return resolved ? memcpy (resolved, rpath, dest - rpath + 1) : rpath; + +error: + { + int saved_errno = errno; + if (extra_buf) + freea (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..8ca4fb4 --- /dev/null +++ b/lib/canonicalize.h @@ -0,0 +1,52 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 +# 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..aeae252 --- /dev/null +++ b/lib/chdir-long.c @@ -0,0 +1,264 @@ +/* provide a chdir function that tries not to fail due to ENAMETOOLONG + Copyright (C) 2004, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "chdir-long.h" + +#include +#include +#include +#include +#include +#include +#include + +#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 +# 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..5bf0bbc --- /dev/null +++ b/lib/chdir-long.h @@ -0,0 +1,34 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include +#include + +#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..3582b04 --- /dev/null +++ b/lib/chown.c @@ -0,0 +1,103 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +/* 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..e2c3ac0 --- /dev/null +++ b/lib/close-stream.c @@ -0,0 +1,75 @@ +/* Close a stream, with nicer error checking than fclose's. + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "close-stream.h" + +#include +#include + +#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 +int close_stream (FILE *stream); diff --git a/lib/closeout.c b/lib/closeout.c new file mode 100644 index 0000000..69ddb8b --- /dev/null +++ b/lib/closeout.c @@ -0,0 +1,85 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "closeout.h" + +#include +#include +#include + +#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..fa7adc3 --- /dev/null +++ b/lib/closeout.h @@ -0,0 +1,32 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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..c233788 --- /dev/null +++ b/lib/config.charset @@ -0,0 +1,649 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-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 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, 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 openbsd darwin +# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin +# ISO-8859-3 Y glibc solaris +# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin +# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin +# ISO-8859-6 Y glibc aix hpux solaris +# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd 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 openbsd darwin +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin +# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin +# KOI8-U Y glibc freebsd netbsd openbsd 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 openbsd 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 openbsd 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" + ;; + openbsd*) + 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" + ;; + 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 " + echo "# and Bruno Haible ." + 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..fc314ba --- /dev/null +++ b/lib/creat-safer.c @@ -0,0 +1,31 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "fcntl-safer.h" + +#include +#include "unistd-safer.h" + +int +creat_safer (char const *file, mode_t mode) +{ + return fd_safer (creat (file, mode)); +} diff --git a/lib/dirent.in.h b/lib/dirent.in.h new file mode 100644 index 0000000..db3de95 --- /dev/null +++ b/lib/dirent.in.h @@ -0,0 +1,45 @@ +/* Wrapper around . + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GL_DIRENT_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_DIRENT_H@ + +#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..18f5154 --- /dev/null +++ b/lib/dirfd.c @@ -0,0 +1,28 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#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..2c2b21d --- /dev/null +++ b/lib/dirfd.h @@ -0,0 +1,28 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#include + +#include + +#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..c27e5b5 --- /dev/null +++ b/lib/dirname.c @@ -0,0 +1,84 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "dirname.h" + +#include +#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..f592350 --- /dev/null +++ b/lib/dirname.h @@ -0,0 +1,69 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# include +# include + +# 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..a690851 --- /dev/null +++ b/lib/dup-safer.c @@ -0,0 +1,44 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "unistd-safer.h" + +#include + +#include +#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..0999082 --- /dev/null +++ b/lib/dup2.c @@ -0,0 +1,57 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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..3177bd5 --- /dev/null +++ b/lib/error.c @@ -0,0 +1,338 @@ +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000-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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#if !_LIBC +# include +#endif + +#include "error.h" + +#include +#include +#include +#include + +#if !_LIBC && ENABLE_NLS +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#ifdef _LIBC +# include +# include +# include +# include +# 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 +# include +# include + +/* 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 +# define fflush(s) INTUSE(_IO_fflush) (s) +# undef putc +# define putc(c, fp) INTUSE(_IO_putc) (c, fp) + +# include + +#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..6d49681 --- /dev/null +++ b/lib/error.h @@ -0,0 +1,65 @@ +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997, 2003, 2006, 2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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) +# 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..f38abf2 --- /dev/null +++ b/lib/exclude.c @@ -0,0 +1,273 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#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..7d03bc1 --- /dev/null +++ b/lib/exclude.h @@ -0,0 +1,42 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +/* 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..6d1fe4a --- /dev/null +++ b/lib/exitfail.c @@ -0,0 +1,24 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "exitfail.h" + +#include + +int volatile exit_failure = EXIT_FAILURE; diff --git a/lib/exitfail.h b/lib/exitfail.h new file mode 100644 index 0000000..713f259 --- /dev/null +++ b/lib/exitfail.h @@ -0,0 +1,18 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +extern int volatile exit_failure; diff --git a/lib/fchdir.c b/lib/fchdir.c new file mode 100644 index 0000000..246987c --- /dev/null +++ b/lib/fchdir.c @@ -0,0 +1,282 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +rpl_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 +rpl_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); + } +#if defined GNULIB_OPEN && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) + if (strcmp (filename, "/dev/null") == 0) + filename = "NUL"; +#endif + 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 +rpl_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 * +rpl_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 +rpl_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 +rpl_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..935bdcb --- /dev/null +++ b/lib/fchmodat.c @@ -0,0 +1,49 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#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 + +#include +#include + +/* 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..a1d5e60 --- /dev/null +++ b/lib/fchownat.c @@ -0,0 +1,48 @@ +/* This function serves as replacement for a missing fchownat function, + as well as a work around for the fchownat bug in glibc-2.4: + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "openat.h" + +#include + +#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ +#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..5a6a879 --- /dev/null +++ b/lib/fcntl--.h @@ -0,0 +1,27 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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..99f3865 --- /dev/null +++ b/lib/fcntl-safer.h @@ -0,0 +1,23 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +int open_safer (char const *, int, ...); +int creat_safer (char const *, mode_t); diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h new file mode 100644 index 0000000..066a26c --- /dev/null +++ b/lib/fcntl.in.h @@ -0,0 +1,120 @@ +/* Like , 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Paul Eggert */ + +#ifndef _GL_FCNTL_H + +#include +#include +#include +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_FCNTL_H@ + +#ifndef _GL_FCNTL_H +#define _GL_FCNTL_H + + +/* Declare overridden functions. */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if (@GNULIB_OPEN@ && @REPLACE_OPEN@) || defined FCHDIR_REPLACEMENT +# define open rpl_open +extern int open (const char *filename, int flags, ...); +#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..df38c8f --- /dev/null +++ b/lib/fd-safer.c @@ -0,0 +1,56 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "unistd-safer.h" + +#include + +#include +#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..822935a --- /dev/null +++ b/lib/fileblocks.c @@ -0,0 +1,74 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Brian L. Matthews, blm@6sceng.UUCP. */ + +#include + +#include + +#if HAVE_SYS_PARAM_H +# include +#endif + +#if !HAVE_STRUCT_STAT_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE + +# include + +# 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..e78f175 --- /dev/null +++ b/lib/float+.h @@ -0,0 +1,150 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Supplemental information about the floating-point formats. + Copyright (C) 2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2007. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _FLOATPLUS_H +#define _FLOATPLUS_H + +#include +#include + +/* 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.in.h b/lib/float.in.h new file mode 100644 index 0000000..2504032 --- /dev/null +++ b/lib/float.in.h @@ -0,0 +1,58 @@ +/* A correct . + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _GL_FLOAT_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_FLOAT_H@ + +#ifndef _GL_FLOAT_H +#define _GL_FLOAT_H + +/* 'long double' properties. */ +#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__) +/* Number of mantissa units, in base FLT_RADIX. */ +# undef LDBL_MANT_DIG +# define LDBL_MANT_DIG 64 +/* Number of decimal digits that is sufficient for representing a number. */ +# undef LDBL_DIG +# define LDBL_DIG 18 +/* x-1 where x is the smallest representable number > 1. */ +# undef LDBL_EPSILON +# define LDBL_EPSILON 1.0842021724855044340E-19L +/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */ +# undef LDBL_MIN_EXP +# define LDBL_MIN_EXP (-16381) +/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */ +# undef LDBL_MAX_EXP +# define LDBL_MAX_EXP 16384 +/* Minimum positive normalized number. */ +# undef LDBL_MIN +# define LDBL_MIN 3.3621031431120935063E-4932L +/* Maximum representable finite number. */ +# undef LDBL_MAX +# define LDBL_MAX 1.1897314953572317650E+4932L +/* Minimum e such that 10^e is in the range of normalized numbers. */ +# undef LDBL_MIN_10_EXP +# define LDBL_MIN_10_EXP (-4931) +/* Maximum e such that 10^e is in the range of representable finite numbers. */ +# undef LDBL_MAX_10_EXP +# define LDBL_MAX_10_EXP 4932 +#endif + +#endif /* _GL_FLOAT_H */ +#endif /* _GL_FLOAT_H */ diff --git a/lib/fnmatch.c b/lib/fnmatch.c new file mode 100644 index 0000000..9ae77ec --- /dev/null +++ b/lib/fnmatch.c @@ -0,0 +1,356 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _LIBC +# include +#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 + +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +# include +#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 + +# 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_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.in.h b/lib/fnmatch.in.h new file mode 100644 index 0000000..1f9e447 --- /dev/null +++ b/lib/fnmatch.in.h @@ -0,0 +1,67 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 . */ +#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..acdf5a6 --- /dev/null +++ b/lib/fnmatch_loop.c @@ -0,0 +1,1212 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 +# else +# include +# 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/fpending.c b/lib/fpending.c new file mode 100644 index 0000000..9250d6a --- /dev/null +++ b/lib/fpending.c @@ -0,0 +1,29 @@ +/* fpending.c -- return the number of pending output bytes on a stream + Copyright (C) 2000, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#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..c6a493d --- /dev/null +++ b/lib/fpending.h @@ -0,0 +1,33 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Written by Jim Meyering. */ + +#include +#include + +#ifndef HAVE_DECL___FPENDING +"this configure-time declaration test was not run" +#endif + +#if HAVE_DECL___FPENDING +# if HAVE_STDIO_EXT_H +# include +# endif +#else +size_t __fpending (FILE *); +#endif diff --git a/lib/fseeko.c b/lib/fseeko.c new file mode 100644 index 0000000..7252208 --- /dev/null +++ b/lib/fseeko.c @@ -0,0 +1,133 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* An fseeko() function that, together with fflush(), is POSIX compliant. + Copyright (C) 2007-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +/* Get off_t and lseek. */ +#include + +#undef fseeko +#if !HAVE_FSEEKO +# undef fseek +# define fseeko fseek +#endif + +int +rpl_fseeko (FILE *fp, off_t offset, int whence) +{ +#if LSEEK_PIPE_BROKEN + /* mingw gives bogus answers rather than failure on non-seekable files. */ + if (lseek (fileno (fp), 0, SEEK_CUR) == -1) + return EOF; +#endif + + /* These tests are based on fpurge.c. */ +#if defined _IO_ferror_unlocked /* GNU libc, BeOS */ + if (fp->_IO_read_end == fp->_IO_read_ptr + && fp->_IO_write_ptr == fp->_IO_write_base + && fp->_IO_save_base == NULL) +#elif defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ +# if defined __NetBSD__ || defined __OpenBSD__ /* NetBSD, OpenBSD */ + /* See + and */ +# define fp_ub ((struct { struct __sbuf _ub; } *) fp->_ext._base)->_ub +# else /* FreeBSD, MacOS X, Cygwin */ +# define fp_ub fp->_ub +# endif +# if defined __SL64 && defined __SCLE /* Cygwin */ + if ((fp->_flags & __SL64) == 0) + { + /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit + mode; but has an fseeko that requires 64-bit mode. */ + FILE *tmp = fopen ("/dev/null", "r"); + if (!tmp) + return -1; + fp->_flags |= __SL64; + fp->_seek64 = tmp->_seek64; + fclose (tmp); + } +# endif + if (fp->_p == fp->_bf._base + && fp->_r == 0 + && fp->_w == ((fp->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */ + ? fp->_bf._size + : 0) + && fp_ub._base == NULL) +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */ +# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */ +# define fp_ ((struct { unsigned char *_ptr; \ + unsigned char *_base; \ + unsigned char *_end; \ + long _cnt; \ + int _file; \ + unsigned int _flag; \ + } *) fp) + if (fp_->_ptr == fp_->_base + && (fp_->_ptr == NULL || fp_->_cnt == 0)) +# else +# if defined _SCO_DS /* OpenServer */ +# define _base __base +# define _ptr __ptr +# define _cnt __cnt +# endif + if (fp->_ptr == fp->_base + && (fp->_ptr == NULL || fp->_cnt == 0)) +# endif +#elif defined __UCLIBC__ /* uClibc */ + if (((fp->__modeflags & __FLAG_WRITING) == 0 + || fp->__bufpos == fp->__bufstart) + && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0 + || fp->__bufpos == fp->__bufread)) +#elif defined __QNX__ /* QNX */ + if ((fp->_Mode & _MWRITE ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend) + && fp->_Rback == fp->_Back + sizeof (fp->_Back) + && fp->_Rsave == NULL) +#else + #error "Please port gnulib fseeko.c to your platform! Look at the code in fpurge.c, then report this to bug-gnulib." +#endif + { + off_t pos = lseek (fileno (fp), offset, whence); + if (pos == -1) + { +#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ + fp->_flags &= ~__SOFF; +#endif + return -1; + } + else + { +#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ + fp->_offset = pos; + fp->_flags |= __SOFF; + fp->_flags &= ~__SEOF; +#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw */ +# if defined _SCO_DS /* OpenServer */ +# define _flag __flag +# endif + fp->_flag &= ~_IOEOF; +#endif + return 0; + } + } + else + return fseeko (fp, offset, whence); +} diff --git a/lib/fstatat.c b/lib/fstatat.c new file mode 100644 index 0000000..8b62912 --- /dev/null +++ b/lib/fstatat.c @@ -0,0 +1,56 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +#include + +#define COMPILING_FSTATAT 1 +#include "openat.h" + +#include +#include + +/* 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 + +/* Specification. */ +#include + +#include +#include + +#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 . */ + +# include +# include + +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 + +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..51f2d38 --- /dev/null +++ b/lib/full-write.c @@ -0,0 +1,80 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#ifdef FULL_READ +# include "full-read.h" +#else +# include "full-write.h" +#endif + +#include + +#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..9a80146 --- /dev/null +++ b/lib/full-write.h @@ -0,0 +1,34 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + + +#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..2397c08 --- /dev/null +++ b/lib/getcwd.c @@ -0,0 +1,435 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if !_LIBC +# include +# include +# include "dirfd.h" +#endif + +#include +#include +#include +#include +#include + +#include /* For AT_FDCWD on Solaris 9. */ + +/* If this host provides the openat function, then enable + code below to make getcwd more efficient and robust. */ +#ifdef HAVE_OPENAT +# define HAVE_OPENAT_SUPPORT 1 +#else +# define HAVE_OPENAT_SUPPORT 0 +#endif + +#ifndef __set_errno +# define __set_errno(val) (errno = (val)) +#endif + +#include +#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 +#include +#include + +#if _LIBC +# ifndef mempcpy +# define mempcpy __mempcpy +# endif +#endif + +#include + +/* 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 rpl_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 + }; + +#if HAVE_OPENAT_SUPPORT + int fd = AT_FDCWD; + bool fd_needs_closing = false; +#else + char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1]; + char *dotlist = dots; + size_t dotsize = sizeof dots; + size_t dotlen = 0; +#endif + DIR *dirstream = NULL; + dev_t rootdev, thisdev; + ino_t rootino, thisino; + char *dir; + register char *dirp; + struct 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. */ +#if HAVE_OPENAT_SUPPORT + 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. */ +#if HAVE_OPENAT_SUPPORT + 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; +#if HAVE_OPENAT_SUPPORT + 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 = '/'; + +#if ! HAVE_OPENAT_SUPPORT + if (dotlist != dots) + free (dotlist); +#endif + + used = dir + allocated - dirp; + memmove (dir, dirp, used); + + if (size == 0) + /* Ensure that the buffer is only as large as necessary. */ + buf = 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); +#if HAVE_OPENAT_SUPPORT + 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..07a293b --- /dev/null +++ b/lib/getdate.c @@ -0,0 +1,3331 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Originally written by Steven M. Bellovin while + at the University of North Carolina at Chapel Hill. Later tweaked by + a couple of people on Usenet. Completely overhauled by Rich $alz + and Jim Berets in August, 1990. + + Modified by Paul Eggert in August 1999 to do + the right thing about local DST. Also modified by Paul Eggert + 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 + +#include "getdate.h" + +#include "intprops.h" +#include "timespec.h" +#include "verify.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 +#include +#include +#include +#include + +#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) + +/* Lots of this code assumes time_t and time_t-like values fit into + long int. It also assumes that signed integer overflow silently + wraps around, but there's no portable way to check for that at + compile-time. */ +verify (TYPE_IS_INTEGER (time_t)); +verify (LONG_MIN <= TYPE_MINIMUM (time_t) && TYPE_MAXIMUM (time_t) <= LONG_MAX); + +/* 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); + +/* Extract into *PC any date and time info from a string of digits + of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY, + YYYY, ...). */ +static void +digits_to_date_time (parser_control *pc, textint text_int) +{ + if (pc->dates_seen && ! pc->year.digits + && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits)) + pc->year = text_int; + else + { + if (4 < text_int.digits) + { + pc->dates_seen++; + pc->day = text_int.value % 100; + pc->month = (text_int.value / 100) % 100; + pc->year.value = text_int.value / 10000; + pc->year.digits = text_int.digits - 4; + } + else + { + pc->times_seen++; + if (text_int.digits <= 2) + { + pc->hour = text_int.value; + pc->minutes = 0; + } + else + { + pc->hour = text_int.value / 100; + pc->minutes = text_int.value % 100; + } + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = MER24; + } + } +} + + + +/* 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 261 "getdate.y" +{ + long int intval; + textint textintval; + struct timespec timespec; + relative_time rel; +} +/* Line 187 of yacc.c. */ +#line 395 "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 408 "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 /* 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 /* 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 /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* 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 /* 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 /* 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 96 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 26 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 20 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 80 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 98 + +/* 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, 30, 33, 38, 44, 51, + 59, 61, 64, 66, 69, 73, 75, 78, 80, 83, + 86, 89, 93, 99, 103, 107, 111, 114, 119, 122, + 126, 129, 131, 134, 137, 139, 142, 145, 147, 150, + 153, 155, 158, 161, 163, 166, 169, 171, 174, 177, + 180, 183, 185, 187, 190, 193, 196, 199, 202, 205, + 207, 209, 211, 213, 215, 217, 219, 222, 223, 226, + 227 +}; + +/* 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, 43, -1, + 19, 14, -1, 19, 23, 19, 45, -1, 19, 23, + 19, 18, 44, -1, 19, 23, 19, 23, 41, 45, + -1, 19, 23, 19, 23, 41, 18, 44, -1, 13, + -1, 13, 4, -1, 17, -1, 17, 38, -1, 17, + 18, 44, -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, 19, + 38, -1, -1, 23, 19, -1, -1, 14, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 287, 287, 288, 292, 299, 301, 305, 307, 309, + 311, 313, 315, 317, 318, 322, 330, 338, 348, 355, + 367, 372, 380, 382, 392, 394, 396, 401, 406, 411, + 416, 424, 429, 449, 456, 464, 472, 477, 483, 488, + 497, 507, 520, 522, 524, 526, 528, 530, 532, 534, + 536, 538, 540, 542, 544, 546, 548, 550, 552, 554, + 556, 558, 560, 564, 566, 568, 570, 572, 574, 578, + 578, 581, 582, 587, 588, 593, 598, 616, 617, 623, + 624 +}; +#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", "hybrid", "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, 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, 44, 44, 45, + 45 +}; + +/* 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, 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, 2, 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, 72, 74, 71, 73, 4, + 69, 70, 1, 44, 47, 53, 56, 61, 50, 27, + 25, 20, 0, 0, 22, 0, 75, 0, 0, 6, + 7, 8, 9, 11, 10, 12, 41, 62, 13, 14, + 28, 21, 0, 36, 42, 45, 51, 54, 57, 48, + 29, 26, 77, 23, 63, 64, 66, 67, 68, 65, + 43, 46, 52, 55, 58, 49, 30, 15, 38, 0, + 0, 0, 76, 59, 60, 40, 35, 0, 0, 24, + 34, 39, 33, 79, 31, 37, 78, 80, 77, 0, + 16, 0, 17, 79, 32, 77, 18, 19 +}; + +/* 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, 39, 79, 90 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -81 +static const yytype_int8 yypact[] = +{ + -10, 54, 70, -81, 25, -81, -81, -81, -81, -81, + -81, -81, -81, -81, -81, -81, -81, -81, -81, 55, + -81, 74, 50, 48, 10, 56, -5, 71, 72, -81, + -81, -81, -81, -81, -81, -81, 79, -81, -81, -81, + -81, -81, 65, 60, -81, -81, -81, -81, -81, -81, + -81, -81, 16, -81, -81, -81, -81, -81, -81, -81, + -81, -81, -81, -81, -81, -81, -81, -81, 58, 42, + 66, 67, -81, -81, -81, -81, -81, 68, 69, -81, + -81, -81, -81, -7, 64, -81, -81, -81, 73, -2, + -81, 75, -81, 53, -81, 73, -81, -81 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -81, -81, -81, -81, -81, -81, -81, -81, -81, -81, + -81, -81, 3, -81, -81, 1, -81, -81, -80, -1 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const yytype_uint8 yytable[] = +{ + 60, 61, 62, 63, 64, 65, 66, 87, 92, 67, + 68, 88, 1, 69, 51, 97, 89, 6, 70, 8, + 71, 54, 55, 56, 57, 58, 59, 53, 52, 72, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 78, + 22, 23, 24, 25, 26, 27, 28, 54, 55, 56, + 57, 58, 59, 44, 45, 46, 47, 48, 49, 50, + 82, 54, 55, 56, 57, 58, 59, 87, 42, 43, + 12, 95, 5, 6, 7, 8, 80, 81, 41, 40, + 73, 74, 75, 76, 77, 83, 84, 85, 86, 91, + 93, 0, 96, 0, 94, 0, 78 +}; + +static const yytype_int8 yycheck[] = +{ + 5, 6, 7, 8, 9, 10, 11, 14, 88, 14, + 15, 18, 22, 18, 4, 95, 23, 19, 23, 21, + 25, 5, 6, 7, 8, 9, 10, 24, 18, 26, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 23, + 15, 16, 17, 18, 19, 20, 21, 5, 6, 7, + 8, 9, 10, 5, 6, 7, 8, 9, 10, 11, + 18, 5, 6, 7, 8, 9, 10, 14, 18, 19, + 0, 18, 18, 19, 20, 21, 18, 19, 4, 24, + 9, 9, 3, 18, 24, 19, 19, 19, 19, 25, + 89, -1, 93, -1, 19, -1, 23 +}; + +/* 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, 43, + 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, 38, 9, 9, 3, 18, 24, 23, 44, + 18, 19, 18, 19, 19, 19, 19, 14, 18, 23, + 45, 25, 44, 41, 19, 18, 45, 44 +}; + +#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 /* 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 293 "getdate.y" + { + pc->seconds = (yyvsp[(2) - (2)].timespec); + pc->timespec_seen = true; + } + break; + + case 7: +#line 306 "getdate.y" + { pc->times_seen++; } + break; + + case 8: +#line 308 "getdate.y" + { pc->local_zones_seen++; } + break; + + case 9: +#line 310 "getdate.y" + { pc->zones_seen++; } + break; + + case 10: +#line 312 "getdate.y" + { pc->dates_seen++; } + break; + + case 11: +#line 314 "getdate.y" + { pc->days_seen++; } + break; + + case 12: +#line 316 "getdate.y" + { pc->rels_seen = true; } + break; + + case 15: +#line 323 "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 16: +#line 331 "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 17: +#line 339 "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 18: +#line 349 "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 19: +#line 356 "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 20: +#line 368 "getdate.y" + { + pc->local_isdst = (yyvsp[(1) - (1)].intval); + pc->dsts_seen += (0 < (yyvsp[(1) - (1)].intval)); + } + break; + + case 21: +#line 373 "getdate.y" + { + pc->local_isdst = 1; + pc->dsts_seen += (0 < (yyvsp[(1) - (2)].intval)) + 1; + } + break; + + case 22: +#line 381 "getdate.y" + { pc->time_zone = (yyvsp[(1) - (1)].intval); } + break; + + case 23: +#line 383 "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 24: +#line 393 "getdate.y" + { pc->time_zone = (yyvsp[(1) - (3)].intval) + time_zone_hhmm ((yyvsp[(2) - (3)].textintval), (yyvsp[(3) - (3)].intval)); } + break; + + case 25: +#line 395 "getdate.y" + { pc->time_zone = (yyvsp[(1) - (1)].intval) + 60; } + break; + + case 26: +#line 397 "getdate.y" + { pc->time_zone = (yyvsp[(1) - (2)].intval) + 60; } + break; + + case 27: +#line 402 "getdate.y" + { + pc->day_ordinal = 1; + pc->day_number = (yyvsp[(1) - (1)].intval); + } + break; + + case 28: +#line 407 "getdate.y" + { + pc->day_ordinal = 1; + pc->day_number = (yyvsp[(1) - (2)].intval); + } + break; + + case 29: +#line 412 "getdate.y" + { + pc->day_ordinal = (yyvsp[(1) - (2)].intval); + pc->day_number = (yyvsp[(2) - (2)].intval); + } + break; + + case 30: +#line 417 "getdate.y" + { + pc->day_ordinal = (yyvsp[(1) - (2)].textintval).value; + pc->day_number = (yyvsp[(2) - (2)].intval); + } + break; + + case 31: +#line 425 "getdate.y" + { + pc->month = (yyvsp[(1) - (3)].textintval).value; + pc->day = (yyvsp[(3) - (3)].textintval).value; + } + break; + + case 32: +#line 430 "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 33: +#line 450 "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 34: +#line 457 "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 35: +#line 465 "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 36: +#line 473 "getdate.y" + { + pc->month = (yyvsp[(1) - (2)].intval); + pc->day = (yyvsp[(2) - (2)].textintval).value; + } + break; + + case 37: +#line 478 "getdate.y" + { + pc->month = (yyvsp[(1) - (4)].intval); + pc->day = (yyvsp[(2) - (4)].textintval).value; + pc->year = (yyvsp[(4) - (4)].textintval); + } + break; + + case 38: +#line 484 "getdate.y" + { + pc->day = (yyvsp[(1) - (2)].textintval).value; + pc->month = (yyvsp[(2) - (2)].intval); + } + break; + + case 39: +#line 489 "getdate.y" + { + pc->day = (yyvsp[(1) - (3)].textintval).value; + pc->month = (yyvsp[(2) - (3)].intval); + pc->year = (yyvsp[(3) - (3)].textintval); + } + break; + + case 40: +#line 498 "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 41: +#line 508 "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 42: +#line 521 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].intval); } + break; + + case 43: +#line 523 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 44: +#line 525 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = 1; } + break; + + case 45: +#line 527 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].intval); } + break; + + case 46: +#line 529 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 47: +#line 531 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = 1; } + break; + + case 48: +#line 533 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].intval) * (yyvsp[(2) - (2)].intval); } + break; + + case 49: +#line 535 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); } + break; + + case 50: +#line 537 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (1)].intval); } + break; + + case 51: +#line 539 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].intval); } + break; + + case 52: +#line 541 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 53: +#line 543 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = 1; } + break; + + case 54: +#line 545 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].intval); } + break; + + case 55: +#line 547 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 56: +#line 549 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = 1; } + break; + + case 57: +#line 551 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].intval); } + break; + + case 58: +#line 553 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 59: +#line 555 "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 557 "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 61: +#line 559 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = 1; } + break; + + case 63: +#line 565 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).year = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 64: +#line 567 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).month = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 65: +#line 569 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).day = (yyvsp[(1) - (2)].textintval).value * (yyvsp[(2) - (2)].intval); } + break; + + case 66: +#line 571 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).hour = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 67: +#line 573 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).minutes = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 68: +#line 575 "getdate.y" + { (yyval.rel) = RELATIVE_TIME_0; (yyval.rel).seconds = (yyvsp[(1) - (2)].textintval).value; } + break; + + case 72: +#line 583 "getdate.y" + { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; } + break; + + case 74: +#line 589 "getdate.y" + { (yyval.timespec).tv_sec = (yyvsp[(1) - (1)].textintval).value; (yyval.timespec).tv_nsec = 0; } + break; + + case 75: +#line 594 "getdate.y" + { digits_to_date_time (pc, (yyvsp[(1) - (1)].textintval)); } + break; + + case 76: +#line 599 "getdate.y" + { + /* Hybrid all-digit and relative offset, so that we accept e.g., + "YYYYMMDD +N days" as well as "YYYYMMDD N days". */ + digits_to_date_time (pc, (yyvsp[(1) - (2)].textintval)); + 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 77: +#line 616 "getdate.y" + { (yyval.intval) = -1; } + break; + + case 78: +#line 618 "getdate.y" + { (yyval.intval) = (yyvsp[(2) - (2)].textintval).value; } + break; + + case 79: +#line 623 "getdate.y" + { (yyval.intval) = MER24; } + break; + + case 80: +#line 625 "getdate.y" + { (yyval.intval) = (yyvsp[(1) - (1)].intval); } + break; + + +/* Line 1267 of yacc.c. */ +#line 2185 "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 628 "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; + } + } + + /* As documented, be careful to treat the empty string just like + a date string of "0". Without this, an empty string would be + declared invalid when parsed during a DST transition. */ + if (*p == '\0') + p = "0"; + + 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 + { +# if !HAVE_DECL_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..73b6188 --- /dev/null +++ b/lib/getdate.h @@ -0,0 +1,22 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include + +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..1deec51 --- /dev/null +++ b/lib/getdate.y @@ -0,0 +1,1559 @@ +%{ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Originally written by Steven M. Bellovin while + at the University of North Carolina at Chapel Hill. Later tweaked by + a couple of people on Usenet. Completely overhauled by Rich $alz + and Jim Berets in August, 1990. + + Modified by Paul Eggert in August 1999 to do + the right thing about local DST. Also modified by Paul Eggert + 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 + +#include "getdate.h" + +#include "intprops.h" +#include "timespec.h" +#include "verify.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 +#include +#include +#include +#include + +#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) + +/* Lots of this code assumes time_t and time_t-like values fit into + long int. It also assumes that signed integer overflow silently + wraps around, but there's no portable way to check for that at + compile-time. */ +verify (TYPE_IS_INTEGER (time_t)); +verify (LONG_MIN <= TYPE_MINIMUM (time_t) && TYPE_MAXIMUM (time_t) <= LONG_MAX); + +/* 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); + +/* Extract into *PC any date and time info from a string of digits + of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY, + YYYY, ...). */ +static void +digits_to_date_time (parser_control *pc, textint text_int) +{ + if (pc->dates_seen && ! pc->year.digits + && ! pc->rels_seen && (pc->times_seen || 2 < text_int.digits)) + pc->year = text_int; + else + { + if (4 < text_int.digits) + { + pc->dates_seen++; + pc->day = text_int.value % 100; + pc->month = (text_int.value / 100) % 100; + pc->year.value = text_int.value / 10000; + pc->year.digits = text_int.digits - 4; + } + else + { + pc->times_seen++; + if (text_int.digits <= 2) + { + pc->hour = text_int.value; + pc->minutes = 0; + } + else + { + pc->hour = text_int.value / 100; + pc->minutes = text_int.value % 100; + } + pc->seconds.tv_sec = 0; + pc->seconds.tv_nsec = 0; + pc->meridian = MER24; + } + } +} + +%} + +/* 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 tDAY_UNIT + +%token tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN +%token tMONTH tORDINAL tZONE + +%token tSNUMBER tUNUMBER +%token tSDECIMAL_NUMBER tUDECIMAL_NUMBER + +%type o_colon_minutes o_merid +%type seconds signed_seconds unsigned_seconds + +%type 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 + | hybrid + ; + +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 + { digits_to_date_time (pc, $1); } + ; + +hybrid: + tUNUMBER relunit_snumber + { + /* Hybrid all-digit and relative offset, so that we accept e.g., + "YYYYMMDD +N days" as well as "YYYYMMDD N days". */ + digits_to_date_time (pc, $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; + } + ; + +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; + } + } + + /* As documented, be careful to treat the empty string just like + a date string of "0". Without this, an empty string would be + declared invalid when parsed during a DST transition. */ + if (*p == '\0') + p = "0"; + + 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 + { +# if !HAVE_DECL_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..286a460 --- /dev/null +++ b/lib/getdelim.c @@ -0,0 +1,132 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* getdelim.c --- Implementation of replacement getdelim function. + Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005, 2006, 2007, 2008 Free + Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Ported from glibc by Simon Josefsson. */ + +#include + +#include + +#include +#include +#include + +#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) + { + char *new_lineptr; + *n = 120; + new_lineptr = (char *) realloc (*lineptr, *n); + if (new_lineptr == NULL) + { + result = -1; + goto unlock_return; + } + *lineptr = new_lineptr; + } + + 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; + errno = EOVERFLOW; + 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); /* doesn't set errno */ + + return result; +} diff --git a/lib/getline.c b/lib/getline.c new file mode 100644 index 0000000..6be04ef --- /dev/null +++ b/lib/getline.c @@ -0,0 +1,31 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* getline.c --- Implementation of replacement getline function. + Copyright (C) 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 3, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Written by Simon Josefsson. */ + +#include + +#include + +ssize_t +getline (char **lineptr, size_t *n, FILE *stream) +{ + return getdelim (lineptr, n, '\n', stream); +} diff --git a/lib/getopt.c b/lib/getopt.c new file mode 100644 index 0000000..f1e6d1f --- /dev/null +++ b/lib/getopt.c @@ -0,0 +1,1186 @@ +/* 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,2008 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _LIBC +# include +#endif + +#include "getopt.h" + +#include +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#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/getopt.in.h b/lib/getopt.in.h new file mode 100644 index 0000000..d2d3e6e --- /dev/null +++ b/lib/getopt.in.h @@ -0,0 +1,225 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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 +# include +# include +# 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 , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in 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 +#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/getopt1.c b/lib/getopt1.c new file mode 100644 index 0000000..d6a3ecf --- /dev/null +++ b/lib/getopt1.c @@ -0,0 +1,170 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef _LIBC +# include +#else +# include +# include "getopt.h" +#endif +#include "getopt_int.h" + +#include + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#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 + +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_int.h b/lib/getopt_int.h new file mode 100644 index 0000000..3c6628b --- /dev/null +++ b/lib/getopt_int.h @@ -0,0 +1,130 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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.c b/lib/getpagesize.c new file mode 100644 index 0000000..5498aa9 --- /dev/null +++ b/lib/getpagesize.c @@ -0,0 +1,39 @@ +/* getpagesize emulation for systems where it cannot be done in a C macro. + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible and Martin Lambers. */ + +#include + +/* Specification. */ +#include + +/* This implementation is only for native Win32 systems. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# define WIN32_LEAN_AND_MEAN +# include + +int +getpagesize (void) +{ + SYSTEM_INFO system_info; + GetSystemInfo (&system_info); + return system_info.dwPageSize; +} + +#endif diff --git a/lib/gettext.h b/lib/gettext.h new file mode 100644 index 0000000..89b4feb --- /dev/null +++ b/lib/gettext.h @@ -0,0 +1,272 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Convenience header for conditional use of GNU . + 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 + +/* 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 a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# 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 + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include +#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..1b85336 --- /dev/null +++ b/lib/gettime.c @@ -0,0 +1,48 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "timespec.h" + +#include + +/* 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..b8ec4fa --- /dev/null +++ b/lib/gettimeofday.c @@ -0,0 +1,144 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* written by Jim Meyering */ + +#include + +/* Specification. */ +#include + +#include + +#if HAVE_SYS_TIMEB_H +# include +#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 * +rpl_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 * +rpl_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 +rpl_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..0472c12 --- /dev/null +++ b/lib/gnulib.mk @@ -0,0 +1,1747 @@ +## DO NOT EDIT! GENERATED AUTOMATICALLY! +## Process this file with automake to produce Makefile.in. +# Copyright (C) 2002-2008 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 --no-libtool --macro-prefix=gl alloca argmatch argp backupfile closeout configmake dirname error exclude exitfail fileblocks fnmatch-gnu fseeko 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 snprintf 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 subdir-objects + +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 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 when the system +# doesn't have one that works with the given compiler. +alloca.h: alloca.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/alloca.in.h; \ + } > $@-t + mv -f $@-t $@ +MOSTLYCLEANFILES += alloca.h alloca.h-t + +EXTRA_DIST += alloca.in.h + +## end gnulib module alloca-opt + +## 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 when the system +# doesn't have one that works with the given compiler. +dirent.h: dirent.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ + -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \ + -e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \ + < $(srcdir)/dirent.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += dirent.h dirent.h-t + +EXTRA_DIST += dirent.in.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 when the system +# doesn't have one that works with the given compiler. +fcntl.h: fcntl.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \ + -e 's|@''GNULIB_OPEN''@|$(GNULIB_OPEN)|g' \ + -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \ + < $(srcdir)/fcntl.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += fcntl.h fcntl.h-t + +EXTRA_DIST += fcntl.in.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 when the system +# doesn't have one that works with the given compiler. +float.h: float.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \ + < $(srcdir)/float.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += float.h float.h-t + +EXTRA_DIST += float.in.h + +## end gnulib module float + +## begin gnulib module fnmatch + +BUILT_SOURCES += $(FNMATCH_H) + +# We need the following in order to create when the system +# doesn't have one that supports the required API. +fnmatch.h: fnmatch.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/fnmatch.in.h; \ + } > $@-t + mv -f $@-t $@ +MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t + +EXTRA_DIST += fnmatch.c fnmatch.in.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 fseeko + + +EXTRA_DIST += fseeko.c + +EXTRA_libtar_a_SOURCES += fseeko.c + +## end gnulib module fseeko + +## 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 + +EXTRA_libtar_a_SOURCES += getdelim.c + +## end gnulib module getdelim + +## begin gnulib module getline + + +EXTRA_DIST += getline.c + +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 when the system +# doesn't have one that works with the given compiler. +getopt.h: getopt.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + cat $(srcdir)/getopt.in.h; \ + } > $@-t + mv -f $@-t $@ +MOSTLYCLEANFILES += getopt.h getopt.h-t + +EXTRA_DIST += getopt.c getopt.in.h getopt1.c getopt_int.h + +EXTRA_libtar_a_SOURCES += getopt.c getopt1.c + +## end gnulib module getopt + +## begin gnulib module getpagesize + + +EXTRA_DIST += getpagesize.c + +EXTRA_libtar_a_SOURCES += getpagesize.c + +## 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 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 + +EXTRA_DIST += $(top_srcdir)/build-aux/config.rpath + +## 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 havelib + + +EXTRA_DIST += $(top_srcdir)/build-aux/config.rpath + +## end gnulib module havelib + +## 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 when the system +# doesn't have one that works with the given compiler. +inttypes.h: inttypes.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|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 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \ + -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \ + -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \ + -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/inttypes.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += inttypes.h inttypes.h-t + +EXTRA_DIST += inttypes.in.h + +## end gnulib module inttypes + +## begin gnulib module lchown + + +EXTRA_DIST += lchown.c + +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 + +EXTRA_DIST += $(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 lseek + + +EXTRA_DIST += lseek.c + +EXTRA_libtar_a_SOURCES += lseek.c + +## end gnulib module lseek + +## 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 malloc-posix + + +EXTRA_DIST += malloc.c + +EXTRA_libtar_a_SOURCES += malloc.c + +## end gnulib module malloc-posix + +## begin gnulib module malloca + +libtar_a_SOURCES += malloca.c + +EXTRA_DIST += malloca.h malloca.valgrind + +## end gnulib module malloca + +## 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 realloc-posix + + +EXTRA_DIST += realloc.c + +EXTRA_libtar_a_SOURCES += realloc.c + +## end gnulib module realloc-posix + +## 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 + +EXTRA_libtar_a_SOURCES += setenv.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 snprintf + + +EXTRA_DIST += snprintf.c + +EXTRA_libtar_a_SOURCES += snprintf.c + +## end gnulib module snprintf + +## 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 stdarg + +BUILT_SOURCES += $(STDARG_H) + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdarg.h: stdarg.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDARG_H''@|$(NEXT_STDARG_H)|g' \ + < $(srcdir)/stdarg.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdarg.h stdarg.h-t + +EXTRA_DIST += stdarg.in.h + +## end gnulib module stdarg + +## begin gnulib module stdbool + +BUILT_SOURCES += $(STDBOOL_H) + +# We need the following in order to create when the system +# doesn't have one that works. +stdbool.h: stdbool.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdbool.h stdbool.h-t + +EXTRA_DIST += stdbool.in.h + +## end gnulib module stdbool + +## begin gnulib module stdint + +BUILT_SOURCES += $(STDINT_H) + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdint.h: stdint.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \ + -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \ + -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \ + -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \ + -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \ + -e 's/@''HAVE_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.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdint.h stdint.h-t + +EXTRA_DIST += stdint.in.h + +## end gnulib module stdint + +## begin gnulib module stdio + +BUILT_SOURCES += stdio.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdio.h: stdio.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|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_FOPEN''@|$(GNULIB_FOPEN)|g' \ + -e 's|@''GNULIB_FREOPEN''@|$(GNULIB_FREOPEN)|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|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \ + -e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|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_FOPEN''@|$(REPLACE_FOPEN)|g' \ + -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|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 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ + -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ + -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/stdio.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdio.h stdio.h-t + +EXTRA_DIST += stdio.in.h + +## end gnulib module stdio + +## begin gnulib module stdlib + +BUILT_SOURCES += stdlib.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +stdlib.h: stdlib.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ + -e 's|@''GNULIB_MALLOC_POSIX''@|$(GNULIB_MALLOC_POSIX)|g' \ + -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \ + -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ + -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \ + -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \ + -e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \ + -e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \ + -e 's|@''GNULIB_SETENV''@|$(GNULIB_SETENV)|g' \ + -e 's|@''GNULIB_STRTOD''@|$(GNULIB_STRTOD)|g' \ + -e 's|@''GNULIB_UNSETENV''@|$(GNULIB_UNSETENV)|g' \ + -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \ + -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ + -e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \ + -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ + -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \ + -e 's|@''HAVE_SETENV''@|$(HAVE_SETENV)|g' \ + -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \ + -e 's|@''HAVE_UNSETENV''@|$(HAVE_UNSETENV)|g' \ + -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ + -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \ + -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \ + -e 's|@''VOID_UNSETENV''@|$(VOID_UNSETENV)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/stdlib.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdlib.h stdlib.h-t + +EXTRA_DIST += stdlib.in.h + +## end gnulib module stdlib + +## begin gnulib module stpcpy + + +EXTRA_DIST += stpcpy.c + +EXTRA_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 streq + + +EXTRA_DIST += streq.h + +## end gnulib module streq + +## 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 when the system +# doesn't have one that works with the given compiler. +string.h: string.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \ + -e 's|@''GNULIB_MBSLEN''@|$(GNULIB_MBSLEN)|g' \ + -e 's|@''GNULIB_MBSNLEN''@|$(GNULIB_MBSNLEN)|g' \ + -e 's|@''GNULIB_MBSCHR''@|$(GNULIB_MBSCHR)|g' \ + -e 's|@''GNULIB_MBSRCHR''@|$(GNULIB_MBSRCHR)|g' \ + -e 's|@''GNULIB_MBSSTR''@|$(GNULIB_MBSSTR)|g' \ + -e 's|@''GNULIB_MBSCASECMP''@|$(GNULIB_MBSCASECMP)|g' \ + -e 's|@''GNULIB_MBSNCASECMP''@|$(GNULIB_MBSNCASECMP)|g' \ + -e 's|@''GNULIB_MBSPCASECMP''@|$(GNULIB_MBSPCASECMP)|g' \ + -e 's|@''GNULIB_MBSCASESTR''@|$(GNULIB_MBSCASESTR)|g' \ + -e 's|@''GNULIB_MBSCSPN''@|$(GNULIB_MBSCSPN)|g' \ + -e 's|@''GNULIB_MBSPBRK''@|$(GNULIB_MBSPBRK)|g' \ + -e 's|@''GNULIB_MBSSPN''@|$(GNULIB_MBSSPN)|g' \ + -e 's|@''GNULIB_MBSSEP''@|$(GNULIB_MBSSEP)|g' \ + -e 's|@''GNULIB_MBSTOK_R''@|$(GNULIB_MBSTOK_R)|g' \ + -e 's|@''GNULIB_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_STRSTR''@|$(GNULIB_STRSTR)|g' \ + -e 's|@''GNULIB_STRCASESTR''@|$(GNULIB_STRCASESTR)|g' \ + -e 's|@''GNULIB_STRTOK_R''@|$(GNULIB_STRTOK_R)|g' \ + -e 's|@''GNULIB_STRERROR''@|$(GNULIB_STRERROR)|g' \ + -e 's|@''GNULIB_STRSIGNAL''@|$(GNULIB_STRSIGNAL)|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_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 's|@''HAVE_DECL_STRERROR''@|$(HAVE_DECL_STRERROR)|g' \ + -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \ + -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \ + -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \ + -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \ + -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \ + -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/string.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += string.h string.h-t + +EXTRA_DIST += string.in.h + +## end gnulib module string + +## begin gnulib module strings + +BUILT_SOURCES += strings.h + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +strings.h: strings.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \ + -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \ + -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/strings.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += strings.h strings.h-t + +EXTRA_DIST += strings.in.h + +## end gnulib module strings + +## begin gnulib module strndup + + +EXTRA_DIST += strndup.c + +EXTRA_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 when the system +# has one that is incomplete. +sys/stat.h: sys_stat.in.h + @MKDIR_P@ sys + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|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.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t +MOSTLYCLEANDIRS += sys + +EXTRA_DIST += sys_stat.in.h + +## end gnulib module sys_stat + +## begin gnulib module sys_time + +BUILT_SOURCES += $(SYS_TIME_H) + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +sys/time.h: sys_time.in.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/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ + -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ + -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ + < $(srcdir)/sys_time.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += sys/time.h sys/time.h-t + +EXTRA_DIST += sys_time.in.h + +## end gnulib module sys_time + +## begin gnulib module sysexits + +BUILT_SOURCES += $(SYSEXITS_H) + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +sysexits.h: sysexits.in.h + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''HAVE_SYSEXITS_H''@|$(HAVE_SYSEXITS_H)|g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_SYSEXITS_H''@|$(NEXT_SYSEXITS_H)|g' \ + < $(srcdir)/sysexits.in.h; \ + } > $@-t + mv -f $@-t $@ +MOSTLYCLEANFILES += sysexits.h sysexits.h-t + +EXTRA_DIST += sysexits.in.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 when the system +# doesn't have one that works with the given compiler. +time.h: time.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@NEXT_TIME_H''@|$(NEXT_TIME_H)|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.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += time.h time.h-t + +EXTRA_DIST += time.in.h + +## end gnulib module time + +## begin gnulib module time_r + + +EXTRA_DIST += time_r.c + +EXTRA_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 +# when the system doesn't have one. +unistd.h: unistd.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \ + -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \ + -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \ + -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|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_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \ + -e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|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_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \ + -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \ + -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \ + -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \ + -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \ + -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \ + -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|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_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \ + -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \ + -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \ + < $(srcdir)/unistd.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += unistd.h unistd.h-t + +EXTRA_DIST += unistd.in.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 unitypes + + +EXTRA_DIST += unitypes.h + +## end gnulib module unitypes + +## begin gnulib module uniwidth/base + + +EXTRA_DIST += localcharset.h uniwidth.h + +## end gnulib module uniwidth/base + +## begin gnulib module uniwidth/width + +libtar_a_SOURCES += uniwidth/width.c + +EXTRA_DIST += uniwidth/cjk.h + +## end gnulib module uniwidth/width + +## 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 unsetenv + + +EXTRA_DIST += unsetenv.c + +EXTRA_libtar_a_SOURCES += unsetenv.c + +## end gnulib module unsetenv + +## 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 when the system +# version does not work standalone. +wchar.h: wchar.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \ + -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \ + -e 's|@''GNULIB_WCWIDTH''@|$(GNULIB_WCWIDTH)|g' \ + -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \ + -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \ + -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ + < $(srcdir)/wchar.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += wchar.h wchar.h-t + +EXTRA_DIST += wchar.in.h + +## end gnulib module wchar + +## begin gnulib module wctype + +BUILT_SOURCES += $(WCTYPE_H) + +# We need the following in order to create when the system +# doesn't have one that works with the given compiler. +wctype.h: wctype.in.h + rm -f $@-t $@ + { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ + sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \ + -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ + -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \ + -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \ + -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \ + < $(srcdir)/wctype.in.h; \ + } > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += wctype.h wctype.h-t + +EXTRA_DIST += wctype.in.h + +## end gnulib module wctype + +## begin gnulib module wcwidth + + +EXTRA_DIST += wcwidth.c + +EXTRA_libtar_a_SOURCES += wcwidth.c + +## 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 xsize + +libtar_a_SOURCES += xsize.h + +## end gnulib module xsize + +## begin gnulib module xstrndup + +libtar_a_SOURCES += xstrndup.h xstrndup.c + +## end gnulib module xstrndup + +## begin gnulib module xstrtol + + +EXTRA_DIST += xstrtol-error.c xstrtol.c xstrtol.h xstrtoul.c + +EXTRA_libtar_a_SOURCES += xstrtol-error.c 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..7d76d45 --- /dev/null +++ b/lib/hash.c @@ -0,0 +1,1049 @@ +/* hash - hashing table processing. + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free + Software Foundation, Inc. + + Written by Jim Meyering, 1992. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +#include "hash.h" +#include "xalloc.h" + +#include +#include +#include + +#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); + if (table->bucket == NULL) + goto fail; + table->bucket_limit = table->bucket + table->n_buckets; + table->n_buckets_used = 0; + table->n_entries = 0; + + table->hasher = hasher; + table->comparator = comparator; + table->data_freer = data_freer; + + table->free_entry_list = NULL; +#if USE_OBSTACK + obstack_init (&table->entry_stack); +#endif + return table; + + fail: + free (table); + return NULL; +} + +/* 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..fc1af28 --- /dev/null +++ b/lib/hash.h @@ -0,0 +1,87 @@ +/* hash - hashing table processing. + Copyright (C) 1998, 1999, 2001, 2003 Free Software Foundation, Inc. + Written by Jim Meyering , 1998. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 +# include + +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..c7291b7 --- /dev/null +++ b/lib/human.c @@ -0,0 +1,471 @@ +/* human.c -- print human readable file size + + Copyright (C) 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Larry McVoy. */ + +#include + +#include "human.h" + +#include +#include +#include +#include + +#include +#include +#include + +/* 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 . */ + +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; +} + +enum strtol_error +human_options (char const *spec, int *opts, uintmax_t *block_size) +{ + strtol_error e = humblock (spec, block_size, opts); + if (*block_size == 0) + { + *block_size = default_block_size (); + e = LONGINT_INVALID; + } + return e; +} diff --git a/lib/human.h b/lib/human.h new file mode 100644 index 0000000..11b1e0c --- /dev/null +++ b/lib/human.h @@ -0,0 +1,84 @@ +/* human.h -- print human readable file size + + Copyright (C) 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Larry McVoy. */ + +#ifndef HUMAN_H_ +# define HUMAN_H_ 1 + +# include +# include +# include +# include + +# include + +/* 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); + +enum strtol_error human_options (char const *, int *, 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..002161e --- /dev/null +++ b/lib/intprops.h @@ -0,0 +1,77 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +/* 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..4ba71f5 --- /dev/null +++ b/lib/inttostr.c @@ -0,0 +1,50 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include + +#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..aa5820f --- /dev/null +++ b/lib/inttostr.h @@ -0,0 +1,29 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include +#include + +#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.in.h b/lib/inttypes.in.h new file mode 100644 index 0000000..8a24850 --- /dev/null +++ b/lib/inttypes.in.h @@ -0,0 +1,1095 @@ +/* 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 General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* + * ISO C 99 for platforms that lack it. + * + */ + +/* Include the original if it exists, and if this file + has not been included yet or if this file includes gnulib stdint.h + which in turn includes this file. + The include_next requires a split double-inclusion guard. */ +#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H +# if @HAVE_INTTYPES_H@ +# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@ +# endif +#endif + +#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H +#define INTTYPES_H + +/* Include or the gnulib replacement. */ +#include +/* Get CHAR_BIT. */ +#include + +#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 ." +#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_EQ_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_EQ_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 @INT32_MAX_LT_INTMAX_MAX@ +# define PRIdMAX PRId64 +# else +# define PRIdMAX "ld" +# endif +# endif +# if !defined PRIiMAX || @PRI_MACROS_BROKEN@ +# undef PRIiMAX +# if @INT32_MAX_LT_INTMAX_MAX@ +# define PRIiMAX PRIi64 +# else +# define PRIiMAX "li" +# endif +# endif +# if !defined PRIoMAX || @PRI_MACROS_BROKEN@ +# undef PRIoMAX +# if @UINT32_MAX_LT_UINTMAX_MAX@ +# define PRIoMAX PRIo64 +# else +# define PRIoMAX "lo" +# endif +# endif +# if !defined PRIuMAX || @PRI_MACROS_BROKEN@ +# undef PRIuMAX +# if @UINT32_MAX_LT_UINTMAX_MAX@ +# define PRIuMAX PRIu64 +# else +# define PRIuMAX "lu" +# endif +# endif +# if !defined PRIxMAX || @PRI_MACROS_BROKEN@ +# undef PRIxMAX +# if @UINT32_MAX_LT_UINTMAX_MAX@ +# define PRIxMAX PRIx64 +# else +# define PRIxMAX "lx" +# endif +# endif +# if !defined PRIXMAX || @PRI_MACROS_BROKEN@ +# undef PRIXMAX +# if @UINT32_MAX_LT_UINTMAX_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_EQ_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_EQ_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 @INT32_MAX_LT_INTMAX_MAX@ +# define SCNdMAX SCNd64 +# else +# define SCNdMAX "ld" +# endif +# endif +# if !defined SCNiMAX || @PRI_MACROS_BROKEN@ +# undef SCNiMAX +# if @INT32_MAX_LT_INTMAX_MAX@ +# define SCNiMAX SCNi64 +# else +# define SCNiMAX "li" +# endif +# endif +# if !defined SCNoMAX || @PRI_MACROS_BROKEN@ +# undef SCNoMAX +# if @UINT32_MAX_LT_UINTMAX_MAX@ +# define SCNoMAX SCNo64 +# else +# define SCNoMAX "lo" +# endif +# endif +# if !defined SCNuMAX || @PRI_MACROS_BROKEN@ +# undef SCNuMAX +# if @UINT32_MAX_LT_UINTMAX_MAX@ +# define SCNuMAX SCNu64 +# else +# define SCNuMAX "lu" +# endif +# endif +# if !defined SCNxMAX || @PRI_MACROS_BROKEN@ +# undef SCNxMAX +# if @UINT32_MAX_LT_UINTMAX_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 /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */ diff --git a/lib/lchown.c b/lib/lchown.c new file mode 100644 index 0000000..07aef87 --- /dev/null +++ b/lib/lchown.c @@ -0,0 +1,62 @@ +/* Provide a stub lchown function for systems that lack it. + + Copyright (C) 1998, 1999, 2002, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* If the system chown does not follow symlinks, we don't want it + replaced by gnulib's chown, which does follow symlinks. */ +#if CHOWN_MODIFIES_SYMLINK +# define REPLACE_CHOWN 0 +#endif +#include + +#include +#include + +/* 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 + +/* 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/localcharset.c b/lib/localcharset.c new file mode 100644 index 0000000..9785370 --- /dev/null +++ b/lib/localcharset.c @@ -0,0 +1,462 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Bruno Haible . */ + +#include + +/* Specification. */ +#include "localcharset.h" + +#include +#include +#include +#include + +#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 +# else +# if 0 /* see comment below */ +# include +# endif +# endif +# ifdef __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +# endif +#elif defined WIN32_NATIVE +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#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..7f0b974 --- /dev/null +++ b/lib/localcharset.h @@ -0,0 +1,43 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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/lseek.c b/lib/lseek.c new file mode 100644 index 0000000..f0b7603 --- /dev/null +++ b/lib/lseek.c @@ -0,0 +1,64 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* An lseek() function that detects pipes. + 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +/* Windows platforms. */ +/* Get GetFileType. */ +# include +#else +# include +#endif +#include + +#undef lseek + +off_t +rpl_lseek (int fd, off_t offset, int whence) +{ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */ + HANDLE h = (HANDLE) _get_osfhandle (fd); + if (h == INVALID_HANDLE_VALUE) + { + errno = EBADF; + return -1; + } + if (GetFileType (h) != FILE_TYPE_DISK) + { + errno = ESPIPE; + return -1; + } +#else + /* BeOS lseek mistakenly succeeds on pipes... */ + struct stat statbuf; + if (fstat (fd, &statbuf) < 0) + return -1; + if (!S_ISREG (statbuf.st_mode)) + { + errno = ESPIPE; + return -1; + } +#endif + return lseek (fd, offset, whence); +} diff --git a/lib/lstat.c b/lib/lstat.c new file mode 100644 index 0000000..9dcb4cd --- /dev/null +++ b/lib/lstat.c @@ -0,0 +1,75 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +/* 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 +#include +#include +#include + +/* 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..63b21c8 --- /dev/null +++ b/lib/lstat.h @@ -0,0 +1,23 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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..4738df2 --- /dev/null +++ b/lib/malloc.c @@ -0,0 +1,59 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* malloc() function that is glibc compatible. + + Copyright (C) 1997, 1998, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* written by Jim Meyering and Bruno Haible */ + +#include +/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */ +#ifdef malloc +# define NEED_MALLOC_GNU +# undef malloc +#endif + +/* Specification. */ +#include + +#include + +/* Call the system's malloc below. */ +#undef malloc + +/* Allocate an N-byte block of memory from the heap. + If N is zero, allocate a 1-byte block. */ + +void * +rpl_malloc (size_t n) +{ + void *result; + +#ifdef NEED_MALLOC_GNU + if (n == 0) + n = 1; +#endif + + result = malloc (n); + +#if !HAVE_MALLOC_POSIX + if (result == NULL) + errno = ENOMEM; +#endif + + return result; +} diff --git a/lib/malloca.c b/lib/malloca.c new file mode 100644 index 0000000..52f0c67 --- /dev/null +++ b/lib/malloca.c @@ -0,0 +1,139 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Safe automatic memory allocation. + Copyright (C) 2003, 2006-2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include "malloca.h" + +/* The speed critical point in this file is freea() applied to an alloca() + result: it must be fast, to match the speed of alloca(). The speed of + mmalloca() and freea() in the other case are not critical, because they + are only invoked for big memory sizes. */ + +#if HAVE_ALLOCA + +/* Store the mmalloca() results in a hash table. This is needed to reliably + distinguish a mmalloca() result and an alloca() result. + + Although it is possible that the same pointer is returned by alloca() and + by mmalloca() at different times in the same application, it does not lead + to a bug in freea(), 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 freea() on it anyway. + - Before a pointer returned by mmalloca() can point into the stack, it + must be freed. The only function that can free it is freea(), and + when freea() 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 * mmalloca_results[HASH_TABLE_SIZE]; + +#endif + +void * +mmalloca (size_t n) +{ +#if HAVE_ALLOCA + /* Allocate one more word, that serves as an indicator for malloc()ed + memory, so that freea() 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 = mmalloca_results[slot]; + mmalloca_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 +freea (void *p) +{ + /* mmalloca() may have returned NULL. */ + if (p != NULL) + { + /* Attempt to quickly distinguish the mmalloca() 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 mmalloca() 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 = &mmalloca_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 mmalloca() result. */ + } +} +#endif diff --git a/lib/malloca.h b/lib/malloca.h new file mode 100644 index 0000000..ae180c3 --- /dev/null +++ b/lib/malloca.h @@ -0,0 +1,136 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Safe automatic memory allocation. + Copyright (C) 2003-2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2003. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _MALLOCA_H +#define _MALLOCA_H + +#include +#include +#include + + +#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 + +/* malloca(N) is a safe variant of alloca(N). It allocates N bytes of + memory allocated on the stack, that must be freed using freea() before + the function returns. Upon failure, it returns NULL. */ +#if HAVE_ALLOCA +# define malloca(N) \ + ((N) < 4032 - sa_increment \ + ? (void *) ((char *) alloca ((N) + sa_increment) + sa_increment) \ + : mmalloca (N)) +#else +# define malloca(N) \ + mmalloca (N) +#endif +extern void * mmalloca (size_t n); + +/* Free a block of memory allocated through malloca(). */ +#if HAVE_ALLOCA +extern void freea (void *p); +#else +# define freea free +#endif + +/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S). + It allocates an array of N objects, each with S bytes of memory, + on the stack. S must be positive and N must be nonnegative. + The array must be freed using freea() before the function returns. */ +#if 1 +/* Cf. the definition of xalloc_oversized. */ +# define nmalloca(n, s) \ + ((n) > (size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) \ + ? NULL \ + : malloca ((n) * (s))) +#else +extern void * nmalloca (size_t n, size_t s); +#endif + + +#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 struct sa_alignof_helper { char __slot1; type __slot2; }; +# define sa_alignof(type) offsetof (sa_alignof_helper, __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 /* _MALLOCA_H */ diff --git a/lib/malloca.valgrind b/lib/malloca.valgrind new file mode 100644 index 0000000..52f0a50 --- /dev/null +++ b/lib/malloca.valgrind @@ -0,0 +1,7 @@ +# Suppress a valgrind message about use of uninitialized memory in freea(). +# This use is OK because it provides only a speedup. +{ + freea + Memcheck:Cond + fun:freea +} diff --git a/lib/mbchar.c b/lib/mbchar.c new file mode 100644 index 0000000..6fa14b0 --- /dev/null +++ b/lib/mbchar.c @@ -0,0 +1,35 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#include + +#include + +#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..5d47a0a --- /dev/null +++ b/lib/mbchar.h @@ -0,0 +1,350 @@ +/* Multibyte character data type. + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +/* 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 +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include +#include + +#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) + +/* , 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 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..19f974b --- /dev/null +++ b/lib/mbscasecmp.c @@ -0,0 +1,102 @@ +/* Case-insensitive string comparison function. + Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc. + Written by Bruno Haible , 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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..213e710 --- /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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +/* 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 +#include +#include +#include +#include + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +#include +#include +#include + +#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..b47eaef --- /dev/null +++ b/lib/memchr.c @@ -0,0 +1,200 @@ +/* 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 3 of the License, or any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . */ + +#ifndef _LIBC +# include +#endif + +#include + +#include + +#if defined _LIBC +# include +#else +# define reg_char char +#endif + +#include + +#if HAVE_BP_SYM_H || defined _LIBC +# include +#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..988936a --- /dev/null +++ b/lib/mempcpy.c @@ -0,0 +1,31 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +/* 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..50b27c0 --- /dev/null +++ b/lib/memrchr.c @@ -0,0 +1,189 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if defined _LIBC +# include +#else +# include +# define reg_char char +#endif + +#include +#include + +#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..25b806f --- /dev/null +++ b/lib/memset.c @@ -0,0 +1,30 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +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..6b6278b --- /dev/null +++ b/lib/mkdirat.c @@ -0,0 +1,42 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "openat.h" + +#include + +#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..6b9dd15 --- /dev/null +++ b/lib/mkdtemp.c @@ -0,0 +1,38 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Extracted from misc/mkdtemp.c. */ + +#include + +/* Specification. */ +#include + +#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..045f7d2 --- /dev/null +++ b/lib/mktime.c @@ -0,0 +1,665 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +#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 + +#include + +#include /* For the real memcpy prototype. */ + +#if DEBUG +# include +# include +/* 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 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..1296717 --- /dev/null +++ b/lib/modechange.c @@ -0,0 +1,385 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie */ + +/* 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 + +#include "modechange.h" +#include +#include "stat-macros.h" +#include "xalloc.h" +#include + +/* 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..f6f8e74 --- /dev/null +++ b/lib/modechange.h @@ -0,0 +1,30 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if ! defined MODECHANGE_H_ +# define MODECHANGE_H_ + +# include +# include + +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..5b87466 --- /dev/null +++ b/lib/obstack.c @@ -0,0 +1,430 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef _LIBC +# include +# include +#else +# include +# 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 /* Random thing to get __GNU_LIBRARY__. */ +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#include + +#ifndef ELIDE_CODE + +# include + +/* 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 +# 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 +# else +# include "gettext.h" +# endif +# ifndef _ +# define _(msgid) gettext (msgid) +# endif + +# ifdef _LIBC +# include +# 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..1bf4b2f --- /dev/null +++ b/lib/obstack.h @@ -0,0 +1,512 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 's symbols. Otherwise, include + and use ptrdiff_t. */ + +#ifdef __PTRDIFF_TYPE__ +# define PTR_INT_TYPE __PTRDIFF_TYPE__ +#else +# include +# 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 + +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..ce493d5 --- /dev/null +++ b/lib/open-safer.c @@ -0,0 +1,49 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "fcntl-safer.h" + +#include +#include +#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..6bc533d --- /dev/null +++ b/lib/openat-die.c @@ -0,0 +1,50 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#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..9254f6b --- /dev/null +++ b/lib/openat-priv.h @@ -0,0 +1,54 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include +#include + +#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..e84dc45 --- /dev/null +++ b/lib/openat-proc.c @@ -0,0 +1,94 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +#include "openat-priv.h" + +#include +#include +#include + +#include +#include + +#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..73f24b0 --- /dev/null +++ b/lib/openat.c @@ -0,0 +1,268 @@ +/* provide a replacement openat function + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include "openat.h" + +#include +#include + +#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ +#include "fcntl--.h" +#include "lstat.h" +#include "openat-priv.h" +#include "save-cwd.h" + +/* Replacement for Solaris' openat function. + + 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. + + 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. + + 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. + + 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..68c7df0 --- /dev/null +++ b/lib/openat.h @@ -0,0 +1,126 @@ +/* provide a replacement openat function + Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering */ + +#include + +#include +#include +#include +#include +#include + +#ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# 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..c02c65a --- /dev/null +++ b/lib/pathmax.h @@ -0,0 +1,49 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _PATHMAX_H +# define _PATHMAX_H + +# include + +# include + +# 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 +# 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..b4edb68 --- /dev/null +++ b/lib/paxerror.c @@ -0,0 +1,365 @@ +/* Miscellaneous error 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include +#include + +/* 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..1a2e5b5 --- /dev/null +++ b/lib/paxexit.c @@ -0,0 +1,28 @@ +/* Miscellaneous error functions + + Copyright (C) 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include + +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..2fa396a --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef _paxlib_h_ +#define _paxlib_h_ + +#include +#include + +/* 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..80fa83e --- /dev/null +++ b/lib/paxnames.c @@ -0,0 +1,179 @@ +/* This file is part of GNU paxutils + 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include + + +/* 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 LEN-character long prefix of STRING, + otherwise, insert a newly allocated copy of this prefix to TABLE and + return 1. If RETURN_PREFIX is not NULL, point it to the allocated + copy. */ +static bool +hash_string_insert_prefix (Hash_table **table, char const *string, size_t len, + const char **return_prefix) +{ + Hash_table *t = *table; + char *s; + char *e; + + if (len) + { + s = xmalloc (len + 1); + memcpy (s, string, len); + s[len] = 0; + } + else + s = xstrdup (string); + + 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) + { + if (return_prefix) + *return_prefix = s; + return 1; + } + else + { + free (s); + return 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) +{ + return hash_string_insert_prefix (table, string, 0, NULL); +} + +/* 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) + { + const char *prefix; + if (hash_string_insert_prefix (&prefix_table[link_target], file_name, + prefix_len, &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..0fc6850 --- /dev/null +++ b/lib/pipe-safer.c @@ -0,0 +1,56 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "unistd-safer.h" + +#include +#include + +/* 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..1b6b0ce --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Written by Paul Eggert . */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "prepargs.h" +#include +#include + +#if HAVE_STRING_H +# include +#endif + +#include + +/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given + as an argument to 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..efe28b4 --- /dev/null +++ b/lib/printf-args.c @@ -0,0 +1,189 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This file can be parametrized with the following macros: + ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. + PRINTF_FETCHARGS Name of the function to be defined. + STATIC Set to 'static' to declare the function static. */ + +#ifndef PRINTF_FETCHARGS +# include +#endif + +/* Specification. */ +#ifndef PRINTF_FETCHARGS +# include "printf-args.h" +#endif + +#ifdef STATIC +STATIC +#endif +int +PRINTF_FETCHARGS (va_list args, arguments *a) +{ + size_t i; + argument *ap; + + for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) + switch (ap->type) + { + case TYPE_SCHAR: + ap->a.a_schar = va_arg (args, /*signed char*/ int); + break; + case TYPE_UCHAR: + ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); + break; + case TYPE_SHORT: + ap->a.a_short = va_arg (args, /*short*/ int); + break; + case TYPE_USHORT: + ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); + break; + case TYPE_INT: + ap->a.a_int = va_arg (args, int); + break; + case TYPE_UINT: + ap->a.a_uint = va_arg (args, unsigned int); + break; + case TYPE_LONGINT: + ap->a.a_longint = va_arg (args, long int); + break; + case TYPE_ULONGINT: + ap->a.a_ulongint = va_arg (args, unsigned long int); + break; +#if HAVE_LONG_LONG_INT + case TYPE_LONGLONGINT: + ap->a.a_longlongint = va_arg (args, long long int); + break; + case TYPE_ULONGLONGINT: + ap->a.a_ulonglongint = va_arg (args, unsigned long long int); + break; +#endif + case TYPE_DOUBLE: + ap->a.a_double = va_arg (args, double); + break; + case TYPE_LONGDOUBLE: + ap->a.a_longdouble = va_arg (args, long double); + break; + case TYPE_CHAR: + ap->a.a_char = va_arg (args, int); + break; +#if HAVE_WINT_T + case TYPE_WIDE_CHAR: + /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by + default argument promotions", this is not the case in mingw32, + where wint_t is 'unsigned short'. */ + ap->a.a_wide_char = + (sizeof (wint_t) < sizeof (int) + ? va_arg (args, int) + : va_arg (args, wint_t)); + break; +#endif + case TYPE_STRING: + ap->a.a_string = va_arg (args, const char *); + /* A null pointer is an invalid argument for "%s", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_string == NULL) + ap->a.a_string = "(NULL)"; + break; +#if HAVE_WCHAR_T + case TYPE_WIDE_STRING: + ap->a.a_wide_string = va_arg (args, const wchar_t *); + /* A null pointer is an invalid argument for "%ls", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_wide_string == NULL) + { + static const wchar_t wide_null_string[] = + { + (wchar_t)'(', + (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', + (wchar_t)')', + (wchar_t)0 + }; + ap->a.a_wide_string = wide_null_string; + } + break; +#endif + case TYPE_POINTER: + ap->a.a_pointer = va_arg (args, void *); + break; + case TYPE_COUNT_SCHAR_POINTER: + ap->a.a_count_schar_pointer = va_arg (args, signed char *); + break; + case TYPE_COUNT_SHORT_POINTER: + ap->a.a_count_short_pointer = va_arg (args, short *); + break; + case TYPE_COUNT_INT_POINTER: + ap->a.a_count_int_pointer = va_arg (args, int *); + break; + case TYPE_COUNT_LONGINT_POINTER: + ap->a.a_count_longint_pointer = va_arg (args, long int *); + break; +#if HAVE_LONG_LONG_INT + case TYPE_COUNT_LONGLONGINT_POINTER: + ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); + break; +#endif +#if ENABLE_UNISTDIO + /* The unistdio extensions. */ + case TYPE_U8_STRING: + ap->a.a_u8_string = va_arg (args, const uint8_t *); + /* A null pointer is an invalid argument for "%U", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_u8_string == NULL) + { + static const uint8_t u8_null_string[] = + { '(', 'N', 'U', 'L', 'L', ')', 0 }; + ap->a.a_u8_string = u8_null_string; + } + break; + case TYPE_U16_STRING: + ap->a.a_u16_string = va_arg (args, const uint16_t *); + /* A null pointer is an invalid argument for "%lU", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_u16_string == NULL) + { + static const uint16_t u16_null_string[] = + { '(', 'N', 'U', 'L', 'L', ')', 0 }; + ap->a.a_u16_string = u16_null_string; + } + break; + case TYPE_U32_STRING: + ap->a.a_u32_string = va_arg (args, const uint32_t *); + /* A null pointer is an invalid argument for "%llU", but in practice + it occurs quite frequently in printf statements that produce + debug output. Use a fallback in this case. */ + if (ap->a.a_u32_string == NULL) + { + static const uint32_t u32_null_string[] = + { '(', 'N', 'U', 'L', 'L', ')', 0 }; + ap->a.a_u32_string = u32_null_string; + } + break; +#endif + default: + /* Unknown type. */ + return -1; + } + return 0; +} diff --git a/lib/printf-args.h b/lib/printf-args.h new file mode 100644 index 0000000..0c1e48c --- /dev/null +++ b/lib/printf-args.h @@ -0,0 +1,156 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _PRINTF_ARGS_H +#define _PRINTF_ARGS_H + +/* This file can be parametrized with the following macros: + ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. + PRINTF_FETCHARGS Name of the function to be declared. + STATIC Set to 'static' to declare the function static. */ + +/* Default parameters. */ +#ifndef PRINTF_FETCHARGS +# define PRINTF_FETCHARGS printf_fetchargs +#endif + +/* Get size_t. */ +#include + +/* Get wchar_t. */ +#if HAVE_WCHAR_T +# include +#endif + +/* Get wint_t. */ +#if HAVE_WINT_T +# include +#endif + +/* Get va_list. */ +#include + + +/* Argument types */ +typedef enum +{ + TYPE_NONE, + TYPE_SCHAR, + TYPE_UCHAR, + TYPE_SHORT, + TYPE_USHORT, + TYPE_INT, + TYPE_UINT, + TYPE_LONGINT, + TYPE_ULONGINT, +#if HAVE_LONG_LONG_INT + TYPE_LONGLONGINT, + TYPE_ULONGLONGINT, +#endif + TYPE_DOUBLE, + TYPE_LONGDOUBLE, + TYPE_CHAR, +#if HAVE_WINT_T + TYPE_WIDE_CHAR, +#endif + TYPE_STRING, +#if HAVE_WCHAR_T + TYPE_WIDE_STRING, +#endif + TYPE_POINTER, + TYPE_COUNT_SCHAR_POINTER, + TYPE_COUNT_SHORT_POINTER, + TYPE_COUNT_INT_POINTER, + TYPE_COUNT_LONGINT_POINTER +#if HAVE_LONG_LONG_INT +, TYPE_COUNT_LONGLONGINT_POINTER +#endif +#if ENABLE_UNISTDIO + /* The unistdio extensions. */ +, TYPE_U8_STRING +, TYPE_U16_STRING +, TYPE_U32_STRING +#endif +} arg_type; + +/* Polymorphic argument */ +typedef struct +{ + arg_type type; + union + { + signed char a_schar; + unsigned char a_uchar; + short a_short; + unsigned short a_ushort; + int a_int; + unsigned int a_uint; + long int a_longint; + unsigned long int a_ulongint; +#if HAVE_LONG_LONG_INT + long long int a_longlongint; + unsigned long long int a_ulonglongint; +#endif + float a_float; + double a_double; + long double a_longdouble; + int a_char; +#if HAVE_WINT_T + wint_t a_wide_char; +#endif + const char* a_string; +#if HAVE_WCHAR_T + const wchar_t* a_wide_string; +#endif + void* a_pointer; + signed char * a_count_schar_pointer; + short * a_count_short_pointer; + int * a_count_int_pointer; + long int * a_count_longint_pointer; +#if HAVE_LONG_LONG_INT + long long int * a_count_longlongint_pointer; +#endif +#if ENABLE_UNISTDIO + /* The unistdio extensions. */ + const uint8_t * a_u8_string; + const uint16_t * a_u16_string; + const uint32_t * a_u32_string; +#endif + } + a; +} +argument; + +typedef struct +{ + size_t count; + argument *arg; +} +arguments; + + +/* Fetch the arguments, putting them into a. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int PRINTF_FETCHARGS (va_list args, arguments *a); + +#endif /* _PRINTF_ARGS_H */ diff --git a/lib/printf-parse.c b/lib/printf-parse.c new file mode 100644 index 0000000..6bb5485 --- /dev/null +++ b/lib/printf-parse.c @@ -0,0 +1,629 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Formatted output to strings. + Copyright (C) 1999-2000, 2002-2003, 2006-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This file can be parametrized with the following macros: + CHAR_T The element type of the format string. + CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters + in the format string are ASCII. + DIRECTIVE Structure denoting a format directive. + Depends on CHAR_T. + DIRECTIVES Structure denoting the set of format directives of a + format string. Depends on CHAR_T. + PRINTF_PARSE Function that parses a format string. + Depends on CHAR_T. + STATIC Set to 'static' to declare the function static. + ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */ + +#ifndef PRINTF_PARSE +# include +#endif + +/* Specification. */ +#ifndef PRINTF_PARSE +# include "printf-parse.h" +#endif + +/* Default parameters. */ +#ifndef PRINTF_PARSE +# define PRINTF_PARSE printf_parse +# define CHAR_T char +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +#endif + +/* Get size_t, NULL. */ +#include + +/* Get intmax_t. */ +#if defined IN_LIBINTL || defined IN_LIBASPRINTF +# if HAVE_STDINT_H_WITH_UINTMAX +# include +# endif +# if HAVE_INTTYPES_H_WITH_UINTMAX +# include +# endif +#else +# include +#endif + +/* malloc(), realloc(), free(). */ +#include + +/* errno. */ +#include + +/* Checked size_t computations. */ +#include "xsize.h" + +#if CHAR_T_ONLY_ASCII +/* c_isascii(). */ +# include "c-ctype.h" +#endif + +#ifdef STATIC +STATIC +#endif +int +PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) +{ + const CHAR_T *cp = format; /* pointer into format */ + size_t arg_posn = 0; /* number of regular arguments consumed */ + size_t d_allocated; /* allocated elements of d->dir */ + size_t a_allocated; /* allocated elements of a->arg */ + size_t max_width_length = 0; + size_t max_precision_length = 0; + + d->count = 0; + d_allocated = 1; + d->dir = (DIRECTIVE *) malloc (d_allocated * sizeof (DIRECTIVE)); + if (d->dir == NULL) + /* Out of memory. */ + goto out_of_memory_1; + + a->count = 0; + a_allocated = 0; + a->arg = NULL; + +#define REGISTER_ARG(_index_,_type_) \ + { \ + size_t n = (_index_); \ + if (n >= a_allocated) \ + { \ + size_t memory_size; \ + argument *memory; \ + \ + a_allocated = xtimes (a_allocated, 2); \ + if (a_allocated <= n) \ + a_allocated = xsum (n, 1); \ + memory_size = xtimes (a_allocated, sizeof (argument)); \ + if (size_overflow_p (memory_size)) \ + /* Overflow, would lead to out of memory. */ \ + goto out_of_memory; \ + memory = (argument *) (a->arg \ + ? realloc (a->arg, memory_size) \ + : malloc (memory_size)); \ + if (memory == NULL) \ + /* Out of memory. */ \ + goto out_of_memory; \ + a->arg = memory; \ + } \ + while (a->count <= n) \ + a->arg[a->count++].type = TYPE_NONE; \ + if (a->arg[n].type == TYPE_NONE) \ + a->arg[n].type = (_type_); \ + else if (a->arg[n].type != (_type_)) \ + /* Ambiguous type for positional argument. */ \ + goto error; \ + } + + while (*cp != '\0') + { + CHAR_T c = *cp++; + if (c == '%') + { + size_t arg_index = ARG_NONE; + DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */ + + /* Initialize the next directive. */ + dp->dir_start = cp - 1; + dp->flags = 0; + dp->width_start = NULL; + dp->width_end = NULL; + dp->width_arg_index = ARG_NONE; + dp->precision_start = NULL; + dp->precision_end = NULL; + dp->precision_arg_index = ARG_NONE; + dp->arg_index = ARG_NONE; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + arg_index = n - 1; + cp = np + 1; + } + } + + /* Read the flags. */ + for (;;) + { + if (*cp == '\'') + { + dp->flags |= FLAG_GROUP; + cp++; + } + else if (*cp == '-') + { + dp->flags |= FLAG_LEFT; + cp++; + } + else if (*cp == '+') + { + dp->flags |= FLAG_SHOWSIGN; + cp++; + } + else if (*cp == ' ') + { + dp->flags |= FLAG_SPACE; + cp++; + } + else if (*cp == '#') + { + dp->flags |= FLAG_ALT; + cp++; + } + else if (*cp == '0') + { + dp->flags |= FLAG_ZERO; + cp++; + } + else + break; + } + + /* Parse the field width. */ + if (*cp == '*') + { + dp->width_start = cp; + cp++; + dp->width_end = cp; + if (max_width_length < 1) + max_width_length = 1; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory later. */ + goto error; + dp->width_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->width_arg_index == ARG_NONE) + { + dp->width_arg_index = arg_posn++; + if (dp->width_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->width_arg_index, TYPE_INT); + } + else if (*cp >= '0' && *cp <= '9') + { + size_t width_length; + + dp->width_start = cp; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->width_end = cp; + width_length = dp->width_end - dp->width_start; + if (max_width_length < width_length) + max_width_length = width_length; + } + + /* Parse the precision. */ + if (*cp == '.') + { + cp++; + if (*cp == '*') + { + dp->precision_start = cp - 1; + cp++; + dp->precision_end = cp; + if (max_precision_length < 2) + max_precision_length = 2; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const CHAR_T *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + size_t n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = xsum (xtimes (n, 10), *np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + if (size_overflow_p (n)) + /* n too large, would lead to out of memory + later. */ + goto error; + dp->precision_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->precision_arg_index == ARG_NONE) + { + dp->precision_arg_index = arg_posn++; + if (dp->precision_arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->precision_arg_index, TYPE_INT); + } + else + { + size_t precision_length; + + dp->precision_start = cp - 1; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->precision_end = cp; + precision_length = dp->precision_end - dp->precision_start; + if (max_precision_length < precision_length) + max_precision_length = precision_length; + } + } + + { + arg_type type; + + /* Parse argument type/size specifiers. */ + { + int flags = 0; + + for (;;) + { + if (*cp == 'h') + { + flags |= (1 << (flags & 1)); + cp++; + } + else if (*cp == 'L') + { + flags |= 4; + cp++; + } + else if (*cp == 'l') + { + flags += 8; + cp++; + } + else if (*cp == 'j') + { + if (sizeof (intmax_t) > sizeof (long)) + { + /* intmax_t = long long */ + flags += 16; + } + else if (sizeof (intmax_t) > sizeof (int)) + { + /* intmax_t = long */ + flags += 8; + } + cp++; + } + else if (*cp == 'z' || *cp == 'Z') + { + /* 'z' is standardized in ISO C 99, but glibc uses 'Z' + because the warning facility in gcc-2.95.2 understands + only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ + if (sizeof (size_t) > sizeof (long)) + { + /* size_t = long long */ + flags += 16; + } + else if (sizeof (size_t) > sizeof (int)) + { + /* size_t = long */ + flags += 8; + } + cp++; + } + else if (*cp == 't') + { + if (sizeof (ptrdiff_t) > sizeof (long)) + { + /* ptrdiff_t = long long */ + flags += 16; + } + else if (sizeof (ptrdiff_t) > sizeof (int)) + { + /* ptrdiff_t = long */ + flags += 8; + } + cp++; + } +#if defined __APPLE__ && defined __MACH__ + /* On MacOS X 10.3, PRIdMAX is defined as "qd". + We cannot change it to "lld" because PRIdMAX must also + be understood by the system's printf routines. */ + else if (*cp == 'q') + { + if (64 / 8 > sizeof (long)) + { + /* int64_t = long long */ + flags += 16; + } + else + { + /* int64_t = long */ + flags += 8; + } + cp++; + } +#endif +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + /* On native Win32, PRIdMAX is defined as "I64d". + We cannot change it to "lld" because PRIdMAX must also + be understood by the system's printf routines. */ + else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4') + { + if (64 / 8 > sizeof (long)) + { + /* __int64 = long long */ + flags += 16; + } + else + { + /* __int64 = long */ + flags += 8; + } + cp += 3; + } +#endif + else + break; + } + + /* Read the conversion character. */ + c = *cp++; + switch (c) + { + case 'd': case 'i': +#if HAVE_LONG_LONG_INT + /* If 'long long' exists and is larger than 'long': */ + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGLONGINT; + else +#endif + /* If 'long long' exists and is the same as 'long', we parse + "lld" into TYPE_LONGINT. */ + if (flags >= 8) + type = TYPE_LONGINT; + else if (flags & 2) + type = TYPE_SCHAR; + else if (flags & 1) + type = TYPE_SHORT; + else + type = TYPE_INT; + break; + case 'o': case 'u': case 'x': case 'X': +#if HAVE_LONG_LONG_INT + /* If 'long long' exists and is larger than 'long': */ + if (flags >= 16 || (flags & 4)) + type = TYPE_ULONGLONGINT; + else +#endif + /* If 'unsigned long long' exists and is the same as + 'unsigned long', we parse "llu" into TYPE_ULONGINT. */ + if (flags >= 8) + type = TYPE_ULONGINT; + else if (flags & 2) + type = TYPE_UCHAR; + else if (flags & 1) + type = TYPE_USHORT; + else + type = TYPE_UINT; + break; + case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGDOUBLE; + else + type = TYPE_DOUBLE; + break; + case 'c': + if (flags >= 8) +#if HAVE_WINT_T + type = TYPE_WIDE_CHAR; +#else + goto error; +#endif + else + type = TYPE_CHAR; + break; +#if HAVE_WINT_T + case 'C': + type = TYPE_WIDE_CHAR; + c = 'c'; + break; +#endif + case 's': + if (flags >= 8) +#if HAVE_WCHAR_T + type = TYPE_WIDE_STRING; +#else + goto error; +#endif + else + type = TYPE_STRING; + break; +#if HAVE_WCHAR_T + case 'S': + type = TYPE_WIDE_STRING; + c = 's'; + break; +#endif + case 'p': + type = TYPE_POINTER; + break; + case 'n': +#if HAVE_LONG_LONG_INT + /* If 'long long' exists and is larger than 'long': */ + if (flags >= 16 || (flags & 4)) + type = TYPE_COUNT_LONGLONGINT_POINTER; + else +#endif + /* If 'long long' exists and is the same as 'long', we parse + "lln" into TYPE_COUNT_LONGINT_POINTER. */ + if (flags >= 8) + type = TYPE_COUNT_LONGINT_POINTER; + else if (flags & 2) + type = TYPE_COUNT_SCHAR_POINTER; + else if (flags & 1) + type = TYPE_COUNT_SHORT_POINTER; + else + type = TYPE_COUNT_INT_POINTER; + break; +#if ENABLE_UNISTDIO + /* The unistdio extensions. */ + case 'U': + if (flags >= 16) + type = TYPE_U32_STRING; + else if (flags >= 8) + type = TYPE_U16_STRING; + else + type = TYPE_U8_STRING; + break; +#endif + case '%': + type = TYPE_NONE; + break; + default: + /* Unknown conversion character. */ + goto error; + } + } + + if (type != TYPE_NONE) + { + dp->arg_index = arg_index; + if (dp->arg_index == ARG_NONE) + { + dp->arg_index = arg_posn++; + if (dp->arg_index == ARG_NONE) + /* arg_posn wrapped around. */ + goto error; + } + REGISTER_ARG (dp->arg_index, type); + } + dp->conversion = c; + dp->dir_end = cp; + } + + d->count++; + if (d->count >= d_allocated) + { + size_t memory_size; + DIRECTIVE *memory; + + d_allocated = xtimes (d_allocated, 2); + memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); + if (size_overflow_p (memory_size)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + memory = (DIRECTIVE *) realloc (d->dir, memory_size); + if (memory == NULL) + /* Out of memory. */ + goto out_of_memory; + d->dir = memory; + } + } +#if CHAR_T_ONLY_ASCII + else if (!c_isascii (c)) + { + /* Non-ASCII character. Not supported. */ + goto error; + } +#endif + } + d->dir[d->count].dir_start = cp; + + d->max_width_length = max_width_length; + d->max_precision_length = max_precision_length; + return 0; + +error: + if (a->arg) + free (a->arg); + if (d->dir) + free (d->dir); + errno = EINVAL; + return -1; + +out_of_memory: + if (a->arg) + free (a->arg); + if (d->dir) + free (d->dir); +out_of_memory_1: + errno = ENOMEM; + return -1; +} + +#undef PRINTF_PARSE +#undef DIRECTIVES +#undef DIRECTIVE +#undef CHAR_T_ONLY_ASCII +#undef CHAR_T diff --git a/lib/printf-parse.h b/lib/printf-parse.h new file mode 100644 index 0000000..31064c6 --- /dev/null +++ b/lib/printf-parse.h @@ -0,0 +1,181 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Parse printf format string. + 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 + +/* This file can be parametrized with the following macros: + ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. + STATIC Set to 'static' to declare the function static. */ + +#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) + +/* xxx_directive: A parsed directive. + xxx_directives: A parsed format string. */ + +/* A parsed directive. */ +typedef struct +{ + const char* dir_start; + const char* dir_end; + int flags; + const char* width_start; + const char* width_end; + size_t width_arg_index; + const char* precision_start; + const char* precision_end; + size_t precision_arg_index; + char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ + size_t arg_index; +} +char_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + char_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +char_directives; + +#if ENABLE_UNISTDIO + +/* A parsed directive. */ +typedef struct +{ + const uint8_t* dir_start; + const uint8_t* dir_end; + int flags; + const uint8_t* width_start; + const uint8_t* width_end; + size_t width_arg_index; + const uint8_t* precision_start; + const uint8_t* precision_end; + size_t precision_arg_index; + uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ + size_t arg_index; +} +u8_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + u8_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +u8_directives; + +/* A parsed directive. */ +typedef struct +{ + const uint16_t* dir_start; + const uint16_t* dir_end; + int flags; + const uint16_t* width_start; + const uint16_t* width_end; + size_t width_arg_index; + const uint16_t* precision_start; + const uint16_t* precision_end; + size_t precision_arg_index; + uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ + size_t arg_index; +} +u16_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + u16_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +u16_directives; + +/* A parsed directive. */ +typedef struct +{ + const uint32_t* dir_start; + const uint32_t* dir_end; + int flags; + const uint32_t* width_start; + const uint32_t* width_end; + size_t width_arg_index; + const uint32_t* precision_start; + const uint32_t* precision_end; + size_t precision_arg_index; + uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */ + size_t arg_index; +} +u32_directive; + +/* A parsed format string. */ +typedef struct +{ + size_t count; + u32_directive *dir; + size_t max_width_length; + size_t max_precision_length; +} +u32_directives; + +#endif + + +/* Parses the format string. Fills in the number N of directives, and fills + in directives[0], ..., directives[N-1], and sets directives[N].dir_start + to the end of the format string. Also fills in the arg_type fields of the + arguments and the needed count of arguments. */ +#if ENABLE_UNISTDIO +extern int + ulc_printf_parse (const char *format, char_directives *d, arguments *a); +extern int + u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a); +extern int + u16_printf_parse (const uint16_t *format, u16_directives *d, + arguments *a); +extern int + u32_printf_parse (const uint32_t *format, u32_directives *d, + arguments *a); +#else +# ifdef STATIC +STATIC +# else +extern +# endif +int printf_parse (const char *format, char_directives *d, arguments *a); +#endif + +#endif /* _PRINTF_PARSE_H */ diff --git a/lib/quote.c b/lib/quote.c new file mode 100644 index 0000000..5e8b764 --- /dev/null +++ b/lib/quote.c @@ -0,0 +1,40 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include + +#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..c3660b1 --- /dev/null +++ b/lib/quote.h @@ -0,0 +1,21 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +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..75fbc72 --- /dev/null +++ b/lib/quotearg.c @@ -0,0 +1,816 @@ +/* quotearg.c - quote arguments for output + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, + 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#include + +#include "quotearg.h" + +#include "xalloc.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#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; + + /* Additional flags. Bitwise combination of enum quoting_flags. */ + int flags; + + /* Quote the characters indicated by this bit vector even if the + quoting style would not normally require them to be quoted. */ + unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1]; +}; + +/* Names of quoting styles. */ +char const *const quoting_style_args[] = +{ + "literal", + "shell", + "shell-always", + "c", + "c-maybe", + "escape", + "locale", + "clocale", + 0 +}; + +/* Correspondences to quoting style names. */ +enum quoting_style const quoting_style_vals[] = +{ + literal_quoting_style, + shell_quoting_style, + shell_always_quoting_style, + c_quoting_style, + c_maybe_quoting_style, + escape_quoting_style, + locale_quoting_style, + clocale_quoting_style +}; + +/* The default quoting options. */ +static struct quoting_options default_quoting_options; + +/* Allocate a new set of quoting options, with contents initially identical + to O if O is not null, or to the default if O is null. + It is the caller's responsibility to free the result. */ +struct quoting_options * +clone_quoting_options (struct quoting_options *o) +{ + int e = errno; + struct quoting_options *p = xmemdup (o ? o : &default_quoting_options, + sizeof *o); + errno = e; + return p; +} + +/* Get the value of O's quoting style. If O is null, use the default. */ +enum quoting_style +get_quoting_style (struct quoting_options *o) +{ + return (o ? o : &default_quoting_options)->style; +} + +/* In O (or in the default if O is null), + set the value of the quoting style to S. */ +void +set_quoting_style (struct quoting_options *o, enum quoting_style s) +{ + (o ? o : &default_quoting_options)->style = s; +} + +/* In O (or in the default if O is null), + set the value of the quoting options for character C to I. + Return the old value. Currently, the only values defined for I are + 0 (the default) and 1 (which means to quote the character even if + it would not otherwise be quoted). */ +int +set_char_quoting (struct quoting_options *o, char c, int i) +{ + unsigned char uc = c; + unsigned int *p = + (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS; + int shift = uc % INT_BITS; + int r = (*p >> shift) & 1; + *p ^= ((i & 1) ^ r) << shift; + return r; +} + +/* In O (or in the default if O is null), + set the value of the quoting options flag to I, which can be a + bitwise combination of enum quoting_flags, or 0 for default + behavior. Return the old value. */ +int +set_quoting_flags (struct quoting_options *o, int i) +{ + int r; + if (!o) + o = &default_quoting_options; + r = o->flags; + o->flags = i; + return r; +} + +/* 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; + o.flags = 0; + memset (o.quote_these_too, 0, sizeof o.quote_these_too); + return o; +} + +/* 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, FLAGS, and + QUOTE_THESE_TOO to control quoting. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE. + + This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG, + ARGSIZE, O), except it breaks O into its component pieces and is + not careful about errno. */ + +static size_t +quotearg_buffer_restyled (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + enum quoting_style quoting_style, int flags, + unsigned int const *quote_these_too) +{ + 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; + bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0; + +#define STORE(c) \ + do \ + { \ + if (len < buffersize) \ + buffer[len] = (c); \ + len++; \ + } \ + while (0) + + switch (quoting_style) + { + case c_maybe_quoting_style: + quoting_style = c_quoting_style; + elide_outer_quotes = true; + /* Fall through. */ + case c_quoting_style: + if (!elide_outer_quotes) + STORE ('"'); + backslash_escapes = true; + quote_string = "\""; + quote_string_len = 1; + break; + + case escape_quoting_style: + backslash_escapes = true; + elide_outer_quotes = false; + break; + + case locale_quoting_style: + case clocale_quoting_style: + { + /* 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 + + and use glyphs suitable for your language. */ + + char const *left = gettext_quote (N_("`"), quoting_style); + char const *right = gettext_quote (N_("'"), quoting_style); + if (!elide_outer_quotes) + 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_quoting_style: + quoting_style = shell_always_quoting_style; + elide_outer_quotes = true; + /* Fall through. */ + case shell_always_quoting_style: + if (!elide_outer_quotes) + STORE ('\''); + quote_string = "'"; + quote_string_len = 1; + break; + + case literal_quoting_style: + elide_outer_quotes = false; + break; + + default: + abort (); + } + + for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++) + { + unsigned char c; + unsigned char esc; + + if (backslash_escapes + && quote_string_len + && i + quote_string_len <= argsize + && memcmp (arg + i, quote_string, quote_string_len) == 0) + { + if (elide_outer_quotes) + goto force_outer_quoting_style; + STORE ('\\'); + } + + c = arg[i]; + switch (c) + { + case '\0': + if (backslash_escapes) + { + if (elide_outer_quotes) + goto force_outer_quoting_style; + STORE ('\\'); + if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9') + { + STORE ('0'); + STORE ('0'); + } + c = '0'; + } + else if (flags & QA_ELIDE_NULL_BYTES) + continue; + break; + + case '?': + switch (quoting_style) + { + case shell_always_quoting_style: + if (elide_outer_quotes) + goto force_outer_quoting_style; + break; + + case c_quoting_style: + if ((flags & QA_SPLIT_TRIGRAPHS) + && i + 2 < argsize && arg[i + 1] == '?') + switch (arg[i + 2]) + { + case '!': case '\'': + case '(': case ')': case '-': case '/': + case '<': case '=': case '>': + /* Escape the second '?' in what would otherwise be + a trigraph. */ + if (elide_outer_quotes) + goto force_outer_quoting_style; + c = arg[i + 2]; + i += 2; + STORE ('?'); + STORE ('"'); + STORE ('"'); + STORE ('?'); + break; + + default: + break; + } + break; + + default: + break; + } + break; + + case '\a': esc = 'a'; goto c_escape; + case '\b': esc = 'b'; goto c_escape; + case '\f': esc = 'f'; goto c_escape; + case '\n': esc = 'n'; goto c_and_shell_escape; + case '\r': esc = 'r'; goto c_and_shell_escape; + case '\t': esc = 't'; goto c_and_shell_escape; + case '\v': esc = 'v'; goto c_escape; + case '\\': esc = c; + /* No need to escape the escape if we are trying to elide + outer quotes and nothing else is problematic. */ + if (backslash_escapes && elide_outer_quotes && quote_string_len) + goto store_c; + + c_and_shell_escape: + if (quoting_style == shell_always_quoting_style + && elide_outer_quotes) + goto force_outer_quoting_style; + /* Fall through. */ + c_escape: + if (backslash_escapes) + { + c = esc; + goto store_escape; + } + break; + + case '{': case '}': /* sometimes special if isolated */ + if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1)) + break; + /* 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_always_quoting_style + && elide_outer_quotes) + goto force_outer_quoting_style; + break; + + case '\'': + if (quoting_style == shell_always_quoting_style) + { + if (elide_outer_quotes) + goto force_outer_quoting_style; + STORE ('\''); + STORE ('\\'); + STORE ('\''); + } + 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 && elide_outer_quotes + && quoting_style == shell_always_quoting_style) + { + size_t j; + for (j = 1; j < bytes; j++) + switch (arg[i + m + j]) + { + case '[': case '\\': case '^': + case '`': case '|': + goto force_outer_quoting_style; + + default: + break; + } + } + + if (! iswprint (w)) + printable = false; + m += bytes; + } + } + while (! mbsinit (&mbstate)); + } + + 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) + { + if (elide_outer_quotes) + goto force_outer_quoting_style; + 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 || elide_outer_quotes) + && quote_these_too + && quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))) + goto store_c; + + store_escape: + if (elide_outer_quotes) + goto force_outer_quoting_style; + STORE ('\\'); + + store_c: + STORE (c); + } + + if (len == 0 && quoting_style == shell_always_quoting_style + && elide_outer_quotes) + goto force_outer_quoting_style; + + if (quote_string && !elide_outer_quotes) + for (; *quote_string; quote_string++) + STORE (*quote_string); + + if (len < buffersize) + buffer[len] = '\0'; + return len; + + force_outer_quoting_style: + /* Don't reuse quote_these_too, since the addition of outer quotes + sufficiently quotes the specified characters. */ + return quotearg_buffer_restyled (buffer, buffersize, arg, argsize, + quoting_style, + flags & ~QA_ELIDE_OUTER_QUOTES, NULL); +} + +/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of + argument ARG (of size ARGSIZE), using O to control quoting. + If O is null, use the default. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is SIZE_MAX, use the string length of the argument for + ARGSIZE. */ +size_t +quotearg_buffer (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + struct quoting_options const *o) +{ + struct quoting_options const *p = o ? o : &default_quoting_options; + int e = errno; + size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize, + p->style, p->flags, p->quote_these_too); + errno = e; + return r; +} + +/* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */ +char * +quotearg_alloc (char const *arg, size_t argsize, + struct quoting_options const *o) +{ + return quotearg_alloc_mem (arg, argsize, NULL, o); +} + +/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly + allocated storage containing the quoted string, and store the + resulting size into *SIZE, if non-NULL. The result can contain + embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not + NULL, and set_quoting_flags has not set the null byte elision + flag. */ +char * +quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size, + struct quoting_options const *o) +{ + struct quoting_options const *p = o ? o : &default_quoting_options; + int e = errno; + /* Elide embedded null bytes if we can't return a size. */ + int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES); + size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style, + flags, p->quote_these_too) + 1; + char *buf = xcharalloc (bufsize); + quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags, + p->quote_these_too); + errno = e; + if (size) + *size = bufsize - 1; + return buf; +} + +/* A storage slot with size and pointer to a value. */ +struct slotvec +{ + size_t size; + char *val; +}; + +/* Preallocate a slot 0 buffer, so that the caller can always quote + one small component of a "memory exhausted" message in slot 0. */ +static char slot0[256]; +static 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; + /* Elide embedded null bytes since we don't return a size. */ + int flags = options->flags | QA_ELIDE_NULL_BYTES; + size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize, + options->style, flags, + options->quote_these_too); + + if (size <= qsize) + { + sv[n].size = size = qsize + 1; + if (val != slot0) + free (val); + sv[n].val = val = xcharalloc (size); + quotearg_buffer_restyled (val, size, arg, argsize, options->style, + flags, options->quote_these_too); + } + + errno = e; + return val; + } +} + +char * +quotearg_n (int n, char const *arg) +{ + return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options); +} + +char * +quotearg_n_mem (int n, char const *arg, size_t argsize) +{ + return quotearg_n_options (n, arg, argsize, &default_quoting_options); +} + +char * +quotearg (char const *arg) +{ + return quotearg_n (0, arg); +} + +char * +quotearg_mem (char const *arg, size_t argsize) +{ + return quotearg_n_mem (0, arg, argsize); +} + +char * +quotearg_n_style (int n, enum quoting_style s, char const *arg) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, SIZE_MAX, &o); +} + +char * +quotearg_n_style_mem (int n, enum quoting_style s, + char const *arg, size_t argsize) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, argsize, &o); +} + +char * +quotearg_style (enum quoting_style s, char const *arg) +{ + return quotearg_n_style (0, s, arg); +} + +char * +quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize) +{ + return quotearg_n_style_mem (0, s, arg, argsize); +} + +char * +quotearg_char_mem (char const *arg, size_t argsize, char ch) +{ + struct quoting_options options; + options = default_quoting_options; + set_char_quoting (&options, ch, 1); + return quotearg_n_options (0, arg, argsize, &options); +} + +char * +quotearg_char (char const *arg, char ch) +{ + return quotearg_char_mem (arg, SIZE_MAX, ch); +} + +char * +quotearg_colon (char const *arg) +{ + return quotearg_char (arg, ':'); +} + +char * +quotearg_colon_mem (char const *arg, size_t argsize) +{ + return quotearg_char_mem (arg, argsize, ':'); +} diff --git a/lib/quotearg.h b/lib/quotearg.h new file mode 100644 index 0000000..7700107 --- /dev/null +++ b/lib/quotearg.h @@ -0,0 +1,305 @@ +/* quotearg.h - quote arguments for output + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2006, 2008 Free + Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert */ + +#ifndef QUOTEARG_H_ +# define QUOTEARG_H_ 1 + +# include + +/* Basic quoting styles. For each style, an example is given on the + input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using + quotearg_buffer, quotearg_mem, and quotearg_colon_mem with that + style and the default flags and quoted characters. Note that the + examples are shown here as valid C strings rather than what + displays on a terminal (with "??/" as a trigraph for "\\"). */ +enum quoting_style + { + /* Output names as-is (ls --quoting-style=literal). Can result in + embedded null bytes if QA_ELIDE_NULL_BYTES is not in + effect. + + quotearg_buffer: + "simple", "\0 \t\n'\"\033??/\\", "a:b" + quotearg: + "simple", " \t\n'\"\033??/\\", "a:b" + quotearg_colon: + "simple", " \t\n'\"\033??/\\", "a:b" + */ + literal_quoting_style, + + /* Quote names for the shell if they contain shell metacharacters + or would cause ambiguous output (ls --quoting-style=shell). + Can result in embedded null bytes if QA_ELIDE_NULL_BYTES is not + in effect. + + quotearg_buffer: + "simple", "'\0 \t\n'\\''\"\033??/\\'", "a:b" + quotearg: + "simple", "' \t\n'\\''\"\033??/\\'", "a:b" + quotearg_colon: + "simple", "' \t\n'\\''\"\033??/\\'", "'a:b'" + */ + shell_quoting_style, + + /* Quote names for the shell, even if they would normally not + require quoting (ls --quoting-style=shell-always). Can result + in embedded null bytes if QA_ELIDE_NULL_BYTES is not in effect. + Behaves like shell_quoting_style if QA_ELIDE_OUTER_QUOTES is in + effect. + + quotearg_buffer: + "'simple'", "'\0 \t\n'\\''\"\033??/\\'", "'a:b'" + quotearg: + "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'" + quotearg_colon: + "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'" + */ + shell_always_quoting_style, + + /* Quote names as for a C language string (ls --quoting-style=c). + Behaves like c_maybe_quoting_style if QA_ELIDE_OUTER_QUOTES is + in effect. Split into consecutive strings if + QA_SPLIT_TRIGRAPHS. + + quotearg_buffer: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\"" + quotearg: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\"" + quotearg_colon: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\"" + */ + c_quoting_style, + + /* Like c_quoting_style except omit the surrounding double-quote + characters if no quoted characters are encountered. + + quotearg_buffer: + "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b" + quotearg: + "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b" + quotearg_colon: + "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\"" + */ + c_maybe_quoting_style, + + /* Like c_quoting_style except always omit the surrounding + double-quote characters (ls --quoting-style=escape). + + quotearg_buffer: + "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b" + quotearg: + "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b" + quotearg_colon: + "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a\\:b" + */ + escape_quoting_style, + + /* Like clocale_quoting_style, but quote `like this' instead of + "like this" in the default C locale (ls --quoting-style=locale). + + LC_MESSAGES=C + quotearg_buffer: + "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'" + quotearg: + "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'" + quotearg_colon: + "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a\\:b'" + + LC_MESSAGES=pt_PT.utf8 + quotearg_buffer: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273" + quotearg: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273" + quotearg_colon: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273" + */ + locale_quoting_style, + + /* Like c_quoting_style except use quotation marks appropriate for + the locale (ls --quoting-style=clocale). + + LC_MESSAGES=C + quotearg_buffer: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\"" + quotearg: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\"" + quotearg_colon: + "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\"" + + LC_MESSAGES=pt_PT.utf8 + quotearg_buffer: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273" + quotearg: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273" + quotearg_colon: + "\302\253simple\302\273", + "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273" + */ + clocale_quoting_style + }; + +/* Flags for use in set_quoting_flags. */ +enum quoting_flags + { + /* Always elide null bytes from styles that do not quote them, + even when the length of the result is available to the + caller. */ + QA_ELIDE_NULL_BYTES = 0x01, + + /* Omit the surrounding quote characters if no escaped characters + are encountered. Note that if no other character needs + escaping, then neither does the escape character. */ + QA_ELIDE_OUTER_QUOTES = 0x02, + + /* In the c_quoting_style and c_maybe_quoting_style, split ANSI + trigraph sequences into concatenated strings (for example, + "?""?/" rather than "??/", which could be confused with + "\\"). */ + QA_SPLIT_TRIGRAPHS = 0x04 + }; + +/* For now, --quoting-style=literal is the default, but this may change. */ +# ifndef DEFAULT_QUOTING_STYLE +# define DEFAULT_QUOTING_STYLE literal_quoting_style +# endif + +/* Names of quoting styles and their corresponding values. */ +extern char const *const quoting_style_args[]; +extern enum quoting_style const quoting_style_vals[]; + +struct quoting_options; + +/* The functions listed below set and use a hidden variable + that contains the default quoting style options. */ + +/* Allocate a new set of quoting options, with contents initially identical + to O if O is not null, or to the default if O is null. + It is the caller's responsibility to free the result. */ +struct quoting_options *clone_quoting_options (struct quoting_options *o); + +/* Get the value of O's quoting style. If O is null, use the default. */ +enum quoting_style get_quoting_style (struct quoting_options *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); + +/* In O (or in the default if O is null), + set the value of the quoting options flag to I, which can be a + bitwise combination of enum quoting_flags, or 0 for default + behavior. Return the old value. */ +int set_quoting_flags (struct quoting_options *o, int i); + +/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of + argument ARG (of size ARGSIZE), using O to control quoting. + If O is null, use the default. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is -1, use the string length of the argument for ARGSIZE. + On output, BUFFER might contain embedded null bytes if ARGSIZE was + not -1, the style of O does not use backslash escapes, and the + flags of O do not request elision of null bytes.*/ +size_t quotearg_buffer (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + struct quoting_options const *o); + +/* Like quotearg_buffer, except return the result in a newly allocated + buffer. It is the caller's responsibility to free the result. The + result will not contain embedded null bytes. */ +char *quotearg_alloc (char const *arg, size_t argsize, + struct quoting_options const *o); + +/* Like quotearg_alloc, except that the length of the result, + excluding the terminating null byte, is stored into SIZE if it is + non-NULL. The result might contain embedded null bytes if ARGSIZE + was not -1, SIZE was not NULL, the style of O does not use + backslash escapes, and the flags of O do not request elision of + null bytes.*/ +char *quotearg_alloc_mem (char const *arg, size_t argsize, + size_t *size, struct quoting_options const *o); + +/* Use storage slot N to return a quoted version of the string ARG. + Use the default quoting options. + The returned value points to static storage that can be + reused by the next call to this function with the same value of N. + N must be nonnegative. The output of all functions in the + quotearg_n family are guaranteed to not contain embedded null + bytes.*/ +char *quotearg_n (int n, char const *arg); + +/* Equivalent to quotearg_n (0, ARG). */ +char *quotearg (char const *arg); + +/* Use storage slot N to return a quoted version of the argument ARG + of size ARGSIZE. This is like quotearg_n (N, ARG), except it can + quote null bytes. */ +char *quotearg_n_mem (int n, char const *arg, size_t argsize); + +/* Equivalent to quotearg_n_mem (0, ARG, ARGSIZE). */ +char *quotearg_mem (char const *arg, size_t argsize); + +/* Use style S and storage slot N to return a quoted version of the string ARG. + This is like quotearg_n (N, ARG), except that it uses S with no other + options to specify the quoting method. */ +char *quotearg_n_style (int n, enum quoting_style s, char const *arg); + +/* Use style S and storage slot N to return a quoted version of the + argument ARG of size ARGSIZE. This is like quotearg_n_style + (N, S, ARG), except it can quote null bytes. */ +char *quotearg_n_style_mem (int n, enum quoting_style s, + char const *arg, size_t argsize); + +/* Equivalent to quotearg_n_style (0, S, ARG). */ +char *quotearg_style (enum quoting_style s, char const *arg); + +/* Equivalent to quotearg_n_style_mem (0, S, ARG, ARGSIZE). */ +char *quotearg_style_mem (enum quoting_style s, + char const *arg, size_t argsize); + +/* Like quotearg (ARG), except also quote any instances of CH. */ +char *quotearg_char (char const *arg, char ch); + +/* Like quotearg_char (ARG, CH), except it can quote null bytes. */ +char *quotearg_char_mem (char const *arg, size_t argsize, char ch); + +/* Equivalent to quotearg_char (ARG, ':'). */ +char *quotearg_colon (char const *arg); + +/* Like quotearg_colon (ARG), except it can quote null bytes. */ +char *quotearg_colon_mem (char const *arg, size_t argsize); + +/* 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..5cccdc9 --- /dev/null +++ b/lib/readlink.c @@ -0,0 +1,49 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include + +#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/realloc.c b/lib/realloc.c new file mode 100644 index 0000000..b61c2ca --- /dev/null +++ b/lib/realloc.c @@ -0,0 +1,87 @@ +/* realloc() function that is glibc compatible. + + Copyright (C) 1997, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* written by Jim Meyering and Bruno Haible */ + +#include + +/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */ +#ifdef realloc +# define NEED_REALLOC_GNU 1 +#endif + +/* Infer the properties of the system's malloc function. + Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */ +#if GNULIB_MALLOC_GNU && !defined malloc +# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1 +#endif + +/* Below we want to call the system's malloc and realloc. + Undefine the symbols here so that including provides a + declaration of malloc(), not of rpl_malloc(), and likewise for realloc. */ +#undef malloc +#undef realloc + +/* Specification. */ +#include + +#include + +/* Below we want to call the system's malloc and realloc. + Undefine the symbols, if they were defined by gnulib's + replacement. */ +#undef malloc +#undef realloc + +/* Change the size of an allocated block of memory P to N bytes, + with error checking. If N is zero, change it to 1. If P is NULL, + use malloc. */ + +void * +rpl_realloc (void *p, size_t n) +{ + void *result; + +#if NEED_REALLOC_GNU + if (n == 0) + { + n = 1; + + /* In theory realloc might fail, so don't rely on it to free. */ + free (p); + p = NULL; + } +#endif + + if (p == NULL) + { +#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE + if (n == 0) + n = 1; +#endif + result = malloc (n); + } + else + result = realloc (p, n); + +#if !HAVE_REALLOC_POSIX + if (result == NULL) + errno = ENOMEM; +#endif + + return result; +} diff --git a/lib/ref-add.sin b/lib/ref-add.sin new file mode 100644 index 0000000..222d752 --- /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 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Written by Bruno Haible . +# +/^# 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..1bf073e --- /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 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Written by Bruno Haible . +# +/^# 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..5ef1c72 --- /dev/null +++ b/lib/regcomp.c @@ -0,0 +1,3834 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 (®exp, 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 (®exp); + 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 (®exp, 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 (®exp); + + 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.ctx_type) + { + 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 : + CAT + / \ + / \ + 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 (¤t_token, regexp, syntax | RE_CARET_ANCHORS_HERE); + tree = parse_reg_exp (regexp, preg, ¤t_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 + |: + ALT + / \ + / \ + + + 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 + : + CAT + / \ + / \ + + + 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 "", + it must not be "". */ + 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 + (): + SUBEXP + | + +*/ + +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; /* {} 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 "{n,m}" to "...{0,}". */ + 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 {0,n} as ((...?)?)?... 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 [::], [..], and + [==]. */ + +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 + /* 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..4b13ec5 --- /dev/null +++ b/lib/regex.c @@ -0,0 +1,73 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* 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 , which correctly + #undefs RE_DUP_MAX and sets it to the right value. */ +#include + +#include +#include "regex_internal.h" + +#include "regex_internal.c" +#include "regcomp.c" +#include "regexec.c" + +/* Binary backward compatibility. */ +#if _LIBC +# include +# 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..f1d584d --- /dev/null +++ b/lib/regex.h @@ -0,0 +1,677 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 + +/* 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 \ matches . + If not set, then \ 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 , 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..f1a6edd --- /dev/null +++ b/lib/regex_internal.c @@ -0,0 +1,1743 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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: + (0), (1), (0), (1), + Then wide character buffer will be: + , WEOF , , WEOF , + 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..5f75169 --- /dev/null +++ b/lib/regex_internal.h @@ -0,0 +1,859 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +#include +#include +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "localcharset.h" +#endif +#if defined HAVE_LOCALE_H || defined _LIBC +# include +#endif + +#include +#include +#include +#if defined _LIBC +# include +#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 && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK)) +# define isblank(ch) ((ch) == ' ' || (ch) == '\t') +#endif + +#ifdef _LIBC +# ifndef _RE_DEFINE_LOCALE_FUNCTIONS +# define _RE_DEFINE_LOCALE_FUNCTIONS 1 +# include +# include +# include +# endif +#endif + +/* This is for other GNU distributions with internationalized messages. */ +#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# 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 + +#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 + 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..6555498 --- /dev/null +++ b/lib/regexec.c @@ -0,0 +1,4401 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +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: + ( ) + ( ) + ( ) */ + 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 + + /* 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..113d13c --- /dev/null +++ b/lib/rmdir.c @@ -0,0 +1,73 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include +#include +#include + +/* 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..50f037c --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 `/...//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..826bc4c --- /dev/null +++ b/lib/rpmatch.c @@ -0,0 +1,78 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include +#include + +#if ENABLE_NLS +# include +# include +# include +# 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..51faf3c --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 +#include + +/* 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 +# endif +# if HAVE_SYS_INET_H +# include +# endif +# ifndef EOPNOTSUPP +# define EOPNOTSUPP EINVAL +# endif +#endif + +#include + +#if HAVE_NETDB_H +# include +#endif + +#include +#include + +/* 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 = last_component (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..0cb1ede --- /dev/null +++ b/lib/safe-read.c @@ -0,0 +1,77 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#ifdef SAFE_WRITE +# include "safe-write.h" +#else +# include "safe-read.h" +#endif + +/* Get ssize_t. */ +#include +#include + +#include + +#ifdef EINTR +# define IS_EINTR(x) ((x) == EINTR) +#else +# define IS_EINTR(x) 0 +#endif + +#include + +#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 + . + 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..ba19171 --- /dev/null +++ b/lib/safe-read.h @@ -0,0 +1,34 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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..b644f7c --- /dev/null +++ b/lib/safe-write.c @@ -0,0 +1,18 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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..da036a9 --- /dev/null +++ b/lib/safe-write.h @@ -0,0 +1,24 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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..0632711 --- /dev/null +++ b/lib/same-inode.h @@ -0,0 +1,25 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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..e158e8b --- /dev/null +++ b/lib/save-cwd.c @@ -0,0 +1,101 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "save-cwd.h" + +#include +#include +#include +#include +#include + +#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); + free (cwd->name); +} diff --git a/lib/save-cwd.h b/lib/save-cwd.h new file mode 100644 index 0000000..e23eb72 --- /dev/null +++ b/lib/save-cwd.h @@ -0,0 +1,33 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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..b837414 --- /dev/null +++ b/lib/savedir.c @@ -0,0 +1,136 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#include + +#include "savedir.h" + +#include + +#include + +#include +#ifndef _D_EXACT_NAMLEN +# define _D_EXACT_NAMLEN(dp) strlen ((dp)->d_name) +#endif + +#include +#include +#include + +#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..0c69641 --- /dev/null +++ b/lib/savedir.h @@ -0,0 +1,26 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by David MacKenzie . */ + +#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..83b52b8 --- /dev/null +++ b/lib/setenv.c @@ -0,0 +1,330 @@ +/* Copyright (C) 1992,1995-1999,2000-2003,2005-2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if !_LIBC +# include +#endif +#include + +/* Specification. */ +#include + +#include +#ifndef __set_errno +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include +#if _LIBC || HAVE_UNISTD_H +# include +#endif + +#if _LIBC || !HAVE_SETENV + +#if !_LIBC +# include "malloca.h" +#endif + +#if !_LIBC +# define __environ environ +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include +__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 +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 *) malloca (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 + freea (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 + freea (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 = malloca (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 + freea (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 + freea (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/sleep.c b/lib/sleep.c new file mode 100644 index 0000000..9c56b9b --- /dev/null +++ b/lib/sleep.c @@ -0,0 +1,46 @@ +/* Pausing execution of the current thread. + Copyright (C) 2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2007. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +# define WIN32_LEAN_AND_MEAN /* avoid including junk */ +# include + +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/snprintf.c b/lib/snprintf.c new file mode 100644 index 0000000..6ebdaf3 --- /dev/null +++ b/lib/snprintf.c @@ -0,0 +1,74 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2008 Free Software Foundation, Inc. + Written by Simon Josefsson and Paul Eggert. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#include "vasnprintf.h" + +/* Print formatted output to string STR. Similar to sprintf, but + additional length SIZE limit how much is written into STR. Returns + string length of formatted string (which may be larger than SIZE). + STR may be NULL, in which case nothing will be written. On error, + return a negative value. */ +int +snprintf (char *str, size_t size, const char *format, ...) +{ + char *output; + size_t len; + size_t lenbuf = size; + va_list args; + + va_start (args, format); + output = vasnprintf (str, &lenbuf, format, args); + len = lenbuf; + va_end (args); + + if (!output) + return -1; + + if (output != str) + { + if (size) + { + size_t pruned_len = (len < size ? len : size - 1); + memcpy (str, output, pruned_len); + str[pruned_len] = '\0'; + } + + free (output); + } + + if (INT_MAX < len) + { + errno = EOVERFLOW; + return -1; + } + + return len; +} diff --git a/lib/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..8957ab4 --- /dev/null +++ b/lib/stat-time.h @@ -0,0 +1,187 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#ifndef STAT_TIME_H +#define STAT_TIME_H 1 + +#include +#include + +/* 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 + /* Avoid a "parameter unused" warning. */ + (void) st; + 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 + . */ + 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; + /* Avoid a "parameter unused" warning. */ + (void) st; +#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/stdarg.in.h b/lib/stdarg.in.h new file mode 100644 index 0000000..af5bc83 --- /dev/null +++ b/lib/stdarg.in.h @@ -0,0 +1,33 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Substitute for and wrapper around . + Copyright (C) 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GL_STDARG_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDARG_H@ + +#ifndef _GL_STDARG_H +#define _GL_STDARG_H + +#ifndef va_copy +# define va_copy(a,b) ((a) = (b)) +#endif + +#endif /* _GL_STDARG_H */ +#endif /* _GL_STDARG_H */ diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h new file mode 100644 index 0000000..42599f9 --- /dev/null +++ b/lib/stdbool.in.h @@ -0,0 +1,121 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Copyright (C) 2001, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2001. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 for platforms that lack it. */ + +/* Usage suggestions: + + Programs that use should be aware of some limitations + and standards compliance issues. + + Standards compliance: + + - 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: + + - 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 already #defines false 0, true 1. We use the same + definitions below, but temporarily we have to #undef them. */ +#ifdef __BEOS__ +# include /* 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 was working. + So we override the _Bool type. + If !@HAVE__BOOL@: + Need to define _Bool ourselves. As 'signed char' or as an enum type? + Use of a typedef, with SunPRO C, leads to a stupid + "warning: _Bool is a keyword in ISO C99". + Use of an enum type, with IRIX cc, leads to a stupid + "warning(1185): enumerated type mixed with another type". + Even the existence of an enum type, without a typedef, + "Invalid enumerator. (badenum)" with HP-UX cc on Tru64. + The only benefit of the enum, debuggability, is not important + with these compilers. So use 'signed char' and no enum. */ +# define _Bool signed char +# else + /* With this compiler, trust the _Bool type if the compiler has it. */ +# if !@HAVE__BOOL@ +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.in.h b/lib/stdint.in.h new file mode 100644 index 0000000..cbaf697 --- /dev/null +++ b/lib/stdint.in.h @@ -0,0 +1,524 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* + * ISO C 99 for platforms that lack it. + * + */ + +#ifndef _GL_STDINT_H + +/* When including a system file that in turn includes , + use the system , not our substitute. This avoids + problems with (for example) VMS, whose includes + . */ +#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_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 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 . + Include it before , since any "#include " + in would reinclude us, skipping our contents because + _GL_STDINT_H is defined. + The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_STDINT_H@ +#endif + +#if ! defined _GL_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H +#define _GL_STDINT_H + +/* defines some of the stdint.h types as well, on glibc, + IRIX 6.5, and OpenBSD 3.8 (via ). + AIX 5.2 isn't needed and causes troubles. + MacOS X 10.4.6 includes (which is us), but + relies on the system definitions, so include + after @NEXT_STDINT_H@. */ +#if @HAVE_SYS_TYPES_H@ && ! defined _AIX +# include +#endif + +/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */ +#include + +#if @HAVE_INTTYPES_H@ + /* In OpenBSD 3.8, includes , which defines + int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__. + also defines intptr_t and uintptr_t. */ +# include +#elif @HAVE_SYS_INTTYPES_H@ + /* Solaris 7 has the types except the *_fast*_t types, and + the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */ +# include +#endif + +#if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__ + /* Linux libc4 >= 4.6.7 and libc5 have a that defines + int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is + included by . */ +# include +#endif + +#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS + +/* Get WCHAR_MIN, WCHAR_MAX. */ +# if ! (defined WCHAR_MIN && defined WCHAR_MAX) +# include +# endif + +#endif + +#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H + +/* 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) \ + : /* The expression for the unsigned case. The subtraction of (signed) \ + is a nop in the unsigned case and avoids "signed integer overflow" \ + warnings in the signed case. */ \ + ((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 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 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 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 + +/* Verify that intmax_t and uintmax_t have the same size. Too much code + breaks if this is not the case. If this check fails, the reason is likely + to be found in the autoconf macros. */ +typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) - 1]; + +/* 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 /* !defined _GL_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */ diff --git a/lib/stdio.in.h b/lib/stdio.in.h new file mode 100644 index 0000000..3da40fe --- /dev/null +++ b/lib/stdio.in.h @@ -0,0 +1,384 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + Copyright (C) 2004, 2007-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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. */ + +#@INCLUDE_NEXT@ @NEXT_STDIO_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _GL_STDIO_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDIO_H@ + +#ifndef _GL_STDIO_H +#define _GL_STDIO_H + +#include +#include + +#if (@GNULIB_FSEEKO@ && @REPLACE_FSEEKO@) \ + || (@GNULIB_FTELLO@ && @REPLACE_FTELLO@) \ + || (@GNULIB_GETDELIM@ && !@HAVE_DECL_GETDELIM@) \ + || (@GNULIB_GETLINE@ && (!@HAVE_DECL_GETLINE@ || @REPLACE_GETLINE@)) +/* Get off_t and ssize_t. */ +# include +#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 +/* 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_FOPEN@ +# if @REPLACE_FOPEN@ +# define fopen rpl_fopen +extern FILE * fopen (const char *filename, const char *mode); +# endif +#elif defined GNULIB_POSIXCHECK +# undef fopen +# define fopen(f,m) \ + (GL_LINK_WARNING ("fopen on Win32 platforms is not POSIX compatible - " \ + "use gnulib module fopen for portability"), \ + fopen (f, m)) +#endif + +#if @GNULIB_FREOPEN@ +# if @REPLACE_FREOPEN@ +# define freopen rpl_freopen +extern FILE * freopen (const char *filename, const char *mode, FILE *stream); +# endif +#elif defined GNULIB_POSIXCHECK +# undef freopen +# define freopen(f,m,s) \ + (GL_LINK_WARNING ("freopen on Win32 platforms is not POSIX compatible - " \ + "use gnulib module freopen for portability"), \ + freopen (f, m, s)) +#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 + +#if @GNULIB_GETDELIM@ +# if !@HAVE_DECL_GETDELIM@ +/* Read input, up to (and including) the next occurrence of DELIMITER, from + STREAM, store it in *LINEPTR (and NUL-terminate it). + *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE + bytes of space. It is realloc'd as necessary. + Return the number of bytes read and stored at *LINEPTR (not including the + NUL terminator), or -1 on error or EOF. */ +extern ssize_t getdelim (char **lineptr, size_t *linesize, int delimiter, + FILE *stream); +# endif +#elif defined GNULIB_POSIXCHECK +# undef getdelim +# define getdelim(l, s, d, f) \ + (GL_LINK_WARNING ("getdelim is unportable - " \ + "use gnulib module getdelim for portability"), \ + getdelim (l, s, d, f)) +#endif + +#if @GNULIB_GETLINE@ +# if @REPLACE_GETLINE@ +# undef getline +# define getline rpl_getline +# endif +# if !@HAVE_DECL_GETLINE@ || @REPLACE_GETLINE@ +/* Read a line, up to (and including) the next newline, from STREAM, store it + in *LINEPTR (and NUL-terminate it). + *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE + bytes of space. It is realloc'd as necessary. + Return the number of bytes read and stored at *LINEPTR (not including the + NUL terminator), or -1 on error or EOF. */ +extern ssize_t getline (char **lineptr, size_t *linesize, FILE *stream); +# endif +#elif defined GNULIB_POSIXCHECK +# undef getline +# define getline(l, s, f) \ + (GL_LINK_WARNING ("getline is unportable - " \ + "use gnulib module getline for portability"), \ + getline (l, s, f)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _GL_STDIO_H */ +#endif /* _GL_STDIO_H */ +#endif diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h new file mode 100644 index 0000000..0181dd2 --- /dev/null +++ b/lib/stdlib.in.h @@ -0,0 +1,225 @@ +/* A GNU-like . + + Copyright (C) 1995, 2001-2004, 2006-2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if defined __need_malloc_and_calloc +/* Special invocation convention inside glibc header files. */ + +#@INCLUDE_NEXT@ @NEXT_STDLIB_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _GL_STDLIB_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STDLIB_H@ + +#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_MALLOC_POSIX@ +# if !@HAVE_MALLOC_POSIX@ +# undef malloc +# define malloc rpl_malloc +extern void * malloc (size_t size); +# endif +#elif defined GNULIB_POSIXCHECK +# undef malloc +# define malloc(s) \ + (GL_LINK_WARNING ("malloc is not POSIX compliant everywhere - " \ + "use gnulib module malloc-posix for portability"), \ + malloc (s)) +#endif + + +#if @GNULIB_REALLOC_POSIX@ +# if !@HAVE_REALLOC_POSIX@ +# undef realloc +# define realloc rpl_realloc +extern void * realloc (void *ptr, size_t size); +# endif +#elif defined GNULIB_POSIXCHECK +# undef realloc +# define realloc(p,s) \ + (GL_LINK_WARNING ("realloc is not POSIX compliant everywhere - " \ + "use gnulib module realloc-posix for portability"), \ + realloc (p, s)) +#endif + + +#if @GNULIB_CALLOC_POSIX@ +# if !@HAVE_CALLOC_POSIX@ +# undef calloc +# define calloc rpl_calloc +extern void * calloc (size_t nmemb, size_t size); +# endif +#elif defined GNULIB_POSIXCHECK +# undef calloc +# define calloc(n,s) \ + (GL_LINK_WARNING ("calloc is not POSIX compliant everywhere - " \ + "use gnulib module calloc-posix for portability"), \ + calloc (n, s)) +#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 declares mkstemp. */ +# include +# 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 + + +#if @GNULIB_PUTENV@ +# if @REPLACE_PUTENV@ +# undef putenv +# define putenv rpl_putenv +extern int putenv (char *string); +# endif +#endif + + +#if @GNULIB_SETENV@ +# 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 +#endif + + +#if @GNULIB_UNSETENV@ +# if @HAVE_UNSETENV@ +# if @VOID_UNSETENV@ +/* On some systems, unsetenv() returns void. + This is the case for MacOS X 10.3, 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 +#endif + + +#if @GNULIB_STRTOD@ +# if @REPLACE_STRTOD@ +# define strtod rpl_strtod +# endif +# if !@HAVE_STRTOD@ || @REPLACE_STRTOD@ + /* Parse a double from STRING, updating ENDP if appropriate. */ +extern double strtod (const char *str, char **endp); +# endif +#elif defined GNULIB_POSIXCHECK +# undef strtod +# define strtod(s, e) \ + (GL_LINK_WARNING ("strtod is unportable - " \ + "use gnulib module strtod for portability"), \ + strtod (s, e)) +#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..0b637ad --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 +#endif + +#include "stdopen.h" + +#include +#include +#include +#include +#include + +/* 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 + +# 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..1e70013 --- /dev/null +++ b/lib/stpcpy.c @@ -0,0 +1,48 @@ +/* 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 3 of the License, or any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#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..82270ac --- /dev/null +++ b/lib/strcasecmp.c @@ -0,0 +1,65 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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..da4049d --- /dev/null +++ b/lib/strchrnul.c @@ -0,0 +1,31 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* 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..faa2aee --- /dev/null +++ b/lib/strdup.c @@ -0,0 +1,57 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _LIBC +# include +#endif + +/* Get specification. */ +#include + +#include + +#undef __strdup +#ifdef _LIBC +# undef strdup +#endif + +#ifndef weak_alias +# define __strdup strdup +#endif + +/* Duplicate S, returning an identical malloc'd string. */ +char * +__strdup (const char *s) +{ + size_t len = strlen (s) + 1; + void *new = malloc (len); + + if (new == NULL) + return NULL; + + return (char *) memcpy (new, s, len); +} +#ifdef libc_hidden_def +libc_hidden_def (__strdup) +#endif +#ifdef weak_alias +weak_alias (__strdup, strdup) +#endif diff --git a/lib/streq.h b/lib/streq.h new file mode 100644 index 0000000..e3b0c3f --- /dev/null +++ b/lib/streq.h @@ -0,0 +1,178 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Optimized string comparison. + Copyright (C) 2001-2002, 2007 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that 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 General Public License + along with this program. If not, see . */ + +/* Written by Bruno Haible . */ + +#ifndef _GL_STREQ_H +#define _GL_STREQ_H + +#include + +/* STREQ allows to optimize string comparison with a small literal string. + STREQ (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) + is semantically equivalent to + strcmp (s, "EUC-KR") == 0 + just faster. */ + +/* Help GCC to generate good code for string comparisons with + immediate strings. */ +#if defined (__GNUC__) && defined (__OPTIMIZE__) + +static inline int +streq9 (const char *s1, const char *s2) +{ + return strcmp (s1 + 9, s2 + 9) == 0; +} + +static inline int +streq8 (const char *s1, const char *s2, char s28) +{ + if (s1[8] == s28) + { + if (s28 == 0) + return 1; + else + return streq9 (s1, s2); + } + else + return 0; +} + +static inline int +streq7 (const char *s1, const char *s2, char s27, char s28) +{ + if (s1[7] == s27) + { + if (s27 == 0) + return 1; + else + return streq8 (s1, s2, s28); + } + else + return 0; +} + +static inline int +streq6 (const char *s1, const char *s2, char s26, char s27, char s28) +{ + if (s1[6] == s26) + { + if (s26 == 0) + return 1; + else + return streq7 (s1, s2, s27, s28); + } + else + return 0; +} + +static inline int +streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28) +{ + if (s1[5] == s25) + { + if (s25 == 0) + return 1; + else + return streq6 (s1, s2, s26, s27, s28); + } + else + return 0; +} + +static inline int +streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28) +{ + if (s1[4] == s24) + { + if (s24 == 0) + return 1; + else + return streq5 (s1, s2, s25, s26, s27, s28); + } + else + return 0; +} + +static inline int +streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28) +{ + if (s1[3] == s23) + { + if (s23 == 0) + return 1; + else + return streq4 (s1, s2, s24, s25, s26, s27, s28); + } + else + return 0; +} + +static inline int +streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28) +{ + if (s1[2] == s22) + { + if (s22 == 0) + return 1; + else + return streq3 (s1, s2, s23, s24, s25, s26, s27, s28); + } + else + return 0; +} + +static inline int +streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28) +{ + if (s1[1] == s21) + { + if (s21 == 0) + return 1; + else + return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28); + } + else + return 0; +} + +static inline int +streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28) +{ + if (s1[0] == s20) + { + if (s20 == 0) + return 1; + else + return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28); + } + else + return 0; +} + +#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \ + streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28) + +#else + +#define STREQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \ + (strcmp (s1, s2) == 0) + +#endif + +#endif /* _GL_STREQ_H */ diff --git a/lib/strerror.c b/lib/strerror.c new file mode 100644 index 0000000..9fe437d --- /dev/null +++ b/lib/strerror.c @@ -0,0 +1,49 @@ +/* strerror.c --- POSIX compatible system error routine + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include + +#if REPLACE_STRERROR + +# include + +# include "intprops.h" + +# undef strerror +# if ! HAVE_DECL_STRERROR +# define strerror(n) NULL +# endif + +char * +rpl_strerror (int n) +{ + char *result = strerror (n); + + if (result == NULL || result[0] == '\0') + { + static char const fmt[] = "Unknown error (%d)"; + static char mesg[sizeof fmt + INT_STRLEN_BOUND (n)]; + sprintf (mesg, fmt, n); + return mesg; + } + + return result; +} + +#endif diff --git a/lib/string.in.h b/lib/string.in.h new file mode 100644 index 0000000..57a89b5 --- /dev/null +++ b/lib/string.in.h @@ -0,0 +1,571 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A GNU-like . + + Copyright (C) 1995-1996, 2001-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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. */ +#@INCLUDE_NEXT@ @NEXT_STRING_H@ + +#ifndef _GL_STRING_H +#define _GL_STRING_H + + +#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 +/* The attribute __pure__ was added in gcc 2.96. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96) +# define __pure__ /* empty */ +# endif +#endif + + +/* 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 @REPLACE_MEMMEM@ +# define memmem rpl_memmem +# endif +# if ! @HAVE_DECL_MEMMEM@ || @REPLACE_MEMMEM@ +extern void *memmem (void const *__haystack, size_t __haystack_len, + void const *__needle, size_t __needle_len) + __attribute__ ((__pure__)); +# endif +#elif defined GNULIB_POSIXCHECK +# undef memmem +# define memmem(a,al,b,bl) \ + (GL_LINK_WARNING ("memmem is unportable and often quadratic - " \ + "use gnulib module memmem-simple for portability, " \ + "and module memmem for speed" ), \ + 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) + __attribute__ ((__pure__)); +# 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 + +#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) + __attribute__ ((__pure__)); +# 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) + __attribute__ ((__pure__)); +# 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) + __attribute__ ((__pure__)); +# 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 @GNULIB_STRSTR@ +# if @REPLACE_STRSTR@ +# define strstr rpl_strstr +char *strstr (const char *haystack, const char *needle) + __attribute__ ((__pure__)); +# endif +#elif defined GNULIB_POSIXCHECK +/* strstr() does not work with multibyte strings if the locale encoding is + different from UTF-8: + POSIX says that it operates on "strings", and "string" in POSIX is defined + as a sequence of bytes, not of characters. */ +# undef strstr +# define strstr(a,b) \ + (GL_LINK_WARNING ("strstr is quadratic on many systems, and cannot " \ + "work correctly on character strings in most " \ + "multibyte locales - " \ + "use mbsstr if you care about internationalization, " \ + "or use strstr if you care about speed"), \ + strstr (a, b)) +#endif + +/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive + comparison. */ +#if @GNULIB_STRCASESTR@ +# if @REPLACE_STRCASESTR@ +# define strcasestr rpl_strcasestr +# endif +# if ! @HAVE_STRCASESTR@ || @REPLACE_STRCASESTR@ +extern char *strcasestr (const char *haystack, const char *needle) + __attribute__ ((__pure__)); +# endif +#elif defined GNULIB_POSIXCHECK +/* strcasestr() does not work with multibyte strings: + It is a glibc extension, and glibc implements it only for unibyte + locales. */ +# undef strcasestr +# 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_MBSNLEN@ +/* Return the number of multibyte characters in the character string starting + at STRING and ending at STRING + LEN. */ +extern size_t mbsnlen (const char *string, size_t len); +#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 + +/* Map any int, typically from errno, into an error message. */ +#if @GNULIB_STRERROR@ +# if @REPLACE_STRERROR@ +# undef strerror +# define strerror rpl_strerror +extern char *strerror (int); +# endif +#elif defined GNULIB_POSIXCHECK +# undef strerror +# define strerror(e) \ + (GL_LINK_WARNING ("strerror is unportable - " \ + "use gnulib module strerror to guarantee non-NULL result"), \ + strerror (e)) +#endif + +#if @GNULIB_STRSIGNAL@ +# if @REPLACE_STRSIGNAL@ +# define strsignal rpl_strsignal +# endif +# if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@ +extern char *strsignal (int __sig); +# endif +#elif defined GNULIB_POSIXCHECK +# undef strsignal +# define strsignal(a) \ + (GL_LINK_WARNING ("strsignal is unportable - " \ + "use gnulib module strsignal for portability"), \ + strsignal (a)) +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _GL_STRING_H */ +#endif /* _GL_STRING_H */ diff --git a/lib/strings.in.h b/lib/strings.in.h new file mode 100644 index 0000000..9511752 --- /dev/null +++ b/lib/strings.in.h @@ -0,0 +1,88 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A substitute . + + 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GL_STRINGS_H + +/* The include_next requires a split double-inclusion guard. */ +#@INCLUDE_NEXT@ @NEXT_STRINGS_H@ + +#ifndef _GL_STRINGS_H +#define _GL_STRINGS_H + + +/* The definition of GL_LINK_WARNING is copied here. */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Compare strings S1 and S2, ignoring case, returning less than, equal to or + greater than zero if S1 is lexicographically less than, equal to or greater + than S2. + 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 + + +#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..4084410 --- /dev/null +++ b/lib/stripslash.c @@ -0,0 +1,44 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#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..c26b75e --- /dev/null +++ b/lib/strncasecmp.c @@ -0,0 +1,65 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +#include +#include + +#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..239c625 --- /dev/null +++ b/lib/strndup.c @@ -0,0 +1,39 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include + +#include + +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..dec9587 --- /dev/null +++ b/lib/strnlen.c @@ -0,0 +1,33 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include + +/* 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..752d4fe --- /dev/null +++ b/lib/strnlen1.c @@ -0,0 +1,35 @@ +/* Find the length of STRING + 1, but scan at most MAXLEN bytes. + Copyright (C) 2005-2006 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "strnlen1.h" + +#include + +/* 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..c0ea357 --- /dev/null +++ b/lib/strnlen1.h @@ -0,0 +1,39 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _STRNLEN1_H +#define _STRNLEN1_H + +#include + + +#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..ab9bcff --- /dev/null +++ b/lib/strtoimax.c @@ -0,0 +1,75 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include + +/* Verify interface. */ +#include + +#include + +#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..0b2c82a --- /dev/null +++ b/lib/strtol.c @@ -0,0 +1,435 @@ +/* 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 3 of the License, or any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifdef _LIBC +# define USE_NUMBER_GROUPING +#else +# include +#endif + +#include +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#include +#include +#include + +#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 + +#ifdef USE_WIDE_CHAR +# include +# 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 . */ + 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..ccc99cb --- /dev/null +++ b/lib/strtoll.c @@ -0,0 +1,32 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#define QUAD 1 + +#include + +#ifdef _LIBC +# ifdef SHARED +# include + +# 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..88dbfc0 --- /dev/null +++ b/lib/strtoul.c @@ -0,0 +1,19 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#define UNSIGNED 1 + +#include "strtol.c" diff --git a/lib/strtoull.c b/lib/strtoull.c new file mode 100644 index 0000000..eda4a70 --- /dev/null +++ b/lib/strtoull.c @@ -0,0 +1,26 @@ +/* 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 3 of the License, or any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#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.in.h b/lib/sys_stat.in.h new file mode 100644 index 0000000..e28412f --- /dev/null +++ b/lib/sys_stat.in.h @@ -0,0 +1,282 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 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. */ +#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ + +#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 + +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.in.h b/lib/sys_time.in.h new file mode 100644 index 0000000..6426793 --- /dev/null +++ b/lib/sys_time.in.h @@ -0,0 +1,54 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Paul Eggert. */ + +#if defined _GL_SYS_TIME_H + +/* Simply delegate to the system's header, without adding anything. */ +# if @HAVE_SYS_TIME_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ +# endif + +#else + +# define _GL_SYS_TIME_H + +# if @HAVE_SYS_TIME_H@ +# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ +# else +# include +# endif + +# 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 */ diff --git a/lib/sysexits.in.h b/lib/sysexits.in.h new file mode 100644 index 0000000..895d31e --- /dev/null +++ b/lib/sysexits.in.h @@ -0,0 +1,67 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Simon Josefsson based on sysexits(3) man page */ + +#ifndef _GL_SYSEXITS_H + +#if @HAVE_SYSEXITS_H@ + +/* IRIX 6.5 has an that defines a macro EX_OK with a nonzero + value. Override it. See + */ +# ifdef __sgi +# include +# undef EX_OK +# endif + +/* The include_next requires a split double-inclusion guard. */ +# @INCLUDE_NEXT@ @NEXT_SYSEXITS_H@ + +/* HP-UX 11 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..f3276cf --- /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, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 + . SCO and BSDi uses ; BSDi also requires + and for defining tp_dev and tpr_t. It + seems that the rest use , which itself requires other files, + depending on systems. Pyramid defines _IOW in , for example. */ + +#if HAVE_SYS_GENTAPE_H +# include +#else +# if HAVE_SYS_TAPE_H +# if HAVE_SYS_DEVICE_H +# include +# endif +# if HAVE_SYS_PARAM_H +# include +# endif +# if HAVE_SYS_BUF_H +# include +# endif +# if HAVE_SYS_TPRINTF_H +# include +# endif +# include +# else +# if HAVE_SYS_MTIO_H +# include +# if HAVE_SGTTY_H +# include +# endif +# if HAVE_SYS_IO_TRIOCTL_H +# include +# endif +# include +# endif +# endif +#endif diff --git a/lib/system.h b/lib/system.h new file mode 100644 index 0000000..2deb585 --- /dev/null +++ b/lib/system.h @@ -0,0 +1,480 @@ +/* System dependent definitions for GNU tar. + + Copyright (C) 1994, 1995, 1996, 1997, 1998, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include + +#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 +#include + +/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given + as an argument to 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 +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +#else +# include +# 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 +#ifndef errno +extern int errno; +#endif + +/* Declare open parameters. */ + +#if HAVE_FCNTL_H +# include +#else +# include +#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 + +#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 . */ +#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 before any preprocessor test of _POSIX_VERSION. */ +#include + +#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 +# if !defined(makedev) && defined(mkdev) +# define makedev(a,b) mkdev((a),(b)) +# endif +# define GOT_MAJOR +#endif + +#if MAJOR_IN_SYSMACROS +# include +# define GOT_MAJOR +#endif + +/* Some 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 . */ +#ifndef GOT_MAJOR +# if defined(hpux) || defined(__hpux__) || defined(__hpux) +# include +# 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 +#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 +#else +void *malloc (); +char *getenv (); +#endif + +#include +#include + +#include +#if !defined _POSIX_VERSION && MSDOS +# include +#endif + +#if WITH_DMALLOC +# define DMALLOC_FUNC_CHECK +# include +#endif + +#include + +#ifndef MB_LEN_MAX +# define MB_LEN_MAX 1 +#endif + +#include + +#include + +#define UINTMAX_STRSIZE_BOUND INT_BUFSIZE_BOUND (uintmax_t) + +/* Prototypes for external functions. */ + +#if HAVE_LOCALE_H +# include +#endif +#if !HAVE_SETLOCALE +# define setlocale(category, locale) /* empty */ +#endif + +#include +#ifdef TIME_WITH_SYS_TIME +# include +#endif + +/* Library modules. */ + +#include +#include +#include +#include +#include + +#include +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#ifdef HAVE_PWD_H +# include +#endif +#ifdef HAVE_GRP_H +# include +#endif + +#if MSDOS +# include +# 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 +# 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 +#endif diff --git a/lib/tempname.c b/lib/tempname.c new file mode 100644 index 0000000..5a3a326 --- /dev/null +++ b/lib/tempname.c @@ -0,0 +1,314 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Extracted from glibc sysdeps/posix/tempname.c. See also tmpdir.c. */ + +#if !_LIBC +# include +# include "tempname.h" +#endif + +#include +#include + +#include +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include +#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 +#include +#include + +#include +#include +#include +#include + +#include + +#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 +# 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..74da03b --- /dev/null +++ b/lib/tempname.h @@ -0,0 +1,39 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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.in.h b/lib/time.in.h new file mode 100644 index 0000000..f506b69 --- /dev/null +++ b/lib/time.in.h @@ -0,0 +1,116 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A more-standard . + + 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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. Also, Solaris 8 eventually includes itself + recursively; if that is happening, just include the system + without adding our own declarations. */ +#if (defined __need_time_t || defined __need_clock_t \ + || defined __need_timespec \ + || defined _GL_TIME_H) + +# @INCLUDE_NEXT@ @NEXT_TIME_H@ + +#else + +# define _GL_TIME_H + +# @INCLUDE_NEXT@ @NEXT_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 + (e.g., FreeBSD circa 1997). */ +# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ +# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ +# include +# 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 + . */ +# 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 + and + . */ +# 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 + . */ +# 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 diff --git a/lib/time_r.c b/lib/time_r.c new file mode 100644 index 0000000..35b0ed4 --- /dev/null +++ b/lib/time_r.c @@ -0,0 +1,49 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Paul Eggert. */ + +#include + +#include + +#include + +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..3f51db8 --- /dev/null +++ b/lib/timespec.h @@ -0,0 +1,36 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#if ! defined TIMESPEC_H +# define TIMESPEC_H + +# include + +/* 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..1a7fd78 --- /dev/null +++ b/lib/unistd--.h @@ -0,0 +1,27 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +#include +#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..033e857 --- /dev/null +++ b/lib/unistd-safer.h @@ -0,0 +1,22 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +int dup_safer (int); +int fd_safer (int); +int pipe_safer (int[2]); diff --git a/lib/unistd.in.h b/lib/unistd.in.h new file mode 100644 index 0000000..0d8aeeb --- /dev/null +++ b/lib/unistd.in.h @@ -0,0 +1,342 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Substitute for and wrapper around . + Copyright (C) 2004-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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@ +# @INCLUDE_NEXT@ @NEXT_UNISTD_H@ +#endif + +#ifndef _GL_UNISTD_H +#define _GL_UNISTD_H + +/* mingw doesn't define the SEEK_* macros in . */ +#if !(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) +# include +#endif + +/* mingw fails to declare _exit in . */ +#include + +/* The definition of GL_LINK_WARNING is copied here. */ + + +/* Declare overridden functions. */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if @GNULIB_CHOWN@ +# if @REPLACE_CHOWN@ +# ifndef REPLACE_CHOWN +# define REPLACE_CHOWN 1 +# endif +# 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). Follow symbolic links. + Return 0 if successful, otherwise -1 and errno set. + See the POSIX:2001 specification + . */ +# define chown rpl_chown +extern int chown (const char *file, uid_t uid, gid_t gid); +# endif +# 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 + . */ +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_ENVIRON@ +# if !@HAVE_DECL_ENVIRON@ +/* Set of environment variables and values. An array of strings of the form + "VARIABLE=VALUE", terminated with a NULL. */ +# if defined __APPLE__ && defined __MACH__ +# include +# define environ (*_NSGetEnviron ()) +# else +extern char **environ; +# endif +# endif +#elif defined GNULIB_POSIXCHECK +# undef environ +# define environ \ + (GL_LINK_WARNING ("environ is unportable - " \ + "use gnulib module environ for portability"), \ + environ) +#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 + . */ +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 + . */ +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 +# 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 + . + 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 . + */ +# if !@HAVE_DECL_GETLOGIN_R@ +# include +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_GETPAGESIZE@ +# if @REPLACE_GETPAGESIZE@ +# define getpagesize rpl_getpagesize +extern int getpagesize (void); +# elif !@HAVE_GETPAGESIZE@ +/* This is for POSIX systems. */ +# if !defined getpagesize && defined _SC_PAGESIZE +# if ! (defined __VMS && __VMS_VER < 70000000) +# define getpagesize() sysconf (_SC_PAGESIZE) +# endif +# endif +/* This is for older VMS. */ +# 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 +# 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 +/* This is for older Unix systems. */ +# if !defined getpagesize && @HAVE_SYS_PARAM_H@ +# include +# 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 +#elif defined GNULIB_POSIXCHECK +# undef getpagesize +# define getpagesize() \ + (GL_LINK_WARNING ("getpagesize is unportable - " \ + "use gnulib module getpagesize for portability"), \ + getpagesize ()) +#endif + + +#if @GNULIB_LCHOWN@ +# if @REPLACE_LCHOWN@ +/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE + to GID (if GID is not -1). Do not follow symbolic links. + Return 0 if successful, otherwise -1 and errno set. + See the POSIX:2001 specification + . */ +# define lchown rpl_lchown +extern int lchown (char const *file, uid_t owner, gid_t group); +# endif +#elif defined GNULIB_POSIXCHECK +# undef lchown +# define lchown(f,u,g) \ + (GL_LINK_WARNING ("lchown is unportable to pre-POSIX.1-2001 " \ + "systems - use gnulib module lchown for portability"), \ + lchown (f, u, g)) +#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 + . */ +# 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 + . */ +# if !@HAVE_READLINK@ +# include +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 + . */ +# 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/unitypes.h b/lib/unitypes.h new file mode 100644 index 0000000..aa96393 --- /dev/null +++ b/lib/unitypes.h @@ -0,0 +1,28 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Elementary types for the GNU UniString library. + Copyright (C) 2002, 2005-2006 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _UNITYPES_H +#define _UNITYPES_H + +/* Get uint8_t, uint16_t, uint32_t. */ +#include + +/* Type representing a Unicode character. */ +typedef uint32_t ucs4_t; + +#endif /* _UNITYPES_H */ diff --git a/lib/uniwidth.h b/lib/uniwidth.h new file mode 100644 index 0000000..81e7b92 --- /dev/null +++ b/lib/uniwidth.h @@ -0,0 +1,66 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Display width functions. + Copyright (C) 2001-2002, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that 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 General Public License + along with this program. If not, see . */ + +#ifndef _UNIWIDTH_H +#define _UNIWIDTH_H + +#include "unitypes.h" + +/* Get size_t. */ +#include + +/* Get locale_charset() declaration. */ +#include "localcharset.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Display width. */ + +/* These functions are locale dependent. The encoding argument identifies + the encoding (e.g. "ISO-8859-2" for Polish). */ + +/* Determine number of column positions required for UC. */ +extern int + uc_width (ucs4_t uc, const char *encoding); + +/* Determine number of column positions required for first N units + (or fewer if S ends before this) in S. */ +extern int + u8_width (const uint8_t *s, size_t n, const char *encoding); +extern int + u16_width (const uint16_t *s, size_t n, const char *encoding); +extern int + u32_width (const uint32_t *s, size_t n, const char *encoding); + +/* Determine number of column positions required for S. */ +extern int + u8_strwidth (const uint8_t *s, const char *encoding); +extern int + u16_strwidth (const uint16_t *s, const char *encoding); +extern int + u32_strwidth (const uint32_t *s, const char *encoding); + + +#ifdef __cplusplus +} +#endif + +#endif /* _UNIWIDTH_H */ diff --git a/lib/uniwidth/cjk.h b/lib/uniwidth/cjk.h new file mode 100644 index 0000000..c4ed036 --- /dev/null +++ b/lib/uniwidth/cjk.h @@ -0,0 +1,39 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Test for CJK encoding. + Copyright (C) 2001-2002, 2005-2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "streq.h" + +static int +is_cjk_encoding (const char *encoding) +{ + if (0 + /* Legacy Japanese encodings */ + || STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0) + /* Legacy Chinese encodings */ + || STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) + || STREQ (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0) + || STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0) + || STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0) + /* Legacy Korean encodings */ + || STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0) + || STREQ (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0) + || STREQ (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0)) + return 1; + return 0; +} diff --git a/lib/uniwidth/width.c b/lib/uniwidth/width.c new file mode 100644 index 0000000..3e0d30a --- /dev/null +++ b/lib/uniwidth/width.c @@ -0,0 +1,325 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Determine display width of Unicode character. + Copyright (C) 2001-2002, 2006-2007 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "uniwidth.h" + +#include "cjk.h" + +/* + * Non-spacing attribute table. + * Consists of: + * - Non-spacing characters; generated from PropList.txt or + * "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt" + * - Format control characters; generated from + * "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt" + * - Zero width characters; generated from + * "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt" + */ +static const unsigned char nonspacing_table_data[22*64] = { + /* 0x0000-0x01ff */ + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */ + 0xff, 0xff, 0xff, 0xff, 0x00, 0x08, 0x00, 0x00, /* 0x0080-0x00bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */ + /* 0x0200-0x03ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */ + /* 0x0400-0x05ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */ + 0x78, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */ + 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */ + 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */ + /* 0x0600-0x07ff */ + 0x0f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */ + 0x00, 0xf8, 0xff, 0x7f, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */ + 0x00, 0x00, 0xc0, 0xff, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */ + 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */ + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */ + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x07c0-0x07ff */ + /* 0x0800-0x09ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0800-0x083f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08c0-0x08ff */ + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0900-0x093f */ + 0xfe, 0x21, 0x1e, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */ + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */ + 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x09c0-0x09ff */ + /* 0x0a00-0x0bff */ + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */ + 0x86, 0x39, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, /* 0x0a40-0x0a7f */ + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */ + 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0ac0-0x0aff */ + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */ + 0x0e, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */ + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */ + 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */ + /* 0x0c00-0x0dff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x0c00-0x0c3f */ + 0xc1, 0x3d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */ + 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d00-0x0d3f */ + 0x0e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */ + 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */ + /* 0x0e00-0x0fff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */ + 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1b, /* 0x0e80-0x0ebf */ + 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */ + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */ + 0xdf, 0x00, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */ + /* 0x1000-0x11ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xc5, 0x02, /* 0x1000-0x103f */ + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, /* 0x1040-0x107f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1140-0x117f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1180-0x11bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c0-0x11ff */ + /* 0x1200-0x13ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */ + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */ + /* 0x1600-0x17ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */ + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, /* 0x1700-0x173f */ + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */ + 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */ + /* 0x1800-0x19ff */ + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */ + 0x00, 0x00, 0x00, 0x00, 0x87, 0x0f, 0x04, 0x0e, /* 0x1900-0x193f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */ + /* 0x1a00-0x1bff */ + 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1a40-0x1a7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1a80-0x1abf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */ + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */ + 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1b80-0x1bbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc0-0x1bff */ + /* 0x1c00-0x1dff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c00-0x1c3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1cc0-0x1cff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */ + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x1dc0-0x1dff */ + /* 0x2000-0x21ff */ + 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */ + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, /* 0x2040-0x207f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */ + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x20c0-0x20ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */ + /* 0x3000-0x31ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, /* 0x3000-0x303f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */ + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */ + /* 0xa800-0xa9ff */ + 0x44, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0xa800-0xa83f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8c0-0xa8ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa900-0xa93f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa980-0xa9bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */ + /* 0xfa00-0xfbff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */ + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */ + /* 0xfe00-0xffff */ + 0xff, 0xff, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, /* 0xfe00-0xfe3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */ + /* 0x10a00-0x10bff */ + 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */ + /* 0x1d000-0x1d1ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0xf8, /* 0x1d140-0x1d17f */ + 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */ + /* 0x1d200-0x1d3ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */ + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1d3c0-0x1d3ff */ +}; +static const signed char nonspacing_table_ind[240] = { + 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */ + 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */ + 14, -1, -1, -1, -1, -1, -1, -1, /* 0x2000-0x2fff */ + 15, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */ + -1, -1, -1, -1, 16, -1, -1, -1, /* 0xa000-0xafff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd000-0xdfff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */ + -1, -1, -1, -1, -1, 17, -1, 18, /* 0xf000-0xffff */ + -1, -1, -1, -1, -1, 19, -1, -1, /* 0x10000-0x10fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x11000-0x11fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x16000-0x16fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1b000-0x1bfff */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1c000-0x1cfff */ + 20, 21, -1, -1, -1, -1, -1, -1 /* 0x1d000-0x1dfff */ +}; + +/* Determine number of column positions required for UC. */ +int +uc_width (ucs4_t uc, const char *encoding) +{ + /* Test for non-spacing or control character. */ + if ((uc >> 9) < 240) + { + int ind = nonspacing_table_ind[uc >> 9]; + if (ind >= 0) + if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1) + { + if (uc > 0 && uc < 0xa0) + return -1; + else + return 0; + } + } + else if ((uc >> 9) == (0xe0000 >> 9)) + { + if (uc >= 0xe0100) + { + if (uc <= 0xe01ef) + return 0; + } + else + { + if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001) + return 0; + } + } + /* Test for double-width character. + * Generated from "grep '^....;[WF]' EastAsianWidth.txt" + * and "grep '^....;[^WF]' EastAsianWidth.txt" + */ + if (uc >= 0x1100 + && ((uc < 0x1160) /* Hangul Jamo */ + || (uc >= 0x2329 && uc < 0x232b) /* Angle Brackets */ + || (uc >= 0x2e80 && uc < 0xa4d0 /* CJK ... Yi */ + && !(uc == 0x303f) && !(uc >= 0x4dc0 && uc < 0x4e00)) + || (uc >= 0xac00 && uc < 0xd7a4) /* Hangul Syllables */ + || (uc >= 0xf900 && uc < 0xfb00) /* CJK Compatibility Ideographs */ + || (uc >= 0xfe10 && uc < 0xfe20) /* Presentation Forms for Vertical */ + || (uc >= 0xfe30 && uc < 0xfe70) /* CJK Compatibility Forms */ + || (uc >= 0xff00 && uc < 0xff61) /* Fullwidth Forms */ + || (uc >= 0xffe0 && uc < 0xffe7) /* Fullwidth Signs */ + || (uc >= 0x20000 && uc <= 0x2a6d6) /* CJK */ + || (uc >= 0x2f800 && uc <= 0x2fa1d) /* CJK Compatibility Ideographs */ + ) ) + return 2; + /* In ancient CJK encodings, Cyrillic and most other characters are + double-width as well. */ + if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9 + && is_cjk_encoding (encoding)) + return 2; + return 1; +} diff --git a/lib/unlinkdir.c b/lib/unlinkdir.c new file mode 100644 index 0000000..12e669e --- /dev/null +++ b/lib/unlinkdir.c @@ -0,0 +1,67 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +#include + +#include "unlinkdir.h" + +#if HAVE_PRIV_H +# include +#endif +#include + +#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..10c4e5f --- /dev/null +++ b/lib/unlinkdir.h @@ -0,0 +1,26 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert and Jim Meyering. */ + +#include + +#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..6b2939e --- /dev/null +++ b/lib/unlocked-io.h @@ -0,0 +1,136 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +# 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..73ea878 --- /dev/null +++ b/lib/unsetenv.c @@ -0,0 +1,90 @@ +/* Copyright (C) 1992,1995-1999,2000-2002,2005-2008 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +#include +#if !_LIBC +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#include +#include + +#if !_LIBC +# define __environ environ +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include +__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..9ddb8b8 --- /dev/null +++ b/lib/utime.c @@ -0,0 +1,108 @@ +/* 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 3 of the License, or any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* derived from a function in touch.c */ + +#include +#undef utime + +#include + +#ifdef HAVE_UTIME_H +# include +#endif + +#if !HAVE_UTIMES_NULL +# include +# include +#endif + +#include +#include + +#include "full-write.h" +#include "safe-read.h" + +/* Some systems (even some that do have ) 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..e128219 --- /dev/null +++ b/lib/utimens.c @@ -0,0 +1,188 @@ +/* Set file access and modification times. + + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Free Software + Foundation, Inc. + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Paul Eggert. */ + +/* derived from a function in touch.c */ + +#include + +#include "utimens.h" + +#include +#include +#include +#include + +#if HAVE_UTIME_H +# include +#endif + +/* Some systems (even some that do have ) 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) +# 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 + 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 +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..3bdb4e9 --- /dev/null +++ b/lib/vasnprintf.c @@ -0,0 +1,4702 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This file can be parametrized with the following macros: + VASNPRINTF The name of the function being defined. + FCHAR_T The element type of the format string. + DCHAR_T The element type of the destination (result) string. + FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters + in the format string are ASCII. MUST be set if + FCHAR_T and DCHAR_T are not the same type. + DIRECTIVE Structure denoting a format directive. + Depends on FCHAR_T. + DIRECTIVES Structure denoting the set of format directives of a + format string. Depends on FCHAR_T. + PRINTF_PARSE Function that parses a format string. + Depends on FCHAR_T. + DCHAR_CPY memcpy like function for DCHAR_T[] arrays. + DCHAR_SET memset like function for DCHAR_T[] arrays. + DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays. + SNPRINTF The system's snprintf (or similar) function. + This may be either snprintf or swprintf. + TCHAR_T The element type of the argument and result string + of the said SNPRINTF function. This may be either + char or wchar_t. The code exploits that + sizeof (TCHAR_T) | sizeof (DCHAR_T) and + alignof (TCHAR_T) <= alignof (DCHAR_T). + DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type. + DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[]. + DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t. + DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t. + DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */ + +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#ifndef VASNPRINTF +# include +#endif +#ifndef IN_LIBINTL +# include +#endif + +/* Specification. */ +#ifndef VASNPRINTF +# if WIDE_CHAR_VERSION +# include "vasnwprintf.h" +# else +# include "vasnprintf.h" +# endif +#endif + +#include /* localeconv() */ +#include /* snprintf(), sprintf() */ +#include /* abort(), malloc(), realloc(), free() */ +#include /* memcpy(), strlen() */ +#include /* errno */ +#include /* CHAR_BIT */ +#include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#if HAVE_NL_LANGINFO +# include +#endif +#ifndef VASNPRINTF +# if WIDE_CHAR_VERSION +# include "wprintf-parse.h" +# else +# include "printf-parse.h" +# endif +#endif + +/* Checked size_t computations. */ +#include "xsize.h" + +#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# include "float+.h" +#endif + +#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnand.h" +#endif + +#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnanl-nolibm.h" +# include "fpucw.h" +#endif + +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnand.h" +# include "printf-frexp.h" +#endif + +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL +# include +# include "isnanl-nolibm.h" +# include "printf-frexpl.h" +# include "fpucw.h" +#endif + +#if HAVE_WCHAR_T +# if HAVE_WCSLEN +# define local_wcslen wcslen +# else + /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid + a dependency towards this library, here is a local substitute. + Define this substitute only once, even if this file is included + twice in the same compilation unit. */ +# ifndef local_wcslen_defined +# define local_wcslen_defined 1 +static size_t +local_wcslen (const wchar_t *s) +{ + const wchar_t *ptr; + + for (ptr = s; *ptr != (wchar_t) 0; ptr++) + ; + return ptr - s; +} +# endif +# endif +#endif + +/* Default parameters. */ +#ifndef VASNPRINTF +# if WIDE_CHAR_VERSION +# define VASNPRINTF vasnwprintf +# define FCHAR_T wchar_t +# define DCHAR_T wchar_t +# define TCHAR_T wchar_t +# define DCHAR_IS_TCHAR 1 +# define DIRECTIVE wchar_t_directive +# define DIRECTIVES wchar_t_directives +# define PRINTF_PARSE wprintf_parse +# define DCHAR_CPY wmemcpy +# else +# define VASNPRINTF vasnprintf +# define FCHAR_T char +# define DCHAR_T char +# define TCHAR_T char +# define DCHAR_IS_TCHAR 1 +# define DIRECTIVE char_directive +# define DIRECTIVES char_directives +# define PRINTF_PARSE printf_parse +# define DCHAR_CPY memcpy +# endif +#endif +#if WIDE_CHAR_VERSION + /* TCHAR_T is wchar_t. */ +# define USE_SNPRINTF 1 +# if HAVE_DECL__SNWPRINTF + /* On Windows, the function swprintf() has a different signature than + on Unix; we use the _snwprintf() function instead. */ +# define SNPRINTF _snwprintf +# else + /* Unix. */ +# define SNPRINTF swprintf +# endif +#else + /* TCHAR_T is char. */ +# /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'. + But don't use it on BeOS, since BeOS snprintf produces no output if the + size argument is >= 0x3000000. */ +# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ +# define USE_SNPRINTF 1 +# else +# define USE_SNPRINTF 0 +# endif +# if HAVE_DECL__SNPRINTF + /* Windows. */ +# define SNPRINTF _snprintf +# else + /* Unix. */ +# define SNPRINTF snprintf + /* Here we need to call the native snprintf, not rpl_snprintf. */ +# undef snprintf +# endif +#endif +/* Here we need to call the native sprintf, not rpl_sprintf. */ +#undef sprintf + +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL +/* Determine the decimal-point character according to the current locale. */ +# ifndef decimal_point_char_defined +# define decimal_point_char_defined 1 +static char +decimal_point_char () +{ + const char *point; + /* Determine it in a multithread-safe way. We know nl_langinfo is + multithread-safe on glibc systems, but is not required to be multithread- + safe by POSIX. sprintf(), however, is multithread-safe. localeconv() + is rarely multithread-safe. */ +# if HAVE_NL_LANGINFO && __GLIBC__ + point = nl_langinfo (RADIXCHAR); +# elif 1 + char pointbuf[5]; + sprintf (pointbuf, "%#.0f", 1.0); + point = &pointbuf[1]; +# else + point = localeconv () -> decimal_point; +# endif + /* The decimal point is always a single byte: either '.' or ','. */ + return (point[0] != '\0' ? point[0] : '.'); +} +# endif +#endif + +#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL + +/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */ +static int +is_infinite_or_zero (double x) +{ + return isnand (x) || x + x == x; +} + +#endif + +#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL + +/* Equivalent to !isfinite(x), but does not require libm. */ +static int +is_infinitel (long double x) +{ + return isnanl (x) || (x + x == x && x != 0.0L); +} + +#endif + +#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL + +/* Converting 'long double' to decimal without rare rounding bugs requires + real bignums. We use the naming conventions of GNU gmp, but vastly simpler + (and slower) algorithms. */ + +typedef unsigned int mp_limb_t; +# define GMP_LIMB_BITS 32 +typedef int mp_limb_verify[2 * (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS) - 1]; + +typedef unsigned long long mp_twolimb_t; +# define GMP_TWOLIMB_BITS 64 +typedef int mp_twolimb_verify[2 * (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS) - 1]; + +/* Representation of a bignum >= 0. */ +typedef struct +{ + size_t nlimbs; + mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */ +} mpn_t; + +/* Compute the product of two bignums >= 0. + Return the allocated memory in case of success, NULL in case of memory + allocation failure. */ +static void * +multiply (mpn_t src1, mpn_t src2, mpn_t *dest) +{ + const mp_limb_t *p1; + const mp_limb_t *p2; + size_t len1; + size_t len2; + + if (src1.nlimbs <= src2.nlimbs) + { + len1 = src1.nlimbs; + p1 = src1.limbs; + len2 = src2.nlimbs; + p2 = src2.limbs; + } + else + { + len1 = src2.nlimbs; + p1 = src2.limbs; + len2 = src1.nlimbs; + p2 = src1.limbs; + } + /* Now 0 <= len1 <= len2. */ + if (len1 == 0) + { + /* src1 or src2 is zero. */ + dest->nlimbs = 0; + dest->limbs = (mp_limb_t *) malloc (1); + } + else + { + /* Here 1 <= len1 <= len2. */ + size_t dlen; + mp_limb_t *dp; + size_t k, i, j; + + dlen = len1 + len2; + dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t)); + if (dp == NULL) + return NULL; + for (k = len2; k > 0; ) + dp[--k] = 0; + for (i = 0; i < len1; i++) + { + mp_limb_t digit1 = p1[i]; + mp_twolimb_t carry = 0; + for (j = 0; j < len2; j++) + { + mp_limb_t digit2 = p2[j]; + carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; + carry += dp[i + j]; + dp[i + j] = (mp_limb_t) carry; + carry = carry >> GMP_LIMB_BITS; + } + dp[i + len2] = (mp_limb_t) carry; + } + /* Normalise. */ + while (dlen > 0 && dp[dlen - 1] == 0) + dlen--; + dest->nlimbs = dlen; + dest->limbs = dp; + } + return dest->limbs; +} + +/* Compute the quotient of a bignum a >= 0 and a bignum b > 0. + a is written as a = q * b + r with 0 <= r < b. q is the quotient, r + the remainder. + Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd, + q is incremented. + Return the allocated memory in case of success, NULL in case of memory + allocation failure. */ +static void * +divide (mpn_t a, mpn_t b, mpn_t *q) +{ + /* Algorithm: + First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]] + with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS). + If m=n=1, perform a single-precision division: + r:=0, j:=m, + while j>0 do + {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j = + = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r=n>1, perform a multiple-precision division: + We have a/b < beta^(m-n+1). + s:=intDsize-1-(hightest bit in b[n-1]), 0<=s=beta/2. + For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).} + Compute q* : + q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]). + In case of overflow (q* >= beta) set q* := beta-1. + Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2] + and c3 := b[n-2] * q*. + {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow + occurred. Furthermore 0 <= c3 < beta^2. + If there was overflow and + r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2, + the next test can be skipped.} + While c3 > c2, {Here 0 <= c2 < c3 < beta^2} + Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2]. + If q* > 0: + Put r := r - b * q* * beta^j. In detail: + [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]]. + hence: u:=0, for i:=0 to n-1 do + u := u + q* * b[i], + r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry), + u:=u div beta (+ 1, if carry in subtraction) + r[n+j]:=r[n+j]-u. + {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1 + < q* + 1 <= beta, + the carry u does not overflow.} + If a negative carry occurs, put q* := q* - 1 + and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]]. + Set q[j] := q*. + Normalise [q[m-n],..,q[0]]; this yields the quotient q. + Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the + rest r. + The room for q[j] can be allocated at the memory location of r[n+j]. + Finally, round-to-even: + Shift r left by 1 bit. + If r > b or if r = b and q[0] is odd, q := q+1. + */ + const mp_limb_t *a_ptr = a.limbs; + size_t a_len = a.nlimbs; + const mp_limb_t *b_ptr = b.limbs; + size_t b_len = b.nlimbs; + mp_limb_t *roomptr; + mp_limb_t *tmp_roomptr = NULL; + mp_limb_t *q_ptr; + size_t q_len; + mp_limb_t *r_ptr; + size_t r_len; + + /* Allocate room for a_len+2 digits. + (Need a_len+1 digits for the real division and 1 more digit for the + final rounding of q.) */ + roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t)); + if (roomptr == NULL) + return NULL; + + /* Normalise a. */ + while (a_len > 0 && a_ptr[a_len - 1] == 0) + a_len--; + + /* Normalise b. */ + for (;;) + { + if (b_len == 0) + /* Division by zero. */ + abort (); + if (b_ptr[b_len - 1] == 0) + b_len--; + else + break; + } + + /* Here m = a_len >= 0 and n = b_len > 0. */ + + if (a_len < b_len) + { + /* m beta^(m-2) <= a/b < beta^m */ + r_ptr = roomptr; + q_ptr = roomptr + 1; + { + mp_limb_t den = b_ptr[0]; + mp_limb_t remainder = 0; + const mp_limb_t *sourceptr = a_ptr + a_len; + mp_limb_t *destptr = q_ptr + a_len; + size_t count; + for (count = a_len; count > 0; count--) + { + mp_twolimb_t num = + ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr; + *--destptr = num / den; + remainder = num % den; + } + /* Normalise and store r. */ + if (remainder > 0) + { + r_ptr[0] = remainder; + r_len = 1; + } + else + r_len = 0; + /* Normalise q. */ + q_len = a_len; + if (q_ptr[q_len - 1] == 0) + q_len--; + } + } + else + { + /* n>1: multiple precision division. + beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==> + beta^(m-n-1) <= a/b < beta^(m-n+1). */ + /* Determine s. */ + size_t s; + { + mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */ + s = 31; + if (msd >= 0x10000) + { + msd = msd >> 16; + s -= 16; + } + if (msd >= 0x100) + { + msd = msd >> 8; + s -= 8; + } + if (msd >= 0x10) + { + msd = msd >> 4; + s -= 4; + } + if (msd >= 0x4) + { + msd = msd >> 2; + s -= 2; + } + if (msd >= 0x2) + { + msd = msd >> 1; + s -= 1; + } + } + /* 0 <= s < GMP_LIMB_BITS. + Copy b, shifting it left by s bits. */ + if (s > 0) + { + tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t)); + if (tmp_roomptr == NULL) + { + free (roomptr); + return NULL; + } + { + const mp_limb_t *sourceptr = b_ptr; + mp_limb_t *destptr = tmp_roomptr; + mp_twolimb_t accu = 0; + size_t count; + for (count = b_len; count > 0; count--) + { + accu += (mp_twolimb_t) *sourceptr++ << s; + *destptr++ = (mp_limb_t) accu; + accu = accu >> GMP_LIMB_BITS; + } + /* accu must be zero, since that was how s was determined. */ + if (accu != 0) + abort (); + } + b_ptr = tmp_roomptr; + } + /* Copy a, shifting it left by s bits, yields r. + Memory layout: + At the beginning: r = roomptr[0..a_len], + at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */ + r_ptr = roomptr; + if (s == 0) + { + memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t)); + r_ptr[a_len] = 0; + } + else + { + const mp_limb_t *sourceptr = a_ptr; + mp_limb_t *destptr = r_ptr; + mp_twolimb_t accu = 0; + size_t count; + for (count = a_len; count > 0; count--) + { + accu += (mp_twolimb_t) *sourceptr++ << s; + *destptr++ = (mp_limb_t) accu; + accu = accu >> GMP_LIMB_BITS; + } + *destptr++ = (mp_limb_t) accu; + } + q_ptr = roomptr + b_len; + q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */ + { + size_t j = a_len - b_len; /* m-n */ + mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */ + mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */ + mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */ + ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd; + /* Division loop, traversed m-n+1 times. + j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */ + for (;;) + { + mp_limb_t q_star; + mp_limb_t c1; + if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */ + { + /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */ + mp_twolimb_t num = + ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS) + | r_ptr[j + b_len - 1]; + q_star = num / b_msd; + c1 = num % b_msd; + } + else + { + /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */ + q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */ + /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta + <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta + <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) + {<= beta !}. + If yes, jump directly to the subtraction loop. + (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta + <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */ + if (r_ptr[j + b_len] > b_msd + || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd) + /* r[j+n] >= b[n-1]+1 or + r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a + carry. */ + goto subtract; + } + /* q_star = q*, + c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, 0, decrease it by + b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2 + this can happen only twice. */ + if (c3 > c2) + { + q_star = q_star - 1; /* q* := q* - 1 */ + if (c3 - c2 > b_msdd) + q_star = q_star - 1; /* q* := q* - 1 */ + } + } + if (q_star > 0) + subtract: + { + /* Subtract r := r - b * q* * beta^j. */ + mp_limb_t cr; + { + const mp_limb_t *sourceptr = b_ptr; + mp_limb_t *destptr = r_ptr + j; + mp_twolimb_t carry = 0; + size_t count; + for (count = b_len; count > 0; count--) + { + /* Here 0 <= carry <= q*. */ + carry = + carry + + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++ + + (mp_limb_t) ~(*destptr); + /* Here 0 <= carry <= beta*q* + beta-1. */ + *destptr++ = ~(mp_limb_t) carry; + carry = carry >> GMP_LIMB_BITS; /* <= q* */ + } + cr = (mp_limb_t) carry; + } + /* Subtract cr from r_ptr[j + b_len], then forget about + r_ptr[j + b_len]. */ + if (cr > r_ptr[j + b_len]) + { + /* Subtraction gave a carry. */ + q_star = q_star - 1; /* q* := q* - 1 */ + /* Add b back. */ + { + const mp_limb_t *sourceptr = b_ptr; + mp_limb_t *destptr = r_ptr + j; + mp_limb_t carry = 0; + size_t count; + for (count = b_len; count > 0; count--) + { + mp_limb_t source1 = *sourceptr++; + mp_limb_t source2 = *destptr; + *destptr++ = source1 + source2 + carry; + carry = + (carry + ? source1 >= (mp_limb_t) ~source2 + : source1 > (mp_limb_t) ~source2); + } + } + /* Forget about the carry and about r[j+n]. */ + } + } + /* q* is determined. Store it as q[j]. */ + q_ptr[j] = q_star; + if (j == 0) + break; + j--; + } + } + r_len = b_len; + /* Normalise q. */ + if (q_ptr[q_len - 1] == 0) + q_len--; +# if 0 /* Not needed here, since we need r only to compare it with b/2, and + b is shifted left by s bits. */ + /* Shift r right by s bits. */ + if (s > 0) + { + mp_limb_t ptr = r_ptr + r_len; + mp_twolimb_t accu = 0; + size_t count; + for (count = r_len; count > 0; count--) + { + accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS; + accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s); + *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS); + } + } +# endif + /* Normalise r. */ + while (r_len > 0 && r_ptr[r_len - 1] == 0) + r_len--; + } + /* Compare r << 1 with b. */ + if (r_len > b_len) + goto increment_q; + { + size_t i; + for (i = b_len;;) + { + mp_limb_t r_i = + (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0) + | (i < r_len ? r_ptr[i] << 1 : 0); + mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0); + if (r_i > b_i) + goto increment_q; + if (r_i < b_i) + goto keep_q; + if (i == 0) + break; + i--; + } + } + if (q_len > 0 && ((q_ptr[0] & 1) != 0)) + /* q is odd. */ + increment_q: + { + size_t i; + for (i = 0; i < q_len; i++) + if (++(q_ptr[i]) != 0) + goto keep_q; + q_ptr[q_len++] = 1; + } + keep_q: + if (tmp_roomptr != NULL) + free (tmp_roomptr); + q->limbs = q_ptr; + q->nlimbs = q_len; + return roomptr; +} + +/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal + representation. + Destroys the contents of a. + Return the allocated memory - containing the decimal digits in low-to-high + order, terminated with a NUL character - in case of success, NULL in case + of memory allocation failure. */ +static char * +convert_to_decimal (mpn_t a, size_t extra_zeroes) +{ + mp_limb_t *a_ptr = a.limbs; + size_t a_len = a.nlimbs; + /* 0.03345 is slightly larger than log(2)/(9*log(10)). */ + size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1); + char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes)); + if (c_ptr != NULL) + { + char *d_ptr = c_ptr; + for (; extra_zeroes > 0; extra_zeroes--) + *d_ptr++ = '0'; + while (a_len > 0) + { + /* Divide a by 10^9, in-place. */ + mp_limb_t remainder = 0; + mp_limb_t *ptr = a_ptr + a_len; + size_t count; + for (count = a_len; count > 0; count--) + { + mp_twolimb_t num = + ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr; + *ptr = num / 1000000000; + remainder = num % 1000000000; + } + /* Store the remainder as 9 decimal digits. */ + for (count = 9; count > 0; count--) + { + *d_ptr++ = '0' + (remainder % 10); + remainder = remainder / 10; + } + /* Normalize a. */ + if (a_ptr[a_len - 1] == 0) + a_len--; + } + /* Remove leading zeroes. */ + while (d_ptr > c_ptr && d_ptr[-1] == '0') + d_ptr--; + /* But keep at least one zero. */ + if (d_ptr == c_ptr) + *d_ptr++ = '0'; + /* Terminate the string. */ + *d_ptr = '\0'; + } + return c_ptr; +} + +# if NEED_PRINTF_LONG_DOUBLE + +/* Assuming x is finite and >= 0: + write x as x = 2^e * m, where m is a bignum. + Return the allocated memory in case of success, NULL in case of memory + allocation failure. */ +static void * +decode_long_double (long double x, int *ep, mpn_t *mp) +{ + mpn_t m; + int exp; + long double y; + size_t i; + + /* Allocate memory for result. */ + m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); + if (m.limbs == NULL) + return NULL; + /* Split into exponential part and mantissa. */ + y = frexpl (x, &exp); + if (!(y >= 0.0L && y < 1.0L)) + abort (); + /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * LDBL_MANT_BIT), and the + latter is an integer. */ + /* Convert the mantissa (y * LDBL_MANT_BIT) to a sequence of limbs. + I'm not sure whether it's safe to cast a 'long double' value between + 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only + 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int', + doesn't matter). */ +# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0 +# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 + { + mp_limb_t hi, lo; + y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2)); + hi = (int) y; + y -= hi; + if (!(y >= 0.0L && y < 1.0L)) + abort (); + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + lo = (int) y; + y -= lo; + if (!(y >= 0.0L && y < 1.0L)) + abort (); + m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; + } +# else + { + mp_limb_t d; + y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS); + d = (int) y; + y -= d; + if (!(y >= 0.0L && y < 1.0L)) + abort (); + m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d; + } +# endif +# endif + for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) + { + mp_limb_t hi, lo; + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + hi = (int) y; + y -= hi; + if (!(y >= 0.0L && y < 1.0L)) + abort (); + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + lo = (int) y; + y -= lo; + if (!(y >= 0.0L && y < 1.0L)) + abort (); + m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; + } +#if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess + precision. */ + if (!(y == 0.0L)) + abort (); +#endif + /* Normalise. */ + while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) + m.nlimbs--; + *mp = m; + *ep = exp - LDBL_MANT_BIT; + return m.limbs; +} + +# endif + +# if NEED_PRINTF_DOUBLE + +/* Assuming x is finite and >= 0: + write x as x = 2^e * m, where m is a bignum. + Return the allocated memory in case of success, NULL in case of memory + allocation failure. */ +static void * +decode_double (double x, int *ep, mpn_t *mp) +{ + mpn_t m; + int exp; + double y; + size_t i; + + /* Allocate memory for result. */ + m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS; + m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t)); + if (m.limbs == NULL) + return NULL; + /* Split into exponential part and mantissa. */ + y = frexp (x, &exp); + if (!(y >= 0.0 && y < 1.0)) + abort (); + /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * DBL_MANT_BIT), and the + latter is an integer. */ + /* Convert the mantissa (y * DBL_MANT_BIT) to a sequence of limbs. + I'm not sure whether it's safe to cast a 'double' value between + 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only + 'double' values between 0 and 2^16 (to 'unsigned int' or 'int', + doesn't matter). */ +# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0 +# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2 + { + mp_limb_t hi, lo; + y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2)); + hi = (int) y; + y -= hi; + if (!(y >= 0.0 && y < 1.0)) + abort (); + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + lo = (int) y; + y -= lo; + if (!(y >= 0.0 && y < 1.0)) + abort (); + m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo; + } +# else + { + mp_limb_t d; + y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS); + d = (int) y; + y -= d; + if (!(y >= 0.0 && y < 1.0)) + abort (); + m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d; + } +# endif +# endif + for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; ) + { + mp_limb_t hi, lo; + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + hi = (int) y; + y -= hi; + if (!(y >= 0.0 && y < 1.0)) + abort (); + y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2); + lo = (int) y; + y -= lo; + if (!(y >= 0.0 && y < 1.0)) + abort (); + m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo; + } + if (!(y == 0.0)) + abort (); + /* Normalise. */ + while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0) + m.nlimbs--; + *mp = m; + *ep = exp - DBL_MANT_BIT; + return m.limbs; +} + +# endif + +/* Assuming x = 2^e * m is finite and >= 0, and n is an integer: + Returns the decimal representation of round (x * 10^n). + Return the allocated memory - containing the decimal digits in low-to-high + order, terminated with a NUL character - in case of success, NULL in case + of memory allocation failure. */ +static char * +scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n) +{ + int s; + size_t extra_zeroes; + unsigned int abs_n; + unsigned int abs_s; + mp_limb_t *pow5_ptr; + size_t pow5_len; + unsigned int s_limbs; + unsigned int s_bits; + mpn_t pow5; + mpn_t z; + void *z_memory; + char *digits; + + if (memory == NULL) + return NULL; + /* x = 2^e * m, hence + y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m) + = round (2^s * 5^n * m). */ + s = e + n; + extra_zeroes = 0; + /* Factor out a common power of 10 if possible. */ + if (s > 0 && n > 0) + { + extra_zeroes = (s < n ? s : n); + s -= extra_zeroes; + n -= extra_zeroes; + } + /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes. + Before converting to decimal, we need to compute + z = round (2^s * 5^n * m). */ + /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same + sign. 2.322 is slightly larger than log(5)/log(2). */ + abs_n = (n >= 0 ? n : -n); + abs_s = (s >= 0 ? s : -s); + pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1 + + abs_s / GMP_LIMB_BITS + 1) + * sizeof (mp_limb_t)); + if (pow5_ptr == NULL) + { + free (memory); + return NULL; + } + /* Initialize with 1. */ + pow5_ptr[0] = 1; + pow5_len = 1; + /* Multiply with 5^|n|. */ + if (abs_n > 0) + { + static mp_limb_t const small_pow5[13 + 1] = + { + 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, + 48828125, 244140625, 1220703125 + }; + unsigned int n13; + for (n13 = 0; n13 <= abs_n; n13 += 13) + { + mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13]; + size_t j; + mp_twolimb_t carry = 0; + for (j = 0; j < pow5_len; j++) + { + mp_limb_t digit2 = pow5_ptr[j]; + carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2; + pow5_ptr[j] = (mp_limb_t) carry; + carry = carry >> GMP_LIMB_BITS; + } + if (carry > 0) + pow5_ptr[pow5_len++] = (mp_limb_t) carry; + } + } + s_limbs = abs_s / GMP_LIMB_BITS; + s_bits = abs_s % GMP_LIMB_BITS; + if (n >= 0 ? s >= 0 : s <= 0) + { + /* Multiply with 2^|s|. */ + if (s_bits > 0) + { + mp_limb_t *ptr = pow5_ptr; + mp_twolimb_t accu = 0; + size_t count; + for (count = pow5_len; count > 0; count--) + { + accu += (mp_twolimb_t) *ptr << s_bits; + *ptr++ = (mp_limb_t) accu; + accu = accu >> GMP_LIMB_BITS; + } + if (accu > 0) + { + *ptr = (mp_limb_t) accu; + pow5_len++; + } + } + if (s_limbs > 0) + { + size_t count; + for (count = pow5_len; count > 0;) + { + count--; + pow5_ptr[s_limbs + count] = pow5_ptr[count]; + } + for (count = s_limbs; count > 0;) + { + count--; + pow5_ptr[count] = 0; + } + pow5_len += s_limbs; + } + pow5.limbs = pow5_ptr; + pow5.nlimbs = pow5_len; + if (n >= 0) + { + /* Multiply m with pow5. No division needed. */ + z_memory = multiply (m, pow5, &z); + } + else + { + /* Divide m by pow5 and round. */ + z_memory = divide (m, pow5, &z); + } + } + else + { + pow5.limbs = pow5_ptr; + pow5.nlimbs = pow5_len; + if (n >= 0) + { + /* n >= 0, s < 0. + Multiply m with pow5, then divide by 2^|s|. */ + mpn_t numerator; + mpn_t denominator; + void *tmp_memory; + tmp_memory = multiply (m, pow5, &numerator); + if (tmp_memory == NULL) + { + free (pow5_ptr); + free (memory); + return NULL; + } + /* Construct 2^|s|. */ + { + mp_limb_t *ptr = pow5_ptr + pow5_len; + size_t i; + for (i = 0; i < s_limbs; i++) + ptr[i] = 0; + ptr[s_limbs] = (mp_limb_t) 1 << s_bits; + denominator.limbs = ptr; + denominator.nlimbs = s_limbs + 1; + } + z_memory = divide (numerator, denominator, &z); + free (tmp_memory); + } + else + { + /* n < 0, s > 0. + Multiply m with 2^s, then divide by pow5. */ + mpn_t numerator; + mp_limb_t *num_ptr; + num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1) + * sizeof (mp_limb_t)); + if (num_ptr == NULL) + { + free (pow5_ptr); + free (memory); + return NULL; + } + { + mp_limb_t *destptr = num_ptr; + { + size_t i; + for (i = 0; i < s_limbs; i++) + *destptr++ = 0; + } + if (s_bits > 0) + { + const mp_limb_t *sourceptr = m.limbs; + mp_twolimb_t accu = 0; + size_t count; + for (count = m.nlimbs; count > 0; count--) + { + accu += (mp_twolimb_t) *sourceptr++ << s_bits; + *destptr++ = (mp_limb_t) accu; + accu = accu >> GMP_LIMB_BITS; + } + if (accu > 0) + *destptr++ = (mp_limb_t) accu; + } + else + { + const mp_limb_t *sourceptr = m.limbs; + size_t count; + for (count = m.nlimbs; count > 0; count--) + *destptr++ = *sourceptr++; + } + numerator.limbs = num_ptr; + numerator.nlimbs = destptr - num_ptr; + } + z_memory = divide (numerator, pow5, &z); + free (num_ptr); + } + } + free (pow5_ptr); + free (memory); + + /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */ + + if (z_memory == NULL) + return NULL; + digits = convert_to_decimal (z, extra_zeroes); + free (z_memory); + return digits; +} + +# if NEED_PRINTF_LONG_DOUBLE + +/* Assuming x is finite and >= 0, and n is an integer: + Returns the decimal representation of round (x * 10^n). + Return the allocated memory - containing the decimal digits in low-to-high + order, terminated with a NUL character - in case of success, NULL in case + of memory allocation failure. */ +static char * +scale10_round_decimal_long_double (long double x, int n) +{ + int e; + mpn_t m; + void *memory = decode_long_double (x, &e, &m); + return scale10_round_decimal_decoded (e, m, memory, n); +} + +# endif + +# if NEED_PRINTF_DOUBLE + +/* Assuming x is finite and >= 0, and n is an integer: + Returns the decimal representation of round (x * 10^n). + Return the allocated memory - containing the decimal digits in low-to-high + order, terminated with a NUL character - in case of success, NULL in case + of memory allocation failure. */ +static char * +scale10_round_decimal_double (double x, int n) +{ + int e; + mpn_t m; + void *memory = decode_double (x, &e, &m); + return scale10_round_decimal_decoded (e, m, memory, n); +} + +# endif + +# if NEED_PRINTF_LONG_DOUBLE + +/* Assuming x is finite and > 0: + Return an approximation for n with 10^n <= x < 10^(n+1). + The approximation is usually the right n, but may be off by 1 sometimes. */ +static int +floorlog10l (long double x) +{ + int exp; + long double y; + double z; + double l; + + /* Split into exponential part and mantissa. */ + y = frexpl (x, &exp); + if (!(y >= 0.0L && y < 1.0L)) + abort (); + if (y == 0.0L) + return INT_MIN; + if (y < 0.5L) + { + while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) + { + y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); + exp -= GMP_LIMB_BITS; + } + if (y < (1.0L / (1 << 16))) + { + y *= 1.0L * (1 << 16); + exp -= 16; + } + if (y < (1.0L / (1 << 8))) + { + y *= 1.0L * (1 << 8); + exp -= 8; + } + if (y < (1.0L / (1 << 4))) + { + y *= 1.0L * (1 << 4); + exp -= 4; + } + if (y < (1.0L / (1 << 2))) + { + y *= 1.0L * (1 << 2); + exp -= 2; + } + if (y < (1.0L / (1 << 1))) + { + y *= 1.0L * (1 << 1); + exp -= 1; + } + } + if (!(y >= 0.5L && y < 1.0L)) + abort (); + /* Compute an approximation for l = log2(x) = exp + log2(y). */ + l = exp; + z = y; + if (z < 0.70710678118654752444) + { + z *= 1.4142135623730950488; + l -= 0.5; + } + if (z < 0.8408964152537145431) + { + z *= 1.1892071150027210667; + l -= 0.25; + } + if (z < 0.91700404320467123175) + { + z *= 1.0905077326652576592; + l -= 0.125; + } + if (z < 0.9576032806985736469) + { + z *= 1.0442737824274138403; + l -= 0.0625; + } + /* Now 0.95 <= z <= 1.01. */ + z = 1 - z; + /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ... + Four terms are enough to get an approximation with error < 10^-7. */ + l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); + /* Finally multiply with log(2)/log(10), yields an approximation for + log10(x). */ + l *= 0.30102999566398119523; + /* Round down to the next integer. */ + return (int) l + (l < 0 ? -1 : 0); +} + +# endif + +# if NEED_PRINTF_DOUBLE + +/* Assuming x is finite and > 0: + Return an approximation for n with 10^n <= x < 10^(n+1). + The approximation is usually the right n, but may be off by 1 sometimes. */ +static int +floorlog10 (double x) +{ + int exp; + double y; + double z; + double l; + + /* Split into exponential part and mantissa. */ + y = frexp (x, &exp); + if (!(y >= 0.0 && y < 1.0)) + abort (); + if (y == 0.0) + return INT_MIN; + if (y < 0.5) + { + while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2)))) + { + y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2)); + exp -= GMP_LIMB_BITS; + } + if (y < (1.0 / (1 << 16))) + { + y *= 1.0 * (1 << 16); + exp -= 16; + } + if (y < (1.0 / (1 << 8))) + { + y *= 1.0 * (1 << 8); + exp -= 8; + } + if (y < (1.0 / (1 << 4))) + { + y *= 1.0 * (1 << 4); + exp -= 4; + } + if (y < (1.0 / (1 << 2))) + { + y *= 1.0 * (1 << 2); + exp -= 2; + } + if (y < (1.0 / (1 << 1))) + { + y *= 1.0 * (1 << 1); + exp -= 1; + } + } + if (!(y >= 0.5 && y < 1.0)) + abort (); + /* Compute an approximation for l = log2(x) = exp + log2(y). */ + l = exp; + z = y; + if (z < 0.70710678118654752444) + { + z *= 1.4142135623730950488; + l -= 0.5; + } + if (z < 0.8408964152537145431) + { + z *= 1.1892071150027210667; + l -= 0.25; + } + if (z < 0.91700404320467123175) + { + z *= 1.0905077326652576592; + l -= 0.125; + } + if (z < 0.9576032806985736469) + { + z *= 1.0442737824274138403; + l -= 0.0625; + } + /* Now 0.95 <= z <= 1.01. */ + z = 1 - z; + /* log(1-z) = - z - z^2/2 - z^3/3 - z^4/4 - ... + Four terms are enough to get an approximation with error < 10^-7. */ + l -= z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25))); + /* Finally multiply with log(2)/log(10), yields an approximation for + log10(x). */ + l *= 0.30102999566398119523; + /* Round down to the next integer. */ + return (int) l + (l < 0 ? -1 : 0); +} + +# endif + +#endif + +DCHAR_T * +VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp, + const FCHAR_T *format, va_list args) +{ + DIRECTIVES d; + arguments a; + + if (PRINTF_PARSE (format, &d, &a) < 0) + /* errno is already set. */ + return NULL; + +#define CLEANUP() \ + free (d.dir); \ + if (a.arg) \ + free (a.arg); + + if (PRINTF_FETCHARGS (args, &a) < 0) + { + CLEANUP (); + errno = EINVAL; + return NULL; + } + + { + size_t buf_neededlength; + TCHAR_T *buf; + TCHAR_T *buf_malloced; + const FCHAR_T *cp; + size_t i; + DIRECTIVE *dp; + /* Output string accumulator. */ + DCHAR_T *result; + size_t allocated; + size_t length; + + /* Allocate a small buffer that will hold a directive passed to + sprintf or snprintf. */ + buf_neededlength = + xsum4 (7, d.max_width_length, d.max_precision_length, 6); +#if HAVE_ALLOCA + if (buf_neededlength < 4000 / sizeof (TCHAR_T)) + { + buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T)); + buf_malloced = NULL; + } + else +#endif + { + size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T)); + if (size_overflow_p (buf_memsize)) + goto out_of_memory_1; + buf = (TCHAR_T *) malloc (buf_memsize); + if (buf == NULL) + goto out_of_memory_1; + buf_malloced = buf; + } + + if (resultbuf != NULL) + { + result = resultbuf; + allocated = *lengthp; + } + else + { + result = NULL; + allocated = 0; + } + length = 0; + /* Invariants: + result is either == resultbuf or == NULL or malloc-allocated. + If length > 0, then result != NULL. */ + + /* Ensures that allocated >= needed. Aborts through a jump to + out_of_memory if needed is SIZE_MAX or otherwise too big. */ +#define ENSURE_ALLOCATION(needed) \ + if ((needed) > allocated) \ + { \ + size_t memory_size; \ + DCHAR_T *memory; \ + \ + allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ + if ((needed) > allocated) \ + allocated = (needed); \ + memory_size = xtimes (allocated, sizeof (DCHAR_T)); \ + if (size_overflow_p (memory_size)) \ + goto out_of_memory; \ + if (result == resultbuf || result == NULL) \ + memory = (DCHAR_T *) malloc (memory_size); \ + else \ + memory = (DCHAR_T *) realloc (result, memory_size); \ + if (memory == NULL) \ + goto out_of_memory; \ + if (result == resultbuf && length > 0) \ + DCHAR_CPY (memory, result, length); \ + result = memory; \ + } + + for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) + { + if (cp != dp->dir_start) + { + size_t n = dp->dir_start - cp; + size_t augmented_length = xsum (length, n); + + ENSURE_ALLOCATION (augmented_length); + /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we + need that the format string contains only ASCII characters + if FCHAR_T and DCHAR_T are not the same type. */ + if (sizeof (FCHAR_T) == sizeof (DCHAR_T)) + { + DCHAR_CPY (result + length, (const DCHAR_T *) cp, n); + length = augmented_length; + } + else + { + do + result[length++] = (unsigned char) *cp++; + while (--n > 0); + } + } + if (i == d.count) + break; + + /* Execute a single directive. */ + if (dp->conversion == '%') + { + size_t augmented_length; + + if (!(dp->arg_index == ARG_NONE)) + abort (); + augmented_length = xsum (length, 1); + ENSURE_ALLOCATION (augmented_length); + result[length] = '%'; + length = augmented_length; + } + else + { + if (!(dp->arg_index != ARG_NONE)) + abort (); + + if (dp->conversion == 'n') + { + switch (a.arg[dp->arg_index].type) + { + case TYPE_COUNT_SCHAR_POINTER: + *a.arg[dp->arg_index].a.a_count_schar_pointer = length; + break; + case TYPE_COUNT_SHORT_POINTER: + *a.arg[dp->arg_index].a.a_count_short_pointer = length; + break; + case TYPE_COUNT_INT_POINTER: + *a.arg[dp->arg_index].a.a_count_int_pointer = length; + break; + case TYPE_COUNT_LONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longint_pointer = length; + break; +#if HAVE_LONG_LONG_INT + case TYPE_COUNT_LONGLONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; + break; +#endif + default: + abort (); + } + } +#if ENABLE_UNISTDIO + /* The unistdio extensions. */ + else if (dp->conversion == 'U') + { + arg_type type = a.arg[dp->arg_index].type; + int flags = dp->flags; + int has_width; + size_t width; + int has_precision; + size_t precision; + + has_width = 0; + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + if (arg < 0) + { + /* "A negative field width is taken as a '-' flag + followed by a positive field width." */ + flags |= FLAG_LEFT; + width = (unsigned int) (-arg); + } + else + width = arg; + } + else + { + const FCHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + has_width = 1; + } + + has_precision = 0; + precision = 0; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + /* "A negative precision is taken as if the precision + were omitted." */ + if (arg >= 0) + { + precision = arg; + has_precision = 1; + } + } + else + { + const FCHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + has_precision = 1; + } + } + + switch (type) + { + case TYPE_U8_STRING: + { + const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string; + const uint8_t *arg_end; + size_t characters; + + if (has_precision) + { + /* Use only PRECISION characters, from the left. */ + arg_end = arg; + characters = 0; + for (; precision > 0; precision--) + { + int count = u8_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else if (has_width) + { + /* Use the entire string, and count the number of + characters. */ + arg_end = arg; + characters = 0; + for (;;) + { + int count = u8_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else + { + /* Use the entire string. */ + arg_end = arg + u8_strlen (arg); + /* The number of characters doesn't matter. */ + characters = 0; + } + + if (has_width && width > characters + && !(dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + +# if DCHAR_IS_UINT8_T + { + size_t n = arg_end - arg; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_CPY (result + length, arg, n); + length += n; + } +# else + { /* Convert. */ + DCHAR_T *converted = result + length; + size_t converted_len = allocated - length; +# if DCHAR_IS_TCHAR + /* Convert from UTF-8 to locale encoding. */ + if (u8_conv_to_encoding (locale_charset (), + iconveh_question_mark, + arg, arg_end - arg, NULL, + &converted, &converted_len) + < 0) +# else + /* Convert from UTF-8 to UTF-16/UTF-32. */ + converted = + U8_TO_DCHAR (arg, arg_end - arg, + converted, &converted_len); + if (converted == NULL) +# endif + { + int saved_errno = errno; + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = saved_errno; + return NULL; + } + if (converted != result + length) + { + ENSURE_ALLOCATION (xsum (length, converted_len)); + DCHAR_CPY (result + length, converted, converted_len); + free (converted); + } + length += converted_len; + } +# endif + + if (has_width && width > characters + && (dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + } + break; + + case TYPE_U16_STRING: + { + const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string; + const uint16_t *arg_end; + size_t characters; + + if (has_precision) + { + /* Use only PRECISION characters, from the left. */ + arg_end = arg; + characters = 0; + for (; precision > 0; precision--) + { + int count = u16_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else if (has_width) + { + /* Use the entire string, and count the number of + characters. */ + arg_end = arg; + characters = 0; + for (;;) + { + int count = u16_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else + { + /* Use the entire string. */ + arg_end = arg + u16_strlen (arg); + /* The number of characters doesn't matter. */ + characters = 0; + } + + if (has_width && width > characters + && !(dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + +# if DCHAR_IS_UINT16_T + { + size_t n = arg_end - arg; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_CPY (result + length, arg, n); + length += n; + } +# else + { /* Convert. */ + DCHAR_T *converted = result + length; + size_t converted_len = allocated - length; +# if DCHAR_IS_TCHAR + /* Convert from UTF-16 to locale encoding. */ + if (u16_conv_to_encoding (locale_charset (), + iconveh_question_mark, + arg, arg_end - arg, NULL, + &converted, &converted_len) + < 0) +# else + /* Convert from UTF-16 to UTF-8/UTF-32. */ + converted = + U16_TO_DCHAR (arg, arg_end - arg, + converted, &converted_len); + if (converted == NULL) +# endif + { + int saved_errno = errno; + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = saved_errno; + return NULL; + } + if (converted != result + length) + { + ENSURE_ALLOCATION (xsum (length, converted_len)); + DCHAR_CPY (result + length, converted, converted_len); + free (converted); + } + length += converted_len; + } +# endif + + if (has_width && width > characters + && (dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + } + break; + + case TYPE_U32_STRING: + { + const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string; + const uint32_t *arg_end; + size_t characters; + + if (has_precision) + { + /* Use only PRECISION characters, from the left. */ + arg_end = arg; + characters = 0; + for (; precision > 0; precision--) + { + int count = u32_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else if (has_width) + { + /* Use the entire string, and count the number of + characters. */ + arg_end = arg; + characters = 0; + for (;;) + { + int count = u32_strmblen (arg_end); + if (count == 0) + break; + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EILSEQ; + return NULL; + } + arg_end += count; + characters++; + } + } + else + { + /* Use the entire string. */ + arg_end = arg + u32_strlen (arg); + /* The number of characters doesn't matter. */ + characters = 0; + } + + if (has_width && width > characters + && !(dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + +# if DCHAR_IS_UINT32_T + { + size_t n = arg_end - arg; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_CPY (result + length, arg, n); + length += n; + } +# else + { /* Convert. */ + DCHAR_T *converted = result + length; + size_t converted_len = allocated - length; +# if DCHAR_IS_TCHAR + /* Convert from UTF-32 to locale encoding. */ + if (u32_conv_to_encoding (locale_charset (), + iconveh_question_mark, + arg, arg_end - arg, NULL, + &converted, &converted_len) + < 0) +# else + /* Convert from UTF-32 to UTF-8/UTF-16. */ + converted = + U32_TO_DCHAR (arg, arg_end - arg, + converted, &converted_len); + if (converted == NULL) +# endif + { + int saved_errno = errno; + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = saved_errno; + return NULL; + } + if (converted != result + length) + { + ENSURE_ALLOCATION (xsum (length, converted_len)); + DCHAR_CPY (result + length, converted, converted_len); + free (converted); + } + length += converted_len; + } +# endif + + if (has_width && width > characters + && (dp->flags & FLAG_LEFT)) + { + size_t n = width - characters; + ENSURE_ALLOCATION (xsum (length, n)); + DCHAR_SET (result + length, ' ', n); + length += n; + } + } + break; + + default: + abort (); + } + } +#endif +#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL + else if ((dp->conversion == 'a' || dp->conversion == 'A') +# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE)) + && (0 +# if NEED_PRINTF_DOUBLE + || a.arg[dp->arg_index].type == TYPE_DOUBLE +# endif +# if NEED_PRINTF_LONG_DOUBLE + || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE +# endif + ) +# endif + ) + { + arg_type type = a.arg[dp->arg_index].type; + int flags = dp->flags; + int has_width; + size_t width; + int has_precision; + size_t precision; + size_t tmp_length; + DCHAR_T tmpbuf[700]; + DCHAR_T *tmp; + DCHAR_T *pad_ptr; + DCHAR_T *p; + + has_width = 0; + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + if (arg < 0) + { + /* "A negative field width is taken as a '-' flag + followed by a positive field width." */ + flags |= FLAG_LEFT; + width = (unsigned int) (-arg); + } + else + width = arg; + } + else + { + const FCHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + has_width = 1; + } + + has_precision = 0; + precision = 0; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + /* "A negative precision is taken as if the precision + were omitted." */ + if (arg >= 0) + { + precision = arg; + has_precision = 1; + } + } + else + { + const FCHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + has_precision = 1; + } + } + + /* Allocate a temporary buffer of sufficient size. */ + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) ((LDBL_DIG + 1) + * 0.831 /* decimal -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) ((DBL_DIG + 1) + * 0.831 /* decimal -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Account for sign, decimal point etc. */ + tmp_length = xsum (tmp_length, 12); + + if (tmp_length < width) + tmp_length = width; + + tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ + + if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) + tmp = tmpbuf; + else + { + size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); + + if (size_overflow_p (tmp_memsize)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + tmp = (DCHAR_T *) malloc (tmp_memsize); + if (tmp == NULL) + /* Out of memory. */ + goto out_of_memory; + } + + pad_ptr = NULL; + p = tmp; + if (type == TYPE_LONGDOUBLE) + { +# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE + long double arg = a.arg[dp->arg_index].a.a_longdouble; + + if (isnanl (arg)) + { + if (dp->conversion == 'A') + { + *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; + } + else + { + *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; + } + } + else + { + int sign = 0; + DECL_LONG_DOUBLE_ROUNDING + + BEGIN_LONG_DOUBLE_ROUNDING (); + + if (signbit (arg)) /* arg < 0.0L or negative zero */ + { + sign = -1; + arg = -arg; + } + + if (sign < 0) + *p++ = '-'; + else if (flags & FLAG_SHOWSIGN) + *p++ = '+'; + else if (flags & FLAG_SPACE) + *p++ = ' '; + + if (arg > 0.0L && arg + arg == arg) + { + if (dp->conversion == 'A') + { + *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; + } + else + { + *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; + } + } + else + { + int exponent; + long double mantissa; + + if (arg > 0.0L) + mantissa = printf_frexpl (arg, &exponent); + else + { + exponent = 0; + mantissa = 0.0L; + } + + if (has_precision + && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1) + { + /* Round the mantissa. */ + long double tail = mantissa; + size_t q; + + for (q = precision; ; q--) + { + int digit = (int) tail; + tail -= digit; + if (q == 0) + { + if (digit & 1 ? tail >= 0.5L : tail > 0.5L) + tail = 1 - tail; + else + tail = - tail; + break; + } + tail *= 16.0L; + } + if (tail != 0.0L) + for (q = precision; q > 0; q--) + tail *= 0.0625L; + mantissa += tail; + } + + *p++ = '0'; + *p++ = dp->conversion - 'A' + 'X'; + pad_ptr = p; + { + int digit; + + digit = (int) mantissa; + mantissa -= digit; + *p++ = '0' + digit; + if ((flags & FLAG_ALT) + || mantissa > 0.0L || precision > 0) + { + *p++ = decimal_point_char (); + /* This loop terminates because we assume + that FLT_RADIX is a power of 2. */ + while (mantissa > 0.0L) + { + mantissa *= 16.0L; + digit = (int) mantissa; + mantissa -= digit; + *p++ = digit + + (digit < 10 + ? '0' + : dp->conversion - 10); + if (precision > 0) + precision--; + } + while (precision > 0) + { + *p++ = '0'; + precision--; + } + } + } + *p++ = dp->conversion - 'A' + 'P'; +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + { '%', '+', 'd', '\0' }; + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, "%+d", exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, "%+d", exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } +# endif + } + + END_LONG_DOUBLE_ROUNDING (); + } +# else + abort (); +# endif + } + else + { +# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE + double arg = a.arg[dp->arg_index].a.a_double; + + if (isnand (arg)) + { + if (dp->conversion == 'A') + { + *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; + } + else + { + *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; + } + } + else + { + int sign = 0; + + if (signbit (arg)) /* arg < 0.0 or negative zero */ + { + sign = -1; + arg = -arg; + } + + if (sign < 0) + *p++ = '-'; + else if (flags & FLAG_SHOWSIGN) + *p++ = '+'; + else if (flags & FLAG_SPACE) + *p++ = ' '; + + if (arg > 0.0 && arg + arg == arg) + { + if (dp->conversion == 'A') + { + *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; + } + else + { + *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; + } + } + else + { + int exponent; + double mantissa; + + if (arg > 0.0) + mantissa = printf_frexp (arg, &exponent); + else + { + exponent = 0; + mantissa = 0.0; + } + + if (has_precision + && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1) + { + /* Round the mantissa. */ + double tail = mantissa; + size_t q; + + for (q = precision; ; q--) + { + int digit = (int) tail; + tail -= digit; + if (q == 0) + { + if (digit & 1 ? tail >= 0.5 : tail > 0.5) + tail = 1 - tail; + else + tail = - tail; + break; + } + tail *= 16.0; + } + if (tail != 0.0) + for (q = precision; q > 0; q--) + tail *= 0.0625; + mantissa += tail; + } + + *p++ = '0'; + *p++ = dp->conversion - 'A' + 'X'; + pad_ptr = p; + { + int digit; + + digit = (int) mantissa; + mantissa -= digit; + *p++ = '0' + digit; + if ((flags & FLAG_ALT) + || mantissa > 0.0 || precision > 0) + { + *p++ = decimal_point_char (); + /* This loop terminates because we assume + that FLT_RADIX is a power of 2. */ + while (mantissa > 0.0) + { + mantissa *= 16.0; + digit = (int) mantissa; + mantissa -= digit; + *p++ = digit + + (digit < 10 + ? '0' + : dp->conversion - 10); + if (precision > 0) + precision--; + } + while (precision > 0) + { + *p++ = '0'; + precision--; + } + } + } + *p++ = dp->conversion - 'A' + 'P'; +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + { '%', '+', 'd', '\0' }; + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, "%+d", exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, "%+d", exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } +# endif + } + } +# else + abort (); +# endif + } + /* The generated string now extends from tmp to p, with the + zero padding insertion point being at pad_ptr. */ + if (has_width && p - tmp < width) + { + size_t pad = width - (p - tmp); + DCHAR_T *end = p + pad; + + if (flags & FLAG_LEFT) + { + /* Pad with spaces on the right. */ + for (; pad > 0; pad--) + *p++ = ' '; + } + else if ((flags & FLAG_ZERO) && pad_ptr != NULL) + { + /* Pad with zeroes. */ + DCHAR_T *q = end; + + while (p > pad_ptr) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = '0'; + } + else + { + /* Pad with spaces on the left. */ + DCHAR_T *q = end; + + while (p > tmp) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = ' '; + } + + p = end; + } + + { + size_t count = p - tmp; + + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); + + /* Make room for the result. */ + if (count >= allocated - length) + { + size_t n = xsum (length, count); + + ENSURE_ALLOCATION (n); + } + + /* Append the result. */ + memcpy (result + length, tmp, count * sizeof (DCHAR_T)); + if (tmp != tmpbuf) + free (tmp); + length += count; + } + } +#endif +#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL + else if ((dp->conversion == 'f' || dp->conversion == 'F' + || dp->conversion == 'e' || dp->conversion == 'E' + || dp->conversion == 'g' || dp->conversion == 'G' + || dp->conversion == 'a' || dp->conversion == 'A') + && (0 +# if NEED_PRINTF_DOUBLE + || a.arg[dp->arg_index].type == TYPE_DOUBLE +# elif NEED_PRINTF_INFINITE_DOUBLE + || (a.arg[dp->arg_index].type == TYPE_DOUBLE + /* The systems (mingw) which produce wrong output + for Inf, -Inf, and NaN also do so for -0.0. + Therefore we treat this case here as well. */ + && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double)) +# endif +# if NEED_PRINTF_LONG_DOUBLE + || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE +# elif NEED_PRINTF_INFINITE_LONG_DOUBLE + || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE + /* Some systems produce wrong output for Inf, + -Inf, and NaN. */ + && is_infinitel (a.arg[dp->arg_index].a.a_longdouble)) +# endif + )) + { +# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) + arg_type type = a.arg[dp->arg_index].type; +# endif + int flags = dp->flags; + int has_width; + size_t width; + int has_precision; + size_t precision; + size_t tmp_length; + DCHAR_T tmpbuf[700]; + DCHAR_T *tmp; + DCHAR_T *pad_ptr; + DCHAR_T *p; + + has_width = 0; + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + if (arg < 0) + { + /* "A negative field width is taken as a '-' flag + followed by a positive field width." */ + flags |= FLAG_LEFT; + width = (unsigned int) (-arg); + } + else + width = arg; + } + else + { + const FCHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + has_width = 1; + } + + has_precision = 0; + precision = 0; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + /* "A negative precision is taken as if the precision + were omitted." */ + if (arg >= 0) + { + precision = arg; + has_precision = 1; + } + } + else + { + const FCHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + has_precision = 1; + } + } + + /* POSIX specifies the default precision to be 6 for %f, %F, + %e, %E, but not for %g, %G. Implementations appear to use + the same default precision also for %g, %G. */ + if (!has_precision) + precision = 6; + + /* Allocate a temporary buffer of sufficient size. */ +# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE + tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1); +# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE + tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0); +# elif NEED_PRINTF_LONG_DOUBLE + tmp_length = LDBL_DIG + 1; +# elif NEED_PRINTF_DOUBLE + tmp_length = DBL_DIG + 1; +# else + tmp_length = 0; +# endif + if (tmp_length < precision) + tmp_length = precision; +# if NEED_PRINTF_LONG_DOUBLE +# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE + if (type == TYPE_LONGDOUBLE) +# endif + if (dp->conversion == 'f' || dp->conversion == 'F') + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + if (!(isnanl (arg) || arg + arg == arg)) + { + /* arg is finite and nonzero. */ + int exponent = floorlog10l (arg < 0 ? -arg : arg); + if (exponent >= 0 && tmp_length < exponent + precision) + tmp_length = exponent + precision; + } + } +# endif +# if NEED_PRINTF_DOUBLE +# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE + if (type == TYPE_DOUBLE) +# endif + if (dp->conversion == 'f' || dp->conversion == 'F') + { + double arg = a.arg[dp->arg_index].a.a_double; + if (!(isnand (arg) || arg + arg == arg)) + { + /* arg is finite and nonzero. */ + int exponent = floorlog10 (arg < 0 ? -arg : arg); + if (exponent >= 0 && tmp_length < exponent + precision) + tmp_length = exponent + precision; + } + } +# endif + /* Account for sign, decimal point etc. */ + tmp_length = xsum (tmp_length, 12); + + if (tmp_length < width) + tmp_length = width; + + tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ + + if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T)) + tmp = tmpbuf; + else + { + size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T)); + + if (size_overflow_p (tmp_memsize)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + tmp = (DCHAR_T *) malloc (tmp_memsize); + if (tmp == NULL) + /* Out of memory. */ + goto out_of_memory; + } + + pad_ptr = NULL; + p = tmp; + +# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE +# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE + if (type == TYPE_LONGDOUBLE) +# endif + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + + if (isnanl (arg)) + { + if (dp->conversion >= 'A' && dp->conversion <= 'Z') + { + *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; + } + else + { + *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; + } + } + else + { + int sign = 0; + DECL_LONG_DOUBLE_ROUNDING + + BEGIN_LONG_DOUBLE_ROUNDING (); + + if (signbit (arg)) /* arg < 0.0L or negative zero */ + { + sign = -1; + arg = -arg; + } + + if (sign < 0) + *p++ = '-'; + else if (flags & FLAG_SHOWSIGN) + *p++ = '+'; + else if (flags & FLAG_SPACE) + *p++ = ' '; + + if (arg > 0.0L && arg + arg == arg) + { + if (dp->conversion >= 'A' && dp->conversion <= 'Z') + { + *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; + } + else + { + *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; + } + } + else + { +# if NEED_PRINTF_LONG_DOUBLE + pad_ptr = p; + + if (dp->conversion == 'f' || dp->conversion == 'F') + { + char *digits; + size_t ndigits; + + digits = + scale10_round_decimal_long_double (arg, precision); + if (digits == NULL) + { + END_LONG_DOUBLE_ROUNDING (); + goto out_of_memory; + } + ndigits = strlen (digits); + + if (ndigits > precision) + do + { + --ndigits; + *p++ = digits[ndigits]; + } + while (ndigits > precision); + else + *p++ = '0'; + /* Here ndigits <= precision. */ + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > ndigits; precision--) + *p++ = '0'; + while (ndigits > 0) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + + free (digits); + } + else if (dp->conversion == 'e' || dp->conversion == 'E') + { + int exponent; + + if (arg == 0.0L) + { + exponent = 0; + *p++ = '0'; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > 0; precision--) + *p++ = '0'; + } + } + else + { + /* arg > 0.0L. */ + int adjusted; + char *digits; + size_t ndigits; + + exponent = floorlog10l (arg); + adjusted = 0; + for (;;) + { + digits = + scale10_round_decimal_long_double (arg, + (int)precision - exponent); + if (digits == NULL) + { + END_LONG_DOUBLE_ROUNDING (); + goto out_of_memory; + } + ndigits = strlen (digits); + + if (ndigits == precision + 1) + break; + if (ndigits < precision + || ndigits > precision + 2) + /* The exponent was not guessed + precisely enough. */ + abort (); + if (adjusted) + /* None of two values of exponent is + the right one. Prevent an endless + loop. */ + abort (); + free (digits); + if (ndigits == precision) + exponent -= 1; + else + exponent += 1; + adjusted = 1; + } + + /* Here ndigits = precision+1. */ + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + while (ndigits > 0) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + + free (digits); + } + + *p++ = dp->conversion; /* 'e' or 'E' */ +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + { '%', '+', '.', '2', 'd', '\0' }; + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, "%+.2d", exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, "%+.2d", exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } +# endif + } + else if (dp->conversion == 'g' || dp->conversion == 'G') + { + if (precision == 0) + precision = 1; + /* precision >= 1. */ + + if (arg == 0.0L) + /* The exponent is 0, >= -4, < precision. + Use fixed-point notation. */ + { + size_t ndigits = precision; + /* Number of trailing zeroes that have to be + dropped. */ + size_t nzeroes = + (flags & FLAG_ALT ? 0 : precision - 1); + + --ndigits; + *p++ = '0'; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = '0'; + } + } + } + else + { + /* arg > 0.0L. */ + int exponent; + int adjusted; + char *digits; + size_t ndigits; + size_t nzeroes; + + exponent = floorlog10l (arg); + adjusted = 0; + for (;;) + { + digits = + scale10_round_decimal_long_double (arg, + (int)(precision - 1) - exponent); + if (digits == NULL) + { + END_LONG_DOUBLE_ROUNDING (); + goto out_of_memory; + } + ndigits = strlen (digits); + + if (ndigits == precision) + break; + if (ndigits < precision - 1 + || ndigits > precision + 1) + /* The exponent was not guessed + precisely enough. */ + abort (); + if (adjusted) + /* None of two values of exponent is + the right one. Prevent an endless + loop. */ + abort (); + free (digits); + if (ndigits < precision) + exponent -= 1; + else + exponent += 1; + adjusted = 1; + } + /* Here ndigits = precision. */ + + /* Determine the number of trailing zeroes + that have to be dropped. */ + nzeroes = 0; + if ((flags & FLAG_ALT) == 0) + while (nzeroes < ndigits + && digits[nzeroes] == '0') + nzeroes++; + + /* The exponent is now determined. */ + if (exponent >= -4 + && exponent < (long)precision) + { + /* Fixed-point notation: + max(exponent,0)+1 digits, then the + decimal point, then the remaining + digits without trailing zeroes. */ + if (exponent >= 0) + { + size_t count = exponent + 1; + /* Note: count <= precision = ndigits. */ + for (; count > 0; count--) + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + } + else + { + size_t count = -exponent - 1; + *p++ = '0'; + *p++ = decimal_point_char (); + for (; count > 0; count--) + *p++ = '0'; + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + } + else + { + /* Exponential notation. */ + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + { '%', '+', '.', '2', 'd', '\0' }; + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, "%+.2d", exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, "%+.2d", exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } +# endif + } + + free (digits); + } + } + else + abort (); +# else + /* arg is finite. */ + abort (); +# endif + } + + END_LONG_DOUBLE_ROUNDING (); + } + } +# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE + else +# endif +# endif +# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE + { + double arg = a.arg[dp->arg_index].a.a_double; + + if (isnand (arg)) + { + if (dp->conversion >= 'A' && dp->conversion <= 'Z') + { + *p++ = 'N'; *p++ = 'A'; *p++ = 'N'; + } + else + { + *p++ = 'n'; *p++ = 'a'; *p++ = 'n'; + } + } + else + { + int sign = 0; + + if (signbit (arg)) /* arg < 0.0 or negative zero */ + { + sign = -1; + arg = -arg; + } + + if (sign < 0) + *p++ = '-'; + else if (flags & FLAG_SHOWSIGN) + *p++ = '+'; + else if (flags & FLAG_SPACE) + *p++ = ' '; + + if (arg > 0.0 && arg + arg == arg) + { + if (dp->conversion >= 'A' && dp->conversion <= 'Z') + { + *p++ = 'I'; *p++ = 'N'; *p++ = 'F'; + } + else + { + *p++ = 'i'; *p++ = 'n'; *p++ = 'f'; + } + } + else + { +# if NEED_PRINTF_DOUBLE + pad_ptr = p; + + if (dp->conversion == 'f' || dp->conversion == 'F') + { + char *digits; + size_t ndigits; + + digits = + scale10_round_decimal_double (arg, precision); + if (digits == NULL) + goto out_of_memory; + ndigits = strlen (digits); + + if (ndigits > precision) + do + { + --ndigits; + *p++ = digits[ndigits]; + } + while (ndigits > precision); + else + *p++ = '0'; + /* Here ndigits <= precision. */ + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > ndigits; precision--) + *p++ = '0'; + while (ndigits > 0) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + + free (digits); + } + else if (dp->conversion == 'e' || dp->conversion == 'E') + { + int exponent; + + if (arg == 0.0) + { + exponent = 0; + *p++ = '0'; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > 0; precision--) + *p++ = '0'; + } + } + else + { + /* arg > 0.0. */ + int adjusted; + char *digits; + size_t ndigits; + + exponent = floorlog10 (arg); + adjusted = 0; + for (;;) + { + digits = + scale10_round_decimal_double (arg, + (int)precision - exponent); + if (digits == NULL) + goto out_of_memory; + ndigits = strlen (digits); + + if (ndigits == precision + 1) + break; + if (ndigits < precision + || ndigits > precision + 2) + /* The exponent was not guessed + precisely enough. */ + abort (); + if (adjusted) + /* None of two values of exponent is + the right one. Prevent an endless + loop. */ + abort (); + free (digits); + if (ndigits == precision) + exponent -= 1; + else + exponent += 1; + adjusted = 1; + } + + /* Here ndigits = precision+1. */ + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + while (ndigits > 0) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + + free (digits); + } + + *p++ = dp->conversion; /* 'e' or 'E' */ +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + /* Produce the same number of exponent digits + as the native printf implementation. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + { '%', '+', '.', '3', 'd', '\0' }; +# else + { '%', '+', '.', '2', 'd', '\0' }; +# endif + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + { + static const char decimal_format[] = + /* Produce the same number of exponent digits + as the native printf implementation. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + "%+.3d"; +# else + "%+.2d"; +# endif + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, decimal_format, exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, decimal_format, exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } + } +# endif + } + else if (dp->conversion == 'g' || dp->conversion == 'G') + { + if (precision == 0) + precision = 1; + /* precision >= 1. */ + + if (arg == 0.0) + /* The exponent is 0, >= -4, < precision. + Use fixed-point notation. */ + { + size_t ndigits = precision; + /* Number of trailing zeroes that have to be + dropped. */ + size_t nzeroes = + (flags & FLAG_ALT ? 0 : precision - 1); + + --ndigits; + *p++ = '0'; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = '0'; + } + } + } + else + { + /* arg > 0.0. */ + int exponent; + int adjusted; + char *digits; + size_t ndigits; + size_t nzeroes; + + exponent = floorlog10 (arg); + adjusted = 0; + for (;;) + { + digits = + scale10_round_decimal_double (arg, + (int)(precision - 1) - exponent); + if (digits == NULL) + goto out_of_memory; + ndigits = strlen (digits); + + if (ndigits == precision) + break; + if (ndigits < precision - 1 + || ndigits > precision + 1) + /* The exponent was not guessed + precisely enough. */ + abort (); + if (adjusted) + /* None of two values of exponent is + the right one. Prevent an endless + loop. */ + abort (); + free (digits); + if (ndigits < precision) + exponent -= 1; + else + exponent += 1; + adjusted = 1; + } + /* Here ndigits = precision. */ + + /* Determine the number of trailing zeroes + that have to be dropped. */ + nzeroes = 0; + if ((flags & FLAG_ALT) == 0) + while (nzeroes < ndigits + && digits[nzeroes] == '0') + nzeroes++; + + /* The exponent is now determined. */ + if (exponent >= -4 + && exponent < (long)precision) + { + /* Fixed-point notation: + max(exponent,0)+1 digits, then the + decimal point, then the remaining + digits without trailing zeroes. */ + if (exponent >= 0) + { + size_t count = exponent + 1; + /* Note: count <= precision = ndigits. */ + for (; count > 0; count--) + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + } + else + { + size_t count = -exponent - 1; + *p++ = '0'; + *p++ = decimal_point_char (); + for (; count > 0; count--) + *p++ = '0'; + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + } + else + { + /* Exponential notation. */ + *p++ = digits[--ndigits]; + if ((flags & FLAG_ALT) || ndigits > nzeroes) + { + *p++ = decimal_point_char (); + while (ndigits > nzeroes) + { + --ndigits; + *p++ = digits[ndigits]; + } + } + *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */ +# if WIDE_CHAR_VERSION + { + static const wchar_t decimal_format[] = + /* Produce the same number of exponent digits + as the native printf implementation. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + { '%', '+', '.', '3', 'd', '\0' }; +# else + { '%', '+', '.', '2', 'd', '\0' }; +# endif + SNPRINTF (p, 6 + 1, decimal_format, exponent); + } + while (*p != '\0') + p++; +# else + { + static const char decimal_format[] = + /* Produce the same number of exponent digits + as the native printf implementation. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + "%+.3d"; +# else + "%+.2d"; +# endif + if (sizeof (DCHAR_T) == 1) + { + sprintf ((char *) p, decimal_format, exponent); + while (*p != '\0') + p++; + } + else + { + char expbuf[6 + 1]; + const char *ep; + sprintf (expbuf, decimal_format, exponent); + for (ep = expbuf; (*p = *ep) != '\0'; ep++) + p++; + } + } +# endif + } + + free (digits); + } + } + else + abort (); +# else + /* arg is finite. */ + if (!(arg == 0.0)) + abort (); + + pad_ptr = p; + + if (dp->conversion == 'f' || dp->conversion == 'F') + { + *p++ = '0'; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > 0; precision--) + *p++ = '0'; + } + } + else if (dp->conversion == 'e' || dp->conversion == 'E') + { + *p++ = '0'; + if ((flags & FLAG_ALT) || precision > 0) + { + *p++ = decimal_point_char (); + for (; precision > 0; precision--) + *p++ = '0'; + } + *p++ = dp->conversion; /* 'e' or 'E' */ + *p++ = '+'; + /* Produce the same number of exponent digits as + the native printf implementation. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + *p++ = '0'; +# endif + *p++ = '0'; + *p++ = '0'; + } + else if (dp->conversion == 'g' || dp->conversion == 'G') + { + *p++ = '0'; + if (flags & FLAG_ALT) + { + size_t ndigits = + (precision > 0 ? precision - 1 : 0); + *p++ = decimal_point_char (); + for (; ndigits > 0; --ndigits) + *p++ = '0'; + } + } + else + abort (); +# endif + } + } + } +# endif + + /* The generated string now extends from tmp to p, with the + zero padding insertion point being at pad_ptr. */ + if (has_width && p - tmp < width) + { + size_t pad = width - (p - tmp); + DCHAR_T *end = p + pad; + + if (flags & FLAG_LEFT) + { + /* Pad with spaces on the right. */ + for (; pad > 0; pad--) + *p++ = ' '; + } + else if ((flags & FLAG_ZERO) && pad_ptr != NULL) + { + /* Pad with zeroes. */ + DCHAR_T *q = end; + + while (p > pad_ptr) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = '0'; + } + else + { + /* Pad with spaces on the left. */ + DCHAR_T *q = end; + + while (p > tmp) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = ' '; + } + + p = end; + } + + { + size_t count = p - tmp; + + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); + + /* Make room for the result. */ + if (count >= allocated - length) + { + size_t n = xsum (length, count); + + ENSURE_ALLOCATION (n); + } + + /* Append the result. */ + memcpy (result + length, tmp, count * sizeof (DCHAR_T)); + if (tmp != tmpbuf) + free (tmp); + length += count; + } + } +#endif + else + { + arg_type type = a.arg[dp->arg_index].type; + int flags = dp->flags; +#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION + int has_width; + size_t width; +#endif +#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION + int has_precision; + size_t precision; +#endif +#if NEED_PRINTF_UNBOUNDED_PRECISION + int prec_ourselves; +#else +# define prec_ourselves 0 +#endif +#if NEED_PRINTF_FLAG_LEFTADJUST +# define pad_ourselves 1 +#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION + int pad_ourselves; +#else +# define pad_ourselves 0 +#endif + TCHAR_T *fbp; + unsigned int prefix_count; + int prefixes[2]; +#if !USE_SNPRINTF + size_t tmp_length; + TCHAR_T tmpbuf[700]; + TCHAR_T *tmp; +#endif + +#if !USE_SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION + has_width = 0; + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + if (arg < 0) + { + /* "A negative field width is taken as a '-' flag + followed by a positive field width." */ + flags |= FLAG_LEFT; + width = (unsigned int) (-arg); + } + else + width = arg; + } + else + { + const FCHAR_T *digitp = dp->width_start; + + do + width = xsum (xtimes (width, 10), *digitp++ - '0'); + while (digitp != dp->width_end); + } + has_width = 1; + } +#endif + +#if !USE_SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION + has_precision = 0; + precision = 6; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index != ARG_NONE) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + /* "A negative precision is taken as if the precision + were omitted." */ + if (arg >= 0) + { + precision = arg; + has_precision = 1; + } + } + else + { + const FCHAR_T *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = xsum (xtimes (precision, 10), *digitp++ - '0'); + has_precision = 1; + } + } +#endif + + /* Decide whether to handle the precision ourselves. */ +#if NEED_PRINTF_UNBOUNDED_PRECISION + switch (dp->conversion) + { + case 'd': case 'i': case 'u': + case 'o': + case 'x': case 'X': case 'p': + prec_ourselves = has_precision && (precision > 0); + break; + default: + prec_ourselves = 0; + break; + } +#endif + + /* Decide whether to perform the padding ourselves. */ +#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION) + switch (dp->conversion) + { +# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO + /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need + to perform the padding after this conversion. Functions + with unistdio extensions perform the padding based on + character count rather than element count. */ + case 'c': case 's': +# endif +# if NEED_PRINTF_FLAG_ZERO + case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': +# endif + pad_ourselves = 1; + break; + default: + pad_ourselves = prec_ourselves; + break; + } +#endif + +#if !USE_SNPRINTF + /* Allocate a temporary buffer of sufficient size for calling + sprintf. */ + { + switch (dp->conversion) + { + + case 'd': case 'i': case 'u': +# if HAVE_LONG_LONG_INT + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Multiply by 2, as an estimate for FLAG_GROUP. */ + tmp_length = xsum (tmp_length, tmp_length); + /* Add 1, to account for a leading sign. */ + tmp_length = xsum (tmp_length, 1); + break; + + case 'o': +# if HAVE_LONG_LONG_INT + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Add 1, to account for a leading sign. */ + tmp_length = xsum (tmp_length, 1); + break; + + case 'x': case 'X': +# if HAVE_LONG_LONG_INT + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Add 2, to account for a leading sign or alternate form. */ + tmp_length = xsum (tmp_length, 2); + break; + + case 'f': case 'F': + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) (LDBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + else + tmp_length = + (unsigned int) (DBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 10; /* sign, decimal point etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'e': case 'E': case 'g': case 'G': + tmp_length = + 12; /* sign, decimal point, exponent etc. */ + tmp_length = xsum (tmp_length, precision); + break; + + case 'a': case 'A': + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) (LDBL_DIG + * 0.831 /* decimal -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + else + tmp_length = + (unsigned int) (DBL_DIG + * 0.831 /* decimal -> hexadecimal */ + ) + + 1; /* turn floor into ceil */ + if (tmp_length < precision) + tmp_length = precision; + /* Account for sign, decimal point etc. */ + tmp_length = xsum (tmp_length, 12); + break; + + case 'c': +# if HAVE_WINT_T && !WIDE_CHAR_VERSION + if (type == TYPE_WIDE_CHAR) + tmp_length = MB_CUR_MAX; + else +# endif + tmp_length = 1; + break; + + case 's': +# if HAVE_WCHAR_T + if (type == TYPE_WIDE_STRING) + { + tmp_length = + local_wcslen (a.arg[dp->arg_index].a.a_wide_string); + +# if !WIDE_CHAR_VERSION + tmp_length = xtimes (tmp_length, MB_CUR_MAX); +# endif + } + else +# endif + tmp_length = strlen (a.arg[dp->arg_index].a.a_string); + break; + + case 'p': + tmp_length = + (unsigned int) (sizeof (void *) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading 0x */ + break; + + default: + abort (); + } + + if (!pad_ourselves) + { +# if ENABLE_UNISTDIO + /* Padding considers the number of characters, therefore + the number of elements after padding may be + > max (tmp_length, width) + but is certainly + <= tmp_length + width. */ + tmp_length = xsum (tmp_length, width); +# else + /* Padding considers the number of elements, + says POSIX. */ + if (tmp_length < width) + tmp_length = width; +# endif + } + + tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ + } + + if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T)) + tmp = tmpbuf; + else + { + size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T)); + + if (size_overflow_p (tmp_memsize)) + /* Overflow, would lead to out of memory. */ + goto out_of_memory; + tmp = (TCHAR_T *) malloc (tmp_memsize); + if (tmp == NULL) + /* Out of memory. */ + goto out_of_memory; + } +#endif + + /* Construct the format string for calling snprintf or + sprintf. */ + fbp = buf; + *fbp++ = '%'; +#if NEED_PRINTF_FLAG_GROUPING + /* The underlying implementation doesn't support the ' flag. + Produce no grouping characters in this case; this is + acceptable because the grouping is locale dependent. */ +#else + if (flags & FLAG_GROUP) + *fbp++ = '\''; +#endif + if (flags & FLAG_LEFT) + *fbp++ = '-'; + if (flags & FLAG_SHOWSIGN) + *fbp++ = '+'; + if (flags & FLAG_SPACE) + *fbp++ = ' '; + if (flags & FLAG_ALT) + *fbp++ = '#'; + if (!pad_ourselves) + { + if (flags & FLAG_ZERO) + *fbp++ = '0'; + if (dp->width_start != dp->width_end) + { + size_t n = dp->width_end - dp->width_start; + /* The width specification is known to consist only + of standard ASCII characters. */ + if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) + { + memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T)); + fbp += n; + } + else + { + const FCHAR_T *mp = dp->width_start; + do + *fbp++ = (unsigned char) *mp++; + while (--n > 0); + } + } + } + if (!prec_ourselves) + { + if (dp->precision_start != dp->precision_end) + { + size_t n = dp->precision_end - dp->precision_start; + /* The precision specification is known to consist only + of standard ASCII characters. */ + if (sizeof (FCHAR_T) == sizeof (TCHAR_T)) + { + memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T)); + fbp += n; + } + else + { + const FCHAR_T *mp = dp->precision_start; + do + *fbp++ = (unsigned char) *mp++; + while (--n > 0); + } + } + } + + switch (type) + { +#if HAVE_LONG_LONG_INT + case TYPE_LONGLONGINT: + case TYPE_ULONGLONGINT: +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + *fbp++ = 'I'; + *fbp++ = '6'; + *fbp++ = '4'; + break; +# else + *fbp++ = 'l'; + /*FALLTHROUGH*/ +# endif +#endif + case TYPE_LONGINT: + case TYPE_ULONGINT: +#if HAVE_WINT_T + case TYPE_WIDE_CHAR: +#endif +#if HAVE_WCHAR_T + case TYPE_WIDE_STRING: +#endif + *fbp++ = 'l'; + break; + case TYPE_LONGDOUBLE: + *fbp++ = 'L'; + break; + default: + break; + } +#if NEED_PRINTF_DIRECTIVE_F + if (dp->conversion == 'F') + *fbp = 'f'; + else +#endif + *fbp = dp->conversion; +#if USE_SNPRINTF +# if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)) + fbp[1] = '%'; + fbp[2] = 'n'; + fbp[3] = '\0'; +# else + /* On glibc2 systems from glibc >= 2.3 - probably also older + ones - we know that snprintf's returns value conforms to + ISO C 99: the gl_SNPRINTF_DIRECTIVE_N test passes. + Therefore we can avoid using %n in this situation. + On glibc2 systems from 2004-10-18 or newer, the use of %n + in format strings in writable memory may crash the program + (if compiled with _FORTIFY_SOURCE=2), so we should avoid it + in this situation. */ + /* On native Win32 systems (such as mingw), we can avoid using + %n because: + - Although the gl_SNPRINTF_TRUNCATION_C99 test fails, + snprintf does not write more than the specified number + of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes + '4', '5', '6' into buf, not '4', '5', '\0'.) + - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf + allows us to recognize the case of an insufficient + buffer size: it returns -1 in this case. + On native Win32 systems (such as mingw) where the OS is + Windows Vista, the use of %n in format strings by default + crashes the program. See + and + + So we should avoid %n in this situation. */ + fbp[1] = '\0'; +# endif +#else + fbp[1] = '\0'; +#endif + + /* Construct the arguments for calling snprintf or sprintf. */ + prefix_count = 0; + if (!pad_ourselves && dp->width_arg_index != ARG_NONE) + { + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; + } + if (dp->precision_arg_index != ARG_NONE) + { + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; + } + +#if USE_SNPRINTF + /* The SNPRINTF result is appended after result[0..length]. + The latter is an array of DCHAR_T; SNPRINTF appends an + array of TCHAR_T to it. This is possible because + sizeof (TCHAR_T) divides sizeof (DCHAR_T) and + alignof (TCHAR_T) <= alignof (DCHAR_T). */ +# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T)) + /* Ensure that maxlen below will be >= 2. Needed on BeOS, + where an snprintf() with maxlen==1 acts like sprintf(). */ + ENSURE_ALLOCATION (xsum (length, + (2 + TCHARS_PER_DCHAR - 1) + / TCHARS_PER_DCHAR)); + /* Prepare checking whether snprintf returns the count + via %n. */ + *(TCHAR_T *) (result + length) = '\0'; +#endif + + for (;;) + { + int count = -1; + +#if USE_SNPRINTF + int retcount = 0; + size_t maxlen = allocated - length; + /* SNPRINTF can fail if its second argument is + > INT_MAX. */ + if (maxlen > INT_MAX / TCHARS_PER_DCHAR) + maxlen = INT_MAX / TCHARS_PER_DCHAR; + maxlen = maxlen * TCHARS_PER_DCHAR; +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + retcount = SNPRINTF ((TCHAR_T *) (result + length), \ + maxlen, buf, \ + arg, &count); \ + break; \ + case 1: \ + retcount = SNPRINTF ((TCHAR_T *) (result + length), \ + maxlen, buf, \ + prefixes[0], arg, &count); \ + break; \ + case 2: \ + retcount = SNPRINTF ((TCHAR_T *) (result + length), \ + maxlen, buf, \ + prefixes[0], prefixes[1], arg, \ + &count); \ + break; \ + default: \ + abort (); \ + } +#else +# define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + count = sprintf (tmp, buf, arg); \ + break; \ + case 1: \ + count = sprintf (tmp, buf, prefixes[0], arg); \ + break; \ + case 2: \ + count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ + arg); \ + break; \ + default: \ + abort (); \ + } +#endif + + switch (type) + { + case TYPE_SCHAR: + { + int arg = a.arg[dp->arg_index].a.a_schar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UCHAR: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uchar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_SHORT: + { + int arg = a.arg[dp->arg_index].a.a_short; + SNPRINTF_BUF (arg); + } + break; + case TYPE_USHORT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_ushort; + SNPRINTF_BUF (arg); + } + break; + case TYPE_INT: + { + int arg = a.arg[dp->arg_index].a.a_int; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UINT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_LONGINT: + { + long int arg = a.arg[dp->arg_index].a.a_longint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGINT: + { + unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; + SNPRINTF_BUF (arg); + } + break; +#if HAVE_LONG_LONG_INT + case TYPE_LONGLONGINT: + { + long long int arg = a.arg[dp->arg_index].a.a_longlongint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGLONGINT: + { + unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_DOUBLE: + { + double arg = a.arg[dp->arg_index].a.a_double; + SNPRINTF_BUF (arg); + } + break; + case TYPE_LONGDOUBLE: + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + SNPRINTF_BUF (arg); + } + break; + case TYPE_CHAR: + { + int arg = a.arg[dp->arg_index].a.a_char; + SNPRINTF_BUF (arg); + } + break; +#if HAVE_WINT_T + case TYPE_WIDE_CHAR: + { + wint_t arg = a.arg[dp->arg_index].a.a_wide_char; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_STRING: + { + const char *arg = a.arg[dp->arg_index].a.a_string; + SNPRINTF_BUF (arg); + } + break; +#if HAVE_WCHAR_T + case TYPE_WIDE_STRING: + { + const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_POINTER: + { + void *arg = a.arg[dp->arg_index].a.a_pointer; + SNPRINTF_BUF (arg); + } + break; + default: + abort (); + } + +#if USE_SNPRINTF + /* Portability: Not all implementations of snprintf() + are ISO C 99 compliant. Determine the number of + bytes that snprintf() has produced or would have + produced. */ + if (count >= 0) + { + /* Verify that snprintf() has NUL-terminated its + result. */ + if (count < maxlen + && ((TCHAR_T *) (result + length)) [count] != '\0') + abort (); + /* Portability hack. */ + if (retcount > count) + count = retcount; + } + else + { + /* snprintf() doesn't understand the '%n' + directive. */ + if (fbp[1] != '\0') + { + /* Don't use the '%n' directive; instead, look + at the snprintf() return value. */ + fbp[1] = '\0'; + continue; + } + else + { + /* Look at the snprintf() return value. */ + if (retcount < 0) + { + /* HP-UX 10.20 snprintf() is doubly deficient: + It doesn't understand the '%n' directive, + *and* it returns -1 (rather than the length + that would have been required) when the + buffer is too small. */ + size_t bigger_need = + xsum (xtimes (allocated, 2), 12); + ENSURE_ALLOCATION (bigger_need); + continue; + } + else + count = retcount; + } + } +#endif + + /* Attempt to handle failure. */ + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EINVAL; + return NULL; + } + +#if USE_SNPRINTF + /* Handle overflow of the allocated buffer. + If such an overflow occurs, a C99 compliant snprintf() + returns a count >= maxlen. However, a non-compliant + snprintf() function returns only count = maxlen - 1. To + cover both cases, test whether count >= maxlen - 1. */ + if ((unsigned int) count + 1 >= maxlen) + { + /* If maxlen already has attained its allowed maximum, + allocating more memory will not increase maxlen. + Instead of looping, bail out. */ + if (maxlen == INT_MAX / TCHARS_PER_DCHAR) + goto overflow; + else + { + /* Need at least (count + 1) * sizeof (TCHAR_T) + bytes. (The +1 is for the trailing NUL.) + But ask for (count + 2) * sizeof (TCHAR_T) + bytes, so that in the next round, we likely get + maxlen > (unsigned int) count + 1 + and so we don't get here again. + And allocate proportionally, to avoid looping + eternally if snprintf() reports a too small + count. */ + size_t n = + xmax (xsum (length, + ((unsigned int) count + 2 + + TCHARS_PER_DCHAR - 1) + / TCHARS_PER_DCHAR), + xtimes (allocated, 2)); + + ENSURE_ALLOCATION (n); + continue; + } + } +#endif + +#if NEED_PRINTF_UNBOUNDED_PRECISION + if (prec_ourselves) + { + /* Handle the precision. */ + TCHAR_T *prec_ptr = +# if USE_SNPRINTF + (TCHAR_T *) (result + length); +# else + tmp; +# endif + size_t prefix_count; + size_t move; + + prefix_count = 0; + /* Put the additional zeroes after the sign. */ + if (count >= 1 + && (*prec_ptr == '-' || *prec_ptr == '+' + || *prec_ptr == ' ')) + prefix_count = 1; + /* Put the additional zeroes after the 0x prefix if + (flags & FLAG_ALT) || (dp->conversion == 'p'). */ + else if (count >= 2 + && prec_ptr[0] == '0' + && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X')) + prefix_count = 2; + + move = count - prefix_count; + if (precision > move) + { + /* Insert zeroes. */ + size_t insert = precision - move; + TCHAR_T *prec_end; + +# if USE_SNPRINTF + size_t n = + xsum (length, + (count + insert + TCHARS_PER_DCHAR - 1) + / TCHARS_PER_DCHAR); + length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; + ENSURE_ALLOCATION (n); + length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR; + prec_ptr = (TCHAR_T *) (result + length); +# endif + + prec_end = prec_ptr + count; + prec_ptr += prefix_count; + + while (prec_end > prec_ptr) + { + prec_end--; + prec_end[insert] = prec_end[0]; + } + + prec_end += insert; + do + *--prec_end = '0'; + while (prec_end > prec_ptr); + + count += insert; + } + } +#endif + +#if !USE_SNPRINTF + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); +#endif + +#if !DCHAR_IS_TCHAR + /* Convert from TCHAR_T[] to DCHAR_T[]. */ + if (dp->conversion == 'c' || dp->conversion == 's') + { + /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING + TYPE_WIDE_STRING. + The result string is not certainly ASCII. */ + const TCHAR_T *tmpsrc; + DCHAR_T *tmpdst; + size_t tmpdst_len; + /* This code assumes that TCHAR_T is 'char'. */ + typedef int TCHAR_T_verify + [2 * (sizeof (TCHAR_T) == 1) - 1]; +# if USE_SNPRINTF + tmpsrc = (TCHAR_T *) (result + length); +# else + tmpsrc = tmp; +# endif + tmpdst = NULL; + tmpdst_len = 0; + if (DCHAR_CONV_FROM_ENCODING (locale_charset (), + iconveh_question_mark, + tmpsrc, count, + NULL, + &tmpdst, &tmpdst_len) + < 0) + { + int saved_errno = errno; + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = saved_errno; + return NULL; + } + ENSURE_ALLOCATION (xsum (length, tmpdst_len)); + DCHAR_CPY (result + length, tmpdst, tmpdst_len); + free (tmpdst); + count = tmpdst_len; + } + else + { + /* The result string is ASCII. + Simple 1:1 conversion. */ +# if USE_SNPRINTF + /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a + no-op conversion, in-place on the array starting + at (result + length). */ + if (sizeof (DCHAR_T) != sizeof (TCHAR_T)) +# endif + { + const TCHAR_T *tmpsrc; + DCHAR_T *tmpdst; + size_t n; + +# if USE_SNPRINTF + if (result == resultbuf) + { + tmpsrc = (TCHAR_T *) (result + length); + /* ENSURE_ALLOCATION will not move tmpsrc + (because it's part of resultbuf). */ + ENSURE_ALLOCATION (xsum (length, count)); + } + else + { + /* ENSURE_ALLOCATION will move the array + (because it uses realloc(). */ + ENSURE_ALLOCATION (xsum (length, count)); + tmpsrc = (TCHAR_T *) (result + length); + } +# else + tmpsrc = tmp; + ENSURE_ALLOCATION (xsum (length, count)); +# endif + tmpdst = result + length; + /* Copy backwards, because of overlapping. */ + tmpsrc += count; + tmpdst += count; + for (n = count; n > 0; n--) + *--tmpdst = (unsigned char) *--tmpsrc; + } + } +#endif + +#if DCHAR_IS_TCHAR && !USE_SNPRINTF + /* Make room for the result. */ + if (count > allocated - length) + { + /* Need at least count elements. But allocate + proportionally. */ + size_t n = + xmax (xsum (length, count), xtimes (allocated, 2)); + + ENSURE_ALLOCATION (n); + } +#endif + + /* Here count <= allocated - length. */ + + /* Perform padding. */ +#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION + if (pad_ourselves && has_width) + { + size_t w; +# if ENABLE_UNISTDIO + /* Outside POSIX, it's preferrable to compare the width + against the number of _characters_ of the converted + value. */ + w = DCHAR_MBSNLEN (result + length, count); +# else + /* The width is compared against the number of _bytes_ + of the converted value, says POSIX. */ + w = count; +# endif + if (w < width) + { + size_t pad = width - w; + + /* Make room for the result. */ + if (xsum (count, pad) > allocated - length) + { + /* Need at least count + pad elements. But + allocate proportionally. */ + size_t n = + xmax (xsum3 (length, count, pad), + xtimes (allocated, 2)); + +# if USE_SNPRINTF + length += count; + ENSURE_ALLOCATION (n); + length -= count; +# else + ENSURE_ALLOCATION (n); +# endif + } + /* Here count + pad <= allocated - length. */ + + { +# if !DCHAR_IS_TCHAR || USE_SNPRINTF + DCHAR_T * const rp = result + length; +# else + DCHAR_T * const rp = tmp; +# endif + DCHAR_T *p = rp + count; + DCHAR_T *end = p + pad; + DCHAR_T *pad_ptr; +# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO + if (dp->conversion == 'c' + || dp->conversion == 's') + /* No zero-padding for string directives. */ + pad_ptr = NULL; + else +# endif + { + pad_ptr = (*rp == '-' ? rp + 1 : rp); + /* No zero-padding of "inf" and "nan". */ + if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z') + || (*pad_ptr >= 'a' && *pad_ptr <= 'z')) + pad_ptr = NULL; + } + /* The generated string now extends from rp to p, + with the zero padding insertion point being at + pad_ptr. */ + + count = count + pad; /* = end - rp */ + + if (flags & FLAG_LEFT) + { + /* Pad with spaces on the right. */ + for (; pad > 0; pad--) + *p++ = ' '; + } + else if ((flags & FLAG_ZERO) && pad_ptr != NULL) + { + /* Pad with zeroes. */ + DCHAR_T *q = end; + + while (p > pad_ptr) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = '0'; + } + else + { + /* Pad with spaces on the left. */ + DCHAR_T *q = end; + + while (p > rp) + *--q = *--p; + for (; pad > 0; pad--) + *p++ = ' '; + } + } + } + } +#endif + + /* Here still count <= allocated - length. */ + +#if !DCHAR_IS_TCHAR || USE_SNPRINTF + /* The snprintf() result did fit. */ +#else + /* Append the sprintf() result. */ + memcpy (result + length, tmp, count * sizeof (DCHAR_T)); +#endif +#if !USE_SNPRINTF + if (tmp != tmpbuf) + free (tmp); +#endif + +#if NEED_PRINTF_DIRECTIVE_F + if (dp->conversion == 'F') + { + /* Convert the %f result to upper case for %F. */ + DCHAR_T *rp = result + length; + size_t rc; + for (rc = count; rc > 0; rc--, rp++) + if (*rp >= 'a' && *rp <= 'z') + *rp = *rp - 'a' + 'A'; + } +#endif + + length += count; + break; + } + } + } + } + + /* Add the final NUL. */ + ENSURE_ALLOCATION (xsum (length, 1)); + result[length] = '\0'; + + if (result != resultbuf && length + 1 < allocated) + { + /* Shrink the allocated memory if possible. */ + DCHAR_T *memory; + + memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T)); + if (memory != NULL) + result = memory; + } + + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + *lengthp = length; + /* Note that we can produce a big string of a length > INT_MAX. POSIX + says that snprintf() fails with errno = EOVERFLOW in this case, but + that's only because snprintf() returns an 'int'. This function does + not have this limitation. */ + return result; + +#if USE_SNPRINTF + overflow: + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + CLEANUP (); + errno = EOVERFLOW; + return NULL; +#endif + + out_of_memory: + if (!(result == resultbuf || result == NULL)) + free (result); + if (buf_malloced != NULL) + free (buf_malloced); + out_of_memory_1: + CLEANUP (); + errno = ENOMEM; + return NULL; + } +} + +#undef TCHARS_PER_DCHAR +#undef SNPRINTF +#undef USE_SNPRINTF +#undef DCHAR_CPY +#undef PRINTF_PARSE +#undef DIRECTIVES +#undef DIRECTIVE +#undef DCHAR_IS_TCHAR +#undef TCHAR_T +#undef DCHAR_T +#undef FCHAR_T +#undef VASNPRINTF diff --git a/lib/vasnprintf.h b/lib/vasnprintf.h new file mode 100644 index 0000000..e4c11ff --- /dev/null +++ b/lib/vasnprintf.h @@ -0,0 +1,83 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* vsprintf with automatic memory allocation. + Copyright (C) 2002-2004, 2007-2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 + +/* Get size_t. */ +#include + +#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 +/* 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..fac53f6 --- /dev/null +++ b/lib/verify.h @@ -0,0 +1,140 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + 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..4c0d174 --- /dev/null +++ b/lib/version-etc-fsf.c @@ -0,0 +1,30 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* 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..823e085 --- /dev/null +++ b/lib/version-etc.c @@ -0,0 +1,172 @@ +/* Utility to help print --version output in a consistent format. + Copyright (C) 1999-2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +/* Specification. */ +#include "version-etc.h" + +#include +#include +#include + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +enum { COPYRIGHT_YEAR = 2008 }; + +/* 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 GPLv3+: GNU GPL version 3 or later \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..d9d1340 --- /dev/null +++ b/lib/version-etc.h @@ -0,0 +1,36 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#ifndef VERSION_ETC_H +# define VERSION_ETC_H 1 + +# include +# include + +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..8cc31f2 --- /dev/null +++ b/lib/vsnprintf.c @@ -0,0 +1,73 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* Formatted output to strings. + Copyright (C) 2004, 2006-2008 Free Software Foundation, Inc. + Written by Simon Josefsson and Yoann Vandoorselaere . + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include + +#include +#include +#include +#include +#include + +#include "vasnprintf.h" + +/* Print formatted output to string STR. Similar to vsprintf, but + additional length SIZE limit how much is written into STR. Returns + string length of formatted string (which may be larger than SIZE). + STR may be NULL, in which case nothing will be written. On error, + return a negative value. */ +int +vsnprintf (char *str, size_t size, const char *format, va_list args) +{ + char *output; + size_t len; + size_t lenbuf = size; + + output = vasnprintf (str, &lenbuf, format, args); + len = lenbuf; + + if (!output) + return -1; + + if (output != str) + { + if (size) + { + size_t pruned_len = (len < size ? len : size - 1); + memcpy (str, output, pruned_len); + str[pruned_len] = '\0'; + } + + free (output); + } + + if (len > INT_MAX) + { + errno = EOVERFLOW; + return -1; + } + + return len; +} diff --git a/lib/waitpid.c b/lib/waitpid.c new file mode 100644 index 0000000..eab9430 --- /dev/null +++ b/lib/waitpid.c @@ -0,0 +1,75 @@ +/* Emulate waitpid on systems that just have wait. + Copyright 1994, 1995, 1998, 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; 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 +#endif + +#include +#include + +#include +#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.in.h b/lib/wchar.in.h new file mode 100644 index 0000000..52d63f8 --- /dev/null +++ b/lib/wchar.in.h @@ -0,0 +1,93 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A substitute for ISO C99 , 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Eric Blake. */ + +/* + * ISO C 99 for platforms that have issues. + * + * + * For now, this just ensures proper prerequisite inclusion order and + * the declaration of wcwidth(). + */ + +#ifdef __need_mbstate_t +/* Special invocation convention inside glibc header files. */ + +#@INCLUDE_NEXT@ @NEXT_WCHAR_H@ + +#else +/* Normal invocation convention. */ + +#ifndef _GL_WCHAR_H + +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +#include +#include +#include + +/* Include the original if it exists. + Some builds of uClibc lack it. */ +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_WCHAR_H@ +# @INCLUDE_NEXT@ @NEXT_WCHAR_H@ +#endif + +#ifndef _GL_WCHAR_H +#define _GL_WCHAR_H + +/* The definition of GL_LINK_WARNING is copied here. */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Return the number of screen columns needed for WC. */ +#if @GNULIB_WCWIDTH@ +# if @REPLACE_WCWIDTH@ +# undef wcwidth +# define wcwidth rpl_wcwidth +extern int wcwidth (wchar_t); +# else +# if !defined wcwidth && !@HAVE_DECL_WCWIDTH@ +/* wcwidth exists but is not declared. */ +extern int wcwidth (int /* actually wchar_t */); +# endif +# endif +#elif defined GNULIB_POSIXCHECK +# undef wcwidth +# define wcwidth(w) \ + (GL_LINK_WARNING ("wcwidth is unportable - " \ + "use gnulib module wcwidth for portability"), \ + wcwidth (w)) +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _GL_WCHAR_H */ +#endif /* _GL_WCHAR_H */ +#endif diff --git a/lib/wctype.in.h b/lib/wctype.in.h new file mode 100644 index 0000000..1691bd8 --- /dev/null +++ b/lib/wctype.in.h @@ -0,0 +1,163 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* A substitute for ISO C99 , 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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 for platforms that lack it. + * + * + * 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: must be included before . + Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be + included before . */ +# include +# include +# include +# include +#endif + +/* Include the original if it exists. + BeOS 5 has the functions but no . */ +/* The include_next requires a split double-inclusion guard. */ +#if @HAVE_WCTYPE_H@ +# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@ +#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 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 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.c b/lib/wcwidth.c new file mode 100644 index 0000000..4885071 --- /dev/null +++ b/lib/wcwidth.c @@ -0,0 +1,51 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* Get iswprint. */ +#include + +#include "localcharset.h" +#include "streq.h" +#include "uniwidth.h" + +#undef wcwidth + +int +rpl_wcwidth (wchar_t wc) +{ + /* In UTF-8 locales, use a Unicode aware width function. */ + const char *encoding = locale_charset (); + if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0)) + { + /* We assume that in a UTF-8 locale, a wide character is the same as a + Unicode character. */ + return uc_width (wc, encoding); + } + else + { + /* Otherwise, fall back to the system's wcwidth function. */ +#if HAVE_WCWIDTH + return wcwidth (wc); +#else + return wc == 0 ? 0 : iswprint (wc) ? 1 : -1; +#endif + } +} diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c new file mode 100644 index 0000000..0a0694f --- /dev/null +++ b/lib/xalloc-die.c @@ -0,0 +1,41 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#include "xalloc.h" + +#include + +#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..40dcf4b --- /dev/null +++ b/lib/xalloc.h @@ -0,0 +1,270 @@ +/* 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, 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XALLOC_H_ +# define XALLOC_H_ + +# include + + +# ifdef __cplusplus +extern "C" { +# endif + + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# 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 inline T * +xrealloc (T *p, size_t s) +{ + return (T *) xrealloc ((void *) p, s); +} + +template inline T * +xnrealloc (T *p, size_t n, size_t s) +{ + return (T *) xnrealloc ((void *) p, n, s); +} + +template inline T * +x2realloc (T *p, size_t *pn) +{ + return (T *) x2realloc ((void *) p, pn); +} + +template inline T * +x2nrealloc (T *p, size_t *pn, size_t s) +{ + return (T *) x2nrealloc ((void *) p, pn, s); +} + +template 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..6787b46 --- /dev/null +++ b/lib/xgetcwd.c @@ -0,0 +1,40 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Jim Meyering. */ + +#include + +#include "xgetcwd.h" + +#include +#include + +#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..3d966de --- /dev/null +++ b/lib/xgetcwd.h @@ -0,0 +1,17 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +extern char *xgetcwd (void); diff --git a/lib/xmalloc.c b/lib/xmalloc.c new file mode 100644 index 0000000..3a12345 --- /dev/null +++ b/lib/xmalloc.c @@ -0,0 +1,122 @@ +/* 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +#if ! HAVE_INLINE +# define static_inline +#endif +#include "xalloc.h" +#undef static_inline + +#include +#include + +#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/xsize.h b/lib/xsize.h new file mode 100644 index 0000000..e6d290a --- /dev/null +++ b/lib/xsize.h @@ -0,0 +1,110 @@ +/* -*- buffer-read-only: t -*- vi: set ro: */ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ +/* xsize.h -- Checked size_t computations. + + Copyright (C) 2003, 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _XSIZE_H +#define _XSIZE_H + +/* Get size_t. */ +#include + +/* Get SIZE_MAX. */ +#include +#if HAVE_STDINT_H +# include +#endif + +/* The size of memory objects is often computed through expressions of + type size_t. Example: + void* p = malloc (header_size + n * element_size). + These computations can lead to overflow. When this happens, malloc() + returns a piece of memory that is way too small, and the program then + crashes while attempting to fill the memory. + To avoid this, the functions and macros in this file check for overflow. + The convention is that SIZE_MAX represents overflow. + malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc + implementation that uses mmap --, it's recommended to use size_overflow_p() + or size_in_bounds_p() before invoking malloc(). + The example thus becomes: + size_t size = xsum (header_size, xtimes (n, element_size)); + void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); +*/ + +/* Convert an arbitrary value >= 0 to type size_t. */ +#define xcast_size_t(N) \ + ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) + +/* Sum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum (size_t size1, size_t size2) +{ + size_t sum = size1 + size2; + return (sum >= size1 ? sum : SIZE_MAX); +} + +/* Sum of three sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum3 (size_t size1, size_t size2, size_t size3) +{ + return xsum (xsum (size1, size2), size3); +} + +/* Sum of four sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) +{ + return xsum (xsum (xsum (size1, size2), size3), size4); +} + +/* Maximum of two sizes, with overflow check. */ +static inline size_t +#if __GNUC__ >= 3 +__attribute__ ((__pure__)) +#endif +xmax (size_t size1, size_t size2) +{ + /* No explicit check is needed here, because for any n: + max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ + return (size1 >= size2 ? size1 : size2); +} + +/* Multiplication of a count with an element size, with overflow check. + The count must be >= 0 and the element size must be > 0. + This is a macro, not an inline function, so that it works correctly even + when N is of a wider type and N > SIZE_MAX. */ +#define xtimes(N, ELSIZE) \ + ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) + +/* Check for overflow. */ +#define size_overflow_p(SIZE) \ + ((SIZE) == SIZE_MAX) +/* Check against overflow. */ +#define size_in_bounds_p(SIZE) \ + ((SIZE) != SIZE_MAX) + +#endif /* _XSIZE_H */ diff --git a/lib/xstrndup.c b/lib/xstrndup.c new file mode 100644 index 0000000..37488cd --- /dev/null +++ b/lib/xstrndup.c @@ -0,0 +1,36 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "xstrndup.h" + +#include +#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..4882e39 --- /dev/null +++ b/lib/xstrndup.h @@ -0,0 +1,23 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* 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-error.c b/lib/xstrtol-error.c new file mode 100644 index 0000000..67b5bf0 --- /dev/null +++ b/lib/xstrtol-error.c @@ -0,0 +1,98 @@ +/* A more useful interface to strtol. + + Copyright (C) 1995, 1996, 1998, 1999, 2001-2004, 2006-2008 + Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include +#include "xstrtol.h" + +#include + +#include "error.h" +#include "exitfail.h" +#include "gettext.h" + +#define N_(msgid) msgid + +/* Report an error for an invalid integer in an option argument. + + ERR is the error code returned by one of the xstrto* functions. + + Use OPT_IDX to decide whether to print the short option string "C" + or "-C" or a long option string derived from LONG_OPTION. OPT_IDX + is -2 if the short option "C" was used, without any leading "-"; it + is -1 if the short option "-C" was used; otherwise it is an index + into LONG_OPTIONS, which should have a name preceded by two '-' + characters. + + ARG is the option-argument containing the integer. + + After reporting an error, exit with status EXIT_STATUS if it is + nonzero. */ + +static void +xstrtol_error (enum strtol_error err, + int opt_idx, char c, struct option const *long_options, + char const *arg, + int exit_status) +{ + char const *hyphens = "--"; + char const *msgid; + char const *option; + char option_buffer[2]; + + switch (err) + { + default: + abort (); + + case LONGINT_INVALID: + msgid = N_("invalid %s%s argument `%s'"); + break; + + case LONGINT_INVALID_SUFFIX_CHAR: + case LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW: + msgid = N_("invalid suffix in %s%s argument `%s'"); + break; + + case LONGINT_OVERFLOW: + msgid = N_("%s%s argument `%s' too large"); + break; + } + + if (opt_idx < 0) + { + hyphens -= opt_idx; + option_buffer[0] = c; + option_buffer[1] = '\0'; + option = option_buffer; + } + else + option = long_options[opt_idx].name; + + error (exit_status, 0, gettext (msgid), hyphens, option, arg); +} + +/* Like xstrtol_error, except exit with a failure status. */ + +void +xstrtol_fatal (enum strtol_error err, + int opt_idx, char c, struct option const *long_options, + char const *arg) +{ + xstrtol_error (err, opt_idx, c, long_options, arg, exit_failure); + abort (); +} diff --git a/lib/xstrtol.c b/lib/xstrtol.c new file mode 100644 index 0000000..1804fe5 --- /dev/null +++ b/lib/xstrtol.c @@ -0,0 +1,228 @@ +/* A more useful interface to strtol. + + Copyright (C) 1995, 1996, 1998, 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* 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 + +#include "xstrtol.h" + +/* Some pre-ANSI implementations (e.g. SunOS 4) + need stderr defined if assertion checking is enabled. */ +#include + +#include +#include +#include +#include +#include +#include + +#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; +} diff --git a/lib/xstrtol.h b/lib/xstrtol.h new file mode 100644 index 0000000..9ac168b --- /dev/null +++ b/lib/xstrtol.h @@ -0,0 +1,78 @@ +/* A more useful interface to strtol. + + Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004, 2006, 2007, + 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef XSTRTOL_H_ +# define XSTRTOL_H_ 1 + +# include +# include + +# 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) + +#ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) +# define __attribute__(x) +# endif +#endif + +#ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif + +/* Report an error for an invalid integer in an option argument. + + ERR is the error code returned by one of the xstrto* functions. + + Use OPT_IDX to decide whether to print the short option string "C" + or "-C" or a long option string derived from LONG_OPTION. OPT_IDX + is -2 if the short option "C" was used, without any leading "-"; it + is -1 if the short option "-C" was used; otherwise it is an index + into LONG_OPTIONS, which should have a name preceded by two '-' + characters. + + ARG is the option-argument containing the integer. + + After reporting an error, exit with a failure status. */ + +void xstrtol_fatal (enum strtol_error, + int, char, struct option const *, + char const *) ATTRIBUTE_NORETURN; + +#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/alloca.m4 b/m4/alloca.m4 new file mode 100644 index 0000000..95f54a6 --- /dev/null +++ b/m4/alloca.m4 @@ -0,0 +1,46 @@ +# alloca.m4 serial 8 +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_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 , + 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]) +]) + +# Prerequisites of lib/alloca.c. +# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. +AC_DEFUN([gl_PREREQ_ALLOCA], [:]) 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..80cb72f --- /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 ]) + 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 ]) + + # 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_LINK([#include ], + [ 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_LINK([#include ], + [ 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 100644 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 +#include +#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 +#include +#include + + 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 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 ], + [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 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 + #include + #include + ]], + [[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 + #include ]) + + AC_CACHE_CHECK([whether dirfd is a macro], + gl_cv_func_dirfd_macro, + [AC_EGREP_CPP([dirent_header_defines_dirfd], [ +#include +#include +#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 + #include ], + [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..23bf5b0 --- /dev/null +++ b/m4/double-slash-root.m4 @@ -0,0 +1,38 @@ +# double-slash-root.m4 serial 3 -*- Autoconf -*- +dnl Copyright (C) 2006, 2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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 + # . + case $host in + *-cygwin | i370-ibm-openedition) + gl_cv_double_slash_root=yes ;; + *) + # Be optimistic and assume that / and // are the same when we + # don't know. + gl_cv_double_slash_root='unknown, assuming no' ;; + esac + else + set x `ls -di / // 2>/dev/null` + if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then + gl_cv_double_slash_root=no + else + gl_cv_double_slash_root=yes + fi + fi]) + if test "$gl_cv_double_slash_root" = yes; then + AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], 1, + [Define to 1 if // is a file system root distinct from /.]) + fi +]) diff --git a/m4/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/environ.m4 b/m4/environ.m4 new file mode 100644 index 0000000..fac0c05 --- /dev/null +++ b/m4/environ.m4 @@ -0,0 +1,36 @@ +# environ.m4 serial 1 +dnl Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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_ENVIRON], +[ + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + dnl Persuade glibc to declare environ. + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + gt_CHECK_VAR_DECL([#include ], environ) + if test $gt_cv_var_environ_declaration != yes; then + HAVE_DECL_ENVIRON=0 + fi +]) + +# Check if a variable is properly declared. +# gt_CHECK_VAR_DECL(includes,variable) +AC_DEFUN([gt_CHECK_VAR_DECL], +[ + define([gt_cv_var], [gt_cv_var_]$2[_declaration]) + AC_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 + undefine([gt_cv_var]) +]) 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 , 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 , 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 +#ifdef EOVERFLOW +yes +#endif + ], have_eoverflow=1) + if test -n "$have_eoverflow"; then + dnl EOVERFLOW exists in . Don't need to define EOVERFLOW ourselves. + ac_cv_decl_EOVERFLOW=yes + else + AC_EGREP_CPP(yes,[ +#define _XOPEN_SOURCE_EXTENDED 1 +#include +#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 +/* The following two lines are a workaround against an autoconf-2.52 bug. */ +#include +#include +]) + 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..bcbb3ce --- /dev/null +++ b/m4/extensions.m4 @@ -0,0 +1,82 @@ +# serial 5 -*- Autoconf -*- +# Enable extensions on systems that normally disable them. + +# Copyright (C) 2003, 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. + +# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from CVS +# Autoconf. Perhaps we can remove this once we can assume Autoconf +# 2.62 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. +# Remember that #undef in AH_VERBATIM gets replaced with #define by +# AC_DEFINE. The goal here is to define all known feature-enabling +# macros, then, if reports of conflicts are made, disable macros that +# cause problems on some platforms (such as __EXTENSIONS__). +AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS], +[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl +AC_BEFORE([$0], [AC_RUN_IFELSE])dnl + + AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=]) + if test "$MINIX" = yes; then + AC_DEFINE([_POSIX_SOURCE], [1], + [Define to 1 if you need to in order for `stat' and other + things to work.]) + AC_DEFINE([_POSIX_1_SOURCE], [2], + [Define to 2 if the system does not provide POSIX.1 features + except with this defined.]) + AC_DEFINE([_MINIX], [1], + [Define to 1 if on MINIX.]) + fi + + AH_VERBATIM([__EXTENSIONS__], +[/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#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([_ALL_SOURCE]) + AC_DEFINE([_GNU_SOURCE]) + AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) + AC_DEFINE([_TANDEM_SOURCE]) +])# AC_USE_SYSTEM_EXTENSIONS + +# 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..fd170d2 --- /dev/null +++ b/m4/fchdir.m4 @@ -0,0 +1,26 @@ +# fchdir.m4 serial 4 +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_CHECK_NEXT_HEADERS([dirent.h]) + DIRENT_H='dirent.h' + else + DIRENT_H= + fi + 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..e3b9aa5 --- /dev/null +++ b/m4/fcntl_h.m4 @@ -0,0 +1,94 @@ +# Configure fcntl.h. +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_FCNTL_H], +[ + AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) + AC_CACHE_CHECK([for working fcntl.h], gl_cv_header_working_fcntl_h, + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + #include + #include + #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_CHECK_NEXT_HEADERS([fcntl.h]) + FCNTL_H='fcntl.h' + AC_SUBST([FCNTL_H]) +]) + +AC_DEFUN([gl_FCNTL_MODULE_INDICATOR], +[ + dnl Use AC_REQUIRE here, so that the default settings are expanded once only. + AC_REQUIRE([gl_FCNTL_H_DEFAULTS]) + GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 +]) + +AC_DEFUN([gl_FCNTL_H_DEFAULTS], +[ + GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN]) + dnl Assume proper GNU behavior unless another module says otherwise. + REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN]) +]) 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..d36e3a4 --- /dev/null +++ b/m4/float_h.m4 @@ -0,0 +1,19 @@ +# float_h.m4 serial 3 +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* | openbsd*) + FLOAT_H=float.h + gl_CHECK_NEXT_HEADERS([float.h]) + ;; + esac + AC_SUBST([FLOAT_H]) +]) diff --git a/m4/fnmatch.m4 b/m4/fnmatch.m4 new file mode 100644 index 0000000..495cbf9 --- /dev/null +++ b/m4/fnmatch.m4 @@ -0,0 +1,127 @@ +# Check for fnmatch - serial 2. + +# 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 + 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 ]) +AC_CHECK_FUNCS_ONCE([btowc isblank 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 to declare FNM_CASEFOLD etc. + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + 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..a771b43 --- /dev/null +++ b/m4/fpending.m4 @@ -0,0 +1,83 @@ +#serial 12 + +# Copyright (C) 2000, 2001, 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 +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_CHECK_FUNCS_ONCE([__fpending]) + fp_headers=' +# include +# if HAVE_STDIO_EXT_H +# include +# 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)' \ + \ + '# QNX' \ + '(fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 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 + ], + [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']) + AC_LIBOBJ([fpending]) + fi +]) diff --git a/m4/fseeko.m4 b/m4/fseeko.m4 new file mode 100644 index 0000000..3d77365 --- /dev/null +++ b/m4/fseeko.m4 @@ -0,0 +1,34 @@ +# fseeko.m4 serial 4 +dnl Copyright (C) 2007-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_FSEEKO], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([gl_STDIN_LARGE_OFFSET]) + + dnl Persuade glibc to declare fseeko(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko], + [ + AC_TRY_LINK([#include ], [fseeko (stdin, 0, 0);], + [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no]) + ]) + if test $gl_cv_func_fseeko = no; then + HAVE_FSEEKO=0 + gl_REPLACE_FSEEKO + elif test $gl_cv_var_stdin_large_offset = no; then + gl_REPLACE_FSEEKO + fi +]) + +AC_DEFUN([gl_REPLACE_FSEEKO], +[ + AC_LIBOBJ([fseeko]) + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + REPLACE_FSEEKO=1 +]) 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: +# + +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 +#include +#include +#include +#include + +/* 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 +#include +#include +#include +#include +#include +#include +#include + +#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 +# include +# 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..18b96be --- /dev/null +++ b/m4/getdelim.m4 @@ -0,0 +1,34 @@ +# getdelim.m4 serial 5 + +dnl Copyright (C) 2005, 2006, 2007 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.59]) + +AC_DEFUN([gl_FUNC_GETDELIM], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + + dnl Persuade glibc to declare getdelim(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_REPLACE_FUNCS([getdelim]) + AC_CHECK_DECLS_ONCE([getdelim]) + + if test $ac_cv_func_getdelim = no; then + gl_PREREQ_GETDELIM + fi + + if test $ac_cv_have_decl_getdelim = no; then + HAVE_DECL_GETDELIM=0 + fi +]) + +# Prerequisites of lib/getdelim.c. +AC_DEFUN([gl_PREREQ_GETDELIM], +[ + AC_CHECK_FUNCS([flockfile funlockfile]) +]) diff --git a/m4/getline.m4 b/m4/getline.m4 new file mode 100644 index 0000000..57625da --- /dev/null +++ b/m4/getline.m4 @@ -0,0 +1,81 @@ +# getline.m4 serial 18 + +dnl Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007 Free +dnl Software Foundation, Inc. +dnl +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_PREREQ([2.59]) + +dnl See if there's a working, system-supplied version of the getline function. +dnl We can't just do AC_REPLACE_FUNCS(getline) because some systems +dnl have a function by that name in -linet that doesn't have anything +dnl to do with the function we need. +AC_DEFUN([gl_FUNC_GETLINE], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + + dnl Persuade glibc to declare getline(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_CHECK_DECLS_ONCE([getline]) + + gl_getline_needs_run_time_check=no + AC_CHECK_FUNC(getline, + dnl Found it in some library. Verify that it works. + gl_getline_needs_run_time_check=yes, + am_cv_func_working_getline=no) + if test $gl_getline_needs_run_time_check = yes; then + AC_CACHE_CHECK([for working getline function], am_cv_func_working_getline, + [echo fooN |tr -d '\012'|tr N '\012' > conftest.data + AC_TRY_RUN([ +# include +# include +# include + 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 +#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 $ac_cv_have_decl_getline = no; then + HAVE_DECL_GETLINE=0 + fi + + if test $am_cv_func_working_getline = no; then + REPLACE_GETLINE=1 + 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 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 ]) + 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 ], + [[ + 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 ])])]) + 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..0d07a3a --- /dev/null +++ b/m4/getpagesize.m4 @@ -0,0 +1,29 @@ +# getpagesize.m4 serial 7 +dnl Copyright (C) 2002, 2004-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_GETPAGESIZE], +[ + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_CHECK_FUNCS([getpagesize]) + if test $ac_cv_func_getpagesize = no; then + HAVE_GETPAGESIZE=0 + AC_CHECK_HEADERS([OS.h]) + if test $ac_cv_header_OS_h = yes; then + HAVE_OS_H=1 + fi + AC_CHECK_HEADERS([sys/param.h]) + if test $ac_cv_header_sys_param_h = yes; then + HAVE_SYS_PARAM_H=1 + fi + fi + case "$host_os" in + mingw*) + REPLACE_GETPAGESIZE=1 + AC_LIBOBJ([getpagesize]) + ;; + esac +]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 new file mode 100644 index 0000000..b4511ce --- /dev/null +++ b/m4/gettext.m4 @@ -0,0 +1,382 @@ +# gettext.m4 serial 60 (gettext-0.17) +dnl Copyright (C) 1995-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 +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 , 1995-2000. +dnl Bruno Haible , 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 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 +$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 +$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 +$gt_revision_test_code +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (const char *);], + [bindtextdomain ("", ""); +return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + eval "$gt_func_gnugettext_libintl=yes" + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ + || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + CATOBJEXT= + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test -n "$INTL_MACOSX_LIBS"; then + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Some extra flags are needed during linking. + LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" + LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" + fi + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLOBJS= + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. +m4_define([gt_NEEDS_INIT], +[ + m4_divert_text([DEFAULTS], [gt_needs=]) + m4_define([gt_NEEDS_INIT], []) +]) + + +dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) +AC_DEFUN([AM_GNU_GETTEXT_NEED], +[ + m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) + 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 + 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 + #include + #include + #include + ]], + [[ + 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 +#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..9336d72 --- /dev/null +++ b/m4/gnulib-common.m4 @@ -0,0 +1,65 @@ +# gnulib-common.m4 serial 3 +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])])]) + +# AC_C_RESTRICT +# This definition overrides the AC_C_RESTRICT macro from autoconf 2.60..2.61, +# so that mixed use of GNU C and GNU C++ and mixed use of Sun C and Sun C++ +# works. +# This definition can be removed once autoconf >= 2.62 can be assumed. +AC_DEFUN([AC_C_RESTRICT], +[AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict, + [ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[typedef int * int_ptr; + int foo (int_ptr $ac_kw ip) { + return ip[0]; + }]], + [[int s[1]; + int * $ac_kw t = s; + t[0] = 0; + return foo(t)]])], + [ac_cv_c_restrict=$ac_kw]) + test "$ac_cv_c_restrict" != no && break + done + ]) + AH_VERBATIM([restrict], +[/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict, even + though the corresponding Sun C compiler does, which causes + "#define restrict _Restrict" in the previous line. Perhaps some future + version of Sun C++ will work with _Restrict; if so, it'll probably + define __RESTRICT, just as Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +#endif]) + case $ac_cv_c_restrict in + restrict) ;; + no) AC_DEFINE([restrict], []) ;; + *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; + esac +]) diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 new file mode 100644 index 0000000..1323a0b --- /dev/null +++ b/m4/gnulib-comp.m4 @@ -0,0 +1,741 @@ +# -*- buffer-read-only: t -*- vi: set ro: +# DO NOT EDIT! GENERATED AUTOMATICALLY! +# DO NOT EDIT! GENERATED AUTOMATICALLY! +# Copyright (C) 2002-2008 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([AM_PROG_CC_C_O]) + AC_REQUIRE([AC_GNU_SOURCE]) + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([AC_FUNC_FSEEKO]) + 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], +[ + AM_CONDITIONAL([GL_COND_LIBTOOL], [false]) + gl_cond_libtool=false + gl_libdeps= + gl_ltlibdeps= + 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])) + gl_source_base='.#bootmp/lib' + gl_EOVERFLOW + gl_FUNC_ALLOCA + gl_ARGMATCH + gl_ARGP + m4_ifdef([AM_XGETTEXT_OPTION], + [AM_XGETTEXT_OPTION([--flag=argp_error:2:c-format]) + AM_XGETTEXT_OPTION([--flag=argp_failure:4:c-format])]) + 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_ENVIRON + gl_UNISTD_MODULE_INDICATOR([environ]) + gl_ERROR + m4_ifdef([AM_XGETTEXT_OPTION], + [AM_XGETTEXT_OPTION([--flag=error:3:c-format]) + AM_XGETTEXT_OPTION([--flag=error_at_line:5:c-format])]) + 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_FSEEKO + gl_STDIO_MODULE_INDICATOR([fseeko]) + gl_FUNC_FTRUNCATE + gl_UNISTD_MODULE_INDICATOR([ftruncate]) + gl_FUNC_GETCWD + gl_UNISTD_MODULE_INDICATOR([getcwd]) + gl_GETDATE + gl_FUNC_GETDELIM + gl_STDIO_MODULE_INDICATOR([getdelim]) + gl_FUNC_GETLINE + gl_STDIO_MODULE_INDICATOR([getline]) + gl_GETOPT + gl_FUNC_GETPAGESIZE + gl_UNISTD_MODULE_INDICATOR([getpagesize]) + dnl you must add AM_GNU_GETTEXT([external]) or similar to configure.ac. + AM_GNU_GETTEXT_VERSION([0.17]) + 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_UNISTD_MODULE_INDICATOR([lchown]) + gl_LOCALCHARSET + LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(top_builddir)/$gl_source_base\"" + AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) + gl_FUNC_LSEEK + gl_UNISTD_MODULE_INDICATOR([lseek]) + gl_FUNC_LSTAT + AC_FUNC_MALLOC + AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.]) + gl_FUNC_MALLOC_POSIX + gl_STDLIB_MODULE_INDICATOR([malloc-posix]) + gl_MALLOCA + 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_FUNC_REALLOC_POSIX + gl_STDLIB_MODULE_INDICATOR([realloc-posix]) + gl_REGEX + gl_FUNC_RMDIR + gl_FUNC_RPMATCH + gl_SAFE_READ + gl_SAFE_WRITE + gl_SAVE_CWD + gl_SAVEDIR + gl_FUNC_SETENV + gl_STDLIB_MODULE_INDICATOR([setenv]) + gl_FUNC_SLEEP + gl_UNISTD_MODULE_INDICATOR([sleep]) + gl_FUNC_SNPRINTF + gl_STDIO_MODULE_INDICATOR([snprintf]) + 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_STRING_MODULE_INDICATOR([strerror]) + gl_HEADER_STRING_H + gl_HEADER_STRINGS_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_UNSETENV + gl_STDLIB_MODULE_INDICATOR([unsetenv]) + 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_WCHAR_MODULE_INDICATOR([wcwidth]) + gl_XALLOC + gl_XGETCWD + gl_XSIZE + gl_XSTRNDUP + gl_XSTRTOL + 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]) + ]) + gltests_libdeps= + gltests_ltlibdeps= + m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ])) + m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS])) + m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES])) + gl_source_base='.#bootmp/tests' + m4_popdef([AC_LIBSOURCES]) + m4_popdef([AC_REPLACE_FUNCS]) + m4_popdef([AC_LIBOBJ]) + AC_CONFIG_COMMANDS_PRE([ + gltests_libobjs= + gltests_ltlibobjs= + if test -n "$gltests_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed "$sed_drop_objext" | sort | uniq`; do + gltests_libobjs="$gltests_libobjs $i.$ac_objext" + gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" + done + fi + AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs]) + AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs]) + ]) + LIBTAR_LIBDEPS="$gl_libdeps" + AC_SUBST([LIBTAR_LIBDEPS]) + LIBTAR_LTLIBDEPS="$gl_ltlibdeps" + AC_SUBST([LIBTAR_LTLIBDEPS]) +]) + +# Like AC_LIBOBJ, except that the module name goes +# into gl_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gl_LIBOBJ], [ + AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl + gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext" +]) + +# m4_foreach_w is provided by autoconf-2.59c and later. +# This definition is to accommodate developers using versions +# of autoconf older than that. +m4_ifndef([m4_foreach_w], + [m4_define([m4_foreach_w], + [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) + +# Like AC_REPLACE_FUNCS, except that the module name goes +# into gl_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gl_REPLACE_FUNCS], [ + m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl + AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)]) +]) + +# Like AC_LIBSOURCES, except the directory where the source file is +# expected is derived from the gnulib-tool parametrization, +# and alloca is special cased (for the alloca-opt module). +# We could also entirely rely on EXTRA_lib..._SOURCES. +AC_DEFUN([gl_LIBSOURCES], [ + m4_foreach([_gl_NAME], [$1], [ + m4_if(_gl_NAME, [alloca.c], [], [ + m4_syscmd([test -r .#bootmp/lib/]_gl_NAME[ || test ! -d .#bootmp/lib])dnl + m4_if(m4_sysval, [0], [], + [AC_FATAL([missing .#bootmp/lib/]_gl_NAME)]) + ]) + ]) +]) + +# Like AC_LIBOBJ, except that the module name goes +# into gltests_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gltests_LIBOBJ], [ + AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl + gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext" +]) + +# m4_foreach_w is provided by autoconf-2.59c and later. +# This definition is to accommodate developers using versions +# of autoconf older than that. +m4_ifndef([m4_foreach_w], + [m4_define([m4_foreach_w], + [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) + +# Like AC_REPLACE_FUNCS, except that the module name goes +# into gltests_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gltests_REPLACE_FUNCS], [ + m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl + AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)]) +]) + +# Like AC_LIBSOURCES, except the directory where the source file is +# expected is derived from the gnulib-tool parametrization, +# and alloca is special cased (for the alloca-opt module). +# We could also entirely rely on EXTRA_lib..._SOURCES. +AC_DEFUN([gltests_LIBSOURCES], [ + m4_foreach([_gl_NAME], [$1], [ + m4_if(_gl_NAME, [alloca.c], [], [ + m4_syscmd([test -r .#bootmp/tests/]_gl_NAME[ || test ! -d .#bootmp/tests])dnl + m4_if(m4_sysval, [0], [], + [AC_FATAL([missing .#bootmp/tests/]_gl_NAME)]) + ]) + ]) +]) + +# This macro records the list of files which have been installed by +# gnulib-tool and may be removed by future gnulib-tool invocations. +AC_DEFUN([gl_FILE_LIST], [ + build-aux/config.rpath + build-aux/link-warning.h + doc/getdate.texi + lib/alloca.c + lib/alloca.in.h + 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.in.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.in.h + lib/fd-safer.c + lib/fileblocks.c + lib/float+.h + lib/float.in.h + lib/fnmatch.c + lib/fnmatch.in.h + lib/fnmatch_loop.c + lib/fpending.c + lib/fpending.h + lib/fseeko.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/getline.c + lib/getopt.c + lib/getopt.in.h + lib/getopt1.c + lib/getopt_int.h + lib/getpagesize.c + 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.in.h + lib/lchown.c + lib/localcharset.c + lib/localcharset.h + lib/lseek.c + lib/lstat.c + lib/lstat.h + lib/malloc.c + lib/malloca.c + lib/malloca.h + lib/malloca.valgrind + 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/realloc.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/sleep.c + lib/snprintf.c + lib/stat-macros.h + lib/stat-time.h + lib/stdarg.in.h + lib/stdbool.in.h + lib/stdint.in.h + lib/stdio.in.h + lib/stdlib.in.h + lib/stpcpy.c + lib/strcasecmp.c + lib/strchrnul.c + lib/strdup.c + lib/streq.h + lib/strerror.c + lib/string.in.h + lib/strings.in.h + lib/stripslash.c + lib/strncasecmp.c + lib/strndup.c + lib/strnlen.c + lib/strnlen1.c + lib/strnlen1.h + lib/strtoimax.c + lib/strtol.c + lib/strtoll.c + lib/strtoul.c + lib/strtoull.c + lib/strtoumax.c + lib/sys_stat.in.h + lib/sys_time.in.h + lib/sysexits.in.h + lib/tempname.c + lib/tempname.h + lib/time.in.h + lib/time_r.c + lib/timespec.h + lib/uinttostr.c + lib/umaxtostr.c + lib/unistd--.h + lib/unistd-safer.h + lib/unistd.in.h + lib/unitypes.h + lib/uniwidth.h + lib/uniwidth/cjk.h + lib/uniwidth/width.c + 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.in.h + lib/wctype.in.h + lib/wcwidth.c + lib/xalloc-die.c + lib/xalloc.h + lib/xgetcwd.c + lib/xgetcwd.h + lib/xmalloc.c + lib/xsize.h + lib/xstrndup.c + lib/xstrndup.h + lib/xstrtol-error.c + lib/xstrtol.c + lib/xstrtol.h + lib/xstrtoul.c + lib/xstrtoumax.c + m4/alloca.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/environ.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/fseeko.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/include_next.m4 + m4/inline.m4 + m4/intdiv0.m4 + m4/intl.m4 + m4/intldir.m4 + m4/intlmacosx.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/lseek.m4 + m4/lstat.m4 + m4/malloc.m4 + m4/malloca.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/realloc.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/snprintf.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/strings_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/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..66bc76f --- /dev/null +++ b/m4/iconv.m4 @@ -0,0 +1,180 @@ +# iconv.m4 serial AM6 (gettext-0.17) +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 +#include ], + [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 +#include ], + [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 +#include +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 +#include +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/include_next.m4 b/m4/include_next.m4 new file mode 100644 index 0000000..7c08e93 --- /dev/null +++ b/m4/include_next.m4 @@ -0,0 +1,110 @@ +# include_next.m4 serial 5 +dnl Copyright (C) 2006-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Paul Eggert and Derek Price. + +AC_DEFUN([gl_INCLUDE_NEXT], +[ + AC_LANG_PREPROC_REQUIRE() + AC_CACHE_CHECK([whether the preprocessor supports include_next], + [gl_cv_have_include_next], + [rm -rf conftestd1 conftestd2 + mkdir conftestd1 conftestd2 + cat < conftestd1/conftest.h +#define DEFINED_IN_CONFTESTD1 +#include_next +#ifdef DEFINED_IN_CONFTESTD2 +int foo; +#else +#error "include_next doesn't work" +#endif +EOF + cat < conftestd2/conftest.h +#ifndef DEFINED_IN_CONFTESTD1 +#error "include_next test doesn't work" +#endif +#define DEFINED_IN_CONFTESTD2 +EOF + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -Iconftestd1 -Iconftestd2" + AC_COMPILE_IFELSE([#include ], + [gl_cv_have_include_next=yes], + [gl_cv_have_include_next=no]) + CPPFLAGS="$save_CPPFLAGS" + rm -rf conftestd1 conftestd2 + ]) + if test $gl_cv_have_include_next = yes; then + + dnl FIXME: Remove HAVE_INCLUDE_NEXT and update everything that uses it + dnl to use @INCLUDE_NEXT@ instead. + AC_DEFINE([HAVE_INCLUDE_NEXT], 1, + [Define if your compiler supports the #include_next directive.]) + + INCLUDE_NEXT=include_next + else + INCLUDE_NEXT=include + fi + AC_SUBST([INCLUDE_NEXT]) +]) + +# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...) +# ------------------------------------------ +# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be +# ''; otherwise define it to be +# '"///usr/include/foo.h"', or whatever other absolute file name is suitable. +# That way, a header file with the following line: +# #@INCLUDE_NEXT@ @NEXT_FOO_H@ +# behaves (after sed substitution) as if it contained +# #include_next +# even if the compiler does not support include_next. +# The three "///" are to pacify Sun C 5.8, which otherwise would say +# "warning: #include of /usr/include/... may be non-portable". +# Use `""', not `<>', so that the /// cannot be confused with a C99 comment. +# Note: This macro assumes that the header file is not empty after +# preprocessing, i.e. it does not only define preprocessor macros but also +# provides some type/enum definitions or function/variable declarations. +AC_DEFUN([gl_CHECK_NEXT_HEADERS], +[ + AC_REQUIRE([gl_INCLUDE_NEXT]) + AC_CHECK_HEADERS_ONCE([$1]) + + AC_FOREACH([gl_HEADER_NAME], [$1], + [AS_VAR_PUSHDEF([gl_next_header], + [gl_cv_next_]m4_quote(m4_defn([gl_HEADER_NAME]))) + if test $gl_cv_have_include_next = yes; then + AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) + else + AC_CACHE_CHECK( + [absolute name of <]m4_quote(m4_defn([gl_HEADER_NAME]))[>], + m4_quote(m4_defn([gl_next_header])), + [AS_VAR_PUSHDEF([gl_header_exists], + [ac_cv_header_]m4_quote(m4_defn([gl_HEADER_NAME]))) + if test AS_VAR_GET(gl_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, + dnl so use subshell. + AS_VAR_SET([gl_next_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 + }'`'"']) + else + AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>']) + fi + AS_VAR_POPDEF([gl_header_exists])]) + fi + AC_SUBST( + AS_TR_CPP([NEXT_]m4_quote(m4_defn([gl_HEADER_NAME]))), + [AS_VAR_GET([gl_next_header])]) + AS_VAR_POPDEF([gl_next_header])]) +]) 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/intlmacosx.m4 b/m4/intlmacosx.m4 new file mode 100644 index 0000000..d3f0d90 --- /dev/null +++ b/m4/intlmacosx.m4 @@ -0,0 +1,51 @@ +# intlmacosx.m4 serial 1 (gettext-0.17) +dnl Copyright (C) 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 +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Checks for special options needed on 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 ], + [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 ], [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]) +]) diff --git a/m4/intmax_t.m4 b/m4/intmax_t.m4 new file mode 100644 index 0000000..50ae35d --- /dev/null +++ b/m4/intmax_t.m4 @@ -0,0 +1,61 @@ +# intmax_t.m4 serial 6 +dnl Copyright (C) 1997-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. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define intmax_t to 'long' or 'long long' +# if it is not already defined in or . + +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([AC_TYPE_LONG_LONG_INT]) + test $ac_cv_type_long_long_int = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + else + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + 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 +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#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 or .]) + else + AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) + test $ac_cv_type_long_long_int = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and 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 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 +#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 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..b17cbda --- /dev/null +++ b/m4/inttypes.m4 @@ -0,0 +1,295 @@ +# inttypes.m4 serial 11 +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 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 . + dnl A complete requires + dnl - a complete , + dnl - the existence of an , + 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 +#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 */ +#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H /* work if build isn't clean */ +#include + +/* 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 always, so that the portability warnings work. + if false && test $gl_cv_header_working_inttypes_h = yes; then + dnl Use the existing . + INTTYPES_H='' + else + + AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) + gl_CHECK_NEXT_HEADERS([inttypes.h]) + + dnl Ensure that defines the limit macros, since gnulib's + dnl relies on them. This macro is only needed when a + dnl C++ compiler is in use; it has no effect for a C compiler. + dnl Also be careful to define __STDC_LIMIT_MACROS only when gnulib's + dnl is going to be created, and to avoid redefinition warnings + dnl if the __STDC_LIMIT_MACROS is already defined through the CPPFLAGS. + AC_DEFINE([GL_TRIGGER_STDC_LIMIT_MACROS], 1, + [Define to make the limit macros in visible.]) + AH_VERBATIM([__STDC_LIMIT_MACROS_ZZZ], +[/* Ensure that defines the limit macros, since gnulib's + relies on them. */ +#if defined __cplusplus && !defined __STDC_LIMIT_MACROS && GL_TRIGGER_STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS 1 +#endif +]) + + PRIPTR_PREFIX= + if test -n "$STDINT_H"; then + dnl Using the gnulib . It always defines intptr_t to 'long'. + PRIPTR_PREFIX='"l"' + else + dnl Using the system's . + 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 + 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 + + gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( + [INT32_MAX_LT_INTMAX_MAX], + [defined INT32_MAX && defined INTMAX_MAX], + [INT32_MAX < INTMAX_MAX], + [sizeof (int) < sizeof (long long int)]) + gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( + [INT64_MAX_EQ_LONG_MAX], + [defined INT64_MAX], + [INT64_MAX == LONG_MAX], + [sizeof (long long int) == sizeof (long int)]) + gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( + [UINT32_MAX_LT_UINTMAX_MAX], + [defined UINT32_MAX && defined UINTMAX_MAX], + [UINT32_MAX < UINTMAX_MAX], + [sizeof (unsigned int) < sizeof (unsigned long long int)]) + gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION( + [UINT64_MAX_EQ_ULONG_MAX], + [defined UINT64_MAX], + [UINT64_MAX == ULONG_MAX], + [sizeof (unsigned long long int) == sizeof (unsigned long int)]) + + INTTYPES_H='inttypes.h' + fi + AC_SUBST(INTTYPES_H) +]) + +# Define the symbol $1 to be 1 if the condition is true, 0 otherwise. +# If $2 is true, the condition is $3; otherwise if long long int is supported +# approximate the condition with $4; otherwise, assume the condition is false. +# The condition should work on all C99 platforms; the approximations should be +# good enough to work on all practical pre-C99 platforms. +# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants. +AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION], +[ + AC_CACHE_CHECK([whether $3], + [gl_cv_test_$1], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[/* Work also in C++ mode. */ + #define __STDC_LIMIT_MACROS 1 + + /* Work if build is not clean. */ + #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H + + #include + #if HAVE_STDINT_H + #include + #endif + + #if $2 + #define CONDITION ($3) + #elif HAVE_LONG_LONG_INT + #define CONDITION ($4) + #else + #define CONDITION 0 + #endif + int test[CONDITION ? 1 : -1];]])], + [gl_cv_test_$1=yes], + [gl_cv_test_$1=no])]) + if test $gl_cv_test_$1 = yes; then + $1=1; + else + $1=0; + fi + AC_SUBST([$1]) +]) + +AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR], +[ + dnl Use AC_REQUIRE here, so that the default settings are expanded once only. + AC_REQUIRE([gl_INTTYPES_H_DEFAULTS]) + 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 exists, +# doesn't clash with , 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 +#include ], + [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 exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/lchown.m4 b/m4/lchown.m4 new file mode 100644 index 0000000..b719ed0 --- /dev/null +++ b/m4/lchown.m4 @@ -0,0 +1,22 @@ +#serial 12 +# Determine whether we need the lchown wrapper. + +dnl Copyright (C) 1998, 2001, 2003, 2004, 2005, 2006, 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. + +dnl From Jim Meyering. +dnl Provide lchown on systems that lack it. + +AC_DEFUN([gl_FUNC_LCHOWN], +[ + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + AC_REQUIRE([gl_FUNC_CHOWN]) + AC_REPLACE_FUNCS(lchown) + if test $ac_cv_func_lchown = no; then + REPLACE_LCHOWN=1 + fi +]) 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 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..1602895 --- /dev/null +++ b/m4/lib-link.m4 @@ -0,0 +1,739 @@ +# lib-link.m4 serial 15 (gettext-0.18) +dnl Copyright (C) 2001-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([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 + popdef([NAME]) + popdef([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]) + pushdef([Name],[translit([$1],[./-], [___])]) + pushdef([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]) + popdef([NAME]) + popdef([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_FROMPACKAGE(name, package) +dnl declares that libname comes from the given package. The configure file +dnl will then not have a --with-libname-prefix option but a +dnl --with-package-prefix option. Several libraries can come from the same +dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar +dnl macro call that searches for libname. +AC_DEFUN([AC_LIB_FROMPACKAGE], +[ + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_frompackage_]NAME, [$2]) + popdef([NAME]) + pushdef([PACK],[$2]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + define([acl_libsinpackage_]PACKUP, + m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) + popdef([PACKUP]) + popdef([PACK]) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found +dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) + pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) + pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) + dnl Autoconf >= 2.61 supports dots in --with options. + pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH(P_A_C_K[-prefix], +[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib + --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], +[ + if test "X$withval" = "Xno"; then + use_additional=no + 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 + popdef([P_A_C_K]) + popdef([PACKLIBS]) + popdef([PACKUP]) + popdef([PACK]) + popdef([NAME]) +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +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..15bf9da --- /dev/null +++ b/m4/longlong.m4 @@ -0,0 +1,106 @@ +# longlong.m4 serial 13 +dnl Copyright (C) 1999-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. + +# Define HAVE_LONG_LONG_INT if 'long long int' works. +# This fixes a bug in Autoconf 2.61, but can be removed once we +# assume 2.62 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_TYPE_LONG_LONG_SNIPPET], + [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 + @%:@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 +]) + +# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works. +# This fixes a bug in Autoconf 2.61, but can be removed once we +# assume 2.62 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_TYPE_LONG_LONG_SNIPPET], + [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 +]) + +# Expands to a C program that can be used to test for simultaneous support +# of 'long long' and 'unsigned long long'. We don't want to say that +# 'long long' is available if 'unsigned long long' is not, or vice versa, +# because too many programs rely on the symmetry between signed and unsigned +# integer types (excluding 'bool'). +AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], +[ + AC_LANG_PROGRAM( + [[/* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ + /* Test literals. */ + long long int ll = 9223372036854775807ll; + long long int nll = -9223372036854775807LL; + unsigned long long int ull = 18446744073709551615ULL; + /* Test constant expressions. */ + typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) + ? 1 : -1)]; + typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 + ? 1 : -1)]; + int i = 63;]], + [[/* Test availability of runtime routines for shift and division. */ + long long int llmax = 9223372036854775807ll; + unsigned long long int ullmax = 18446744073709551615ull; + return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull));]]) +]) diff --git a/m4/lseek.m4 b/m4/lseek.m4 new file mode 100644 index 0000000..f336990 --- /dev/null +++ b/m4/lseek.m4 @@ -0,0 +1,50 @@ +# lseek.m4 serial 4 +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_LSEEK], +[ + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + AC_REQUIRE([AC_PROG_CC]) + AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe], + [if test $cross_compiling = no; then + AC_LINK_IFELSE([ +#include /* for off_t */ +#include /* for SEEK_CUR */ +#include +int main () +{ + /* Exit with success only if stdin is seekable. */ + return lseek (0, (off_t)0, SEEK_CUR) < 0; +}], + [if test -s conftest$ac_exeext \ + && ./conftest$ac_exeext < conftest.$ac_ext \ + && { echo hi | ./conftest$ac_exeext; test $? = 1; }; then + gl_cv_func_lseek_pipe=yes + else + gl_cv_func_lseek_pipe=no + fi], + [gl_cv_func_lseek_pipe=no]) + else + AC_COMPILE_IFELSE([ +#if ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) || defined __BEOS__ +/* mingw and BeOS mistakenly return 0 when trying to seek on pipes. */ + Choke me. +#endif], + [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no]) + fi]) + if test $gl_cv_func_lseek_pipe = no; then + gl_REPLACE_LSEEK + fi +]) + +AC_DEFUN([gl_REPLACE_LSEEK], +[ + AC_LIBOBJ([lseek]) + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + REPLACE_LSEEK=1 + AC_DEFINE([LSEEK_PIPE_BROKEN], [1], + [Define to 1 if lseek does not detect pipes.]) +]) 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/malloc.m4 b/m4/malloc.m4 new file mode 100644 index 0000000..764f2a9 --- /dev/null +++ b/m4/malloc.m4 @@ -0,0 +1,41 @@ +# malloc.m4 serial 8 +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_FUNC_MALLOC_POSIX +# -------------------- +# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it +# fails), and replace malloc if it is not. +AC_DEFUN([gl_FUNC_MALLOC_POSIX], +[ + AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) + if test $gl_cv_func_malloc_posix = yes; then + HAVE_MALLOC_POSIX=1 + AC_DEFINE([HAVE_MALLOC_POSIX], 1, + [Define if the 'malloc' function is POSIX compliant.]) + else + AC_LIBOBJ([malloc]) + HAVE_MALLOC_POSIX=0 + fi + AC_SUBST([HAVE_MALLOC_POSIX]) +]) + +# Test whether malloc, realloc, calloc are POSIX compliant, +# Set gl_cv_func_malloc_posix to yes or no accordingly. +AC_DEFUN([gl_CHECK_MALLOC_POSIX], +[ + AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant], + [gl_cv_func_malloc_posix], + [ + dnl It is too dangerous to try to allocate a large amount of memory: + dnl some systems go to their knees when you do that. So assume that + dnl all Unix implementations of the function are POSIX compliant. + AC_TRY_COMPILE([], + [#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + choke me + #endif + ], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no]) + ]) +]) diff --git a/m4/malloca.m4 b/m4/malloca.m4 new file mode 100644 index 0000000..2841ae8 --- /dev/null +++ b/m4/malloca.m4 @@ -0,0 +1,14 @@ +# malloca.m4 serial 1 +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_MALLOCA], +[ + dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables + dnl @ALLOCA@ and @LTALLOCA@. + dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies. + AC_REQUIRE([gl_EEMALLOC]) + AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) +]) diff --git a/m4/mbchar.m4 b/m4/mbchar.m4 new file mode 100644 index 0000000..e73e2b4 --- /dev/null +++ b/m4/mbchar.m4 @@ -0,0 +1,13 @@ +# mbchar.m4 serial 7 +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_USE_SYSTEM_EXTENSIONS]) +]) 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_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 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 ], + [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 declares mbstate_t.]) + else + AC_DEFINE([mbstate_t], int, + [Define to a type if 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..d1a12eb --- /dev/null +++ b/m4/mempcpy.m4 @@ -0,0 +1,26 @@ +# mempcpy.m4 serial 9 +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 to declare mempcpy(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'. + AC_REQUIRE([AC_C_RESTRICT]) + + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_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..8070d5f --- /dev/null +++ b/m4/memrchr.m4 @@ -0,0 +1,25 @@ +# memrchr.m4 serial 8 +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 to declare memrchr(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_CHECK_DECLS_ONCE([memrchr]) + if test $ac_cv_have_decl_memrchr = no; then + HAVE_DECL_MEMRCHR=0 + fi + + AC_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 +# . +# 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 +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#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 , 1995-2000. +dnl Bruno Haible , 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 +#include +#include +#include +#include +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..0734762 --- /dev/null +++ b/m4/po.m4 @@ -0,0 +1,449 @@ +# po.m4 serial 15 (gettext-0.17) +dnl Copyright (C) 1995-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 +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 , 1995-2000. +dnl Bruno Haible , 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 Release version of the gettext macros. This is used to ensure that + dnl the gettext macros and po/Makefile.in.in are in sync. + AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Test whether it is GNU msgfmt >= 0.15. +changequote(,)dnl + case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; + *) MSGFMT_015=$MSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([MSGFMT_015]) +changequote(,)dnl + case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; + *) GMSGFMT_015=$GMSGFMT ;; + esac +changequote([,])dnl + AC_SUBST([GMSGFMT_015]) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Test whether it is GNU xgettext >= 0.15. +changequote(,)dnl + case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in + '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; + *) XGETTEXT_015=$XGETTEXT ;; + esac +changequote([,])dnl + AC_SUBST([XGETTEXT_015]) + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) + + dnl Installation directories. + dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we + dnl have to define it here, so that it can be used in po/Makefile. + test -n "$localedir" || localedir='${datadir}/locale' + AC_SUBST([localedir]) + + dnl Support for AM_XGETTEXT_OPTION. + test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= + AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) + + AC_CONFIG_COMMANDS([po-directories], [[ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + # Treat a directory as a PO directory if and only if it has a + # POTFILES.in file. This allows packages to have multiple PO + # directories under different names or in different locations. + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + 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 < "$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" < /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" <> "$ac_file.tmp" <, 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/realloc.m4 b/m4/realloc.m4 new file mode 100644 index 0000000..f9fd935 --- /dev/null +++ b/m4/realloc.m4 @@ -0,0 +1,23 @@ +# realloc.m4 serial 8 +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_FUNC_REALLOC_POSIX +# --------------------- +# Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it +# fails), and replace realloc if it is not. +AC_DEFUN([gl_FUNC_REALLOC_POSIX], +[ + AC_REQUIRE([gl_CHECK_MALLOC_POSIX]) + if test $gl_cv_func_malloc_posix = yes; then + HAVE_REALLOC_POSIX=1 + AC_DEFINE([HAVE_REALLOC_POSIX], 1, + [Define if the 'realloc' function is POSIX compliant.]) + else + AC_LIBOBJ([realloc]) + HAVE_REALLOC_POSIX=0 + fi + AC_SUBST([HAVE_REALLOC_POSIX]) +]) diff --git a/m4/regex.m4 b/m4/regex.m4 new file mode 100644 index 0000000..4879bd8 --- /dev/null +++ b/m4/regex.m4 @@ -0,0 +1,223 @@ +#serial 49 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +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 + #endif + #include + #include + ], + [[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 (®ex, 0, sizeof regex); + s = re_compile_pattern (pat, sizeof pat - 1, ®ex); + if (s) + return 1; + if (re_search (®ex, data, sizeof data - 1, + 0, sizeof data - 1, ®s) + != -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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("a[^x]b", 6, ®ex); + if (s) + return 1; + + /* This should fail, but succeeds for glibc-2.5. */ + if (re_search (®ex, "a\nb", 3, 0, 3, ®s) != -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 (®ex, 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, ®ex); + /* 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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("{1", 2, ®ex); + + if (s) + return 1; + + /* The following example is derived from a problem report + against gawk from Jorge Stolfi . */ + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("[an\371]*n", 7, ®ex); + if (s) + return 1; + + /* This should match, but does not for glibc-2.2.1. */ + if (re_match (®ex, "an", 2, 0, ®s) != 2) + return 1; + + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("x", 1, ®ex); + if (s) + return 1; + + /* glibc-2.2.93 does not work with a negative RANGE argument. */ + if (re_search (®ex, "wxy", 3, 2, -2, ®s) != 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 (®ex, 0, sizeof regex); + s = re_compile_pattern ("x", 1, ®ex); + if (s) + return 1; + + if (re_search (®ex, "WXY", 3, 0, 3, ®s) < 0) + return 1; + + /* Catch a bug reported by Vin Shelton in + http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00089.html + */ + re_set_syntax (RE_SYNTAX_POSIX_BASIC + & ~RE_CONTEXT_INVALID_DUP + & ~RE_NO_EMPTY_RANGES); + memset (®ex, 0, sizeof regex); + s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, ®ex); + if (s) + 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_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([AC_C_RESTRICT]) + AC_REQUIRE([AC_TYPE_MBSTATE_T]) + AC_CHECK_FUNCS_ONCE([isblank iswctype mbrtowc wcrtomb wcscoll]) + AC_CHECK_DECLS([isblank], [], [], [#include ]) +]) 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..5225a6b --- /dev/null +++ b/m4/rmt.m4 @@ -0,0 +1,71 @@ + +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 + + 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 +#endif +#include ], + 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..7af13d7 --- /dev/null +++ b/m4/setenv.m4 @@ -0,0 +1,71 @@ +# setenv.m4 serial 10 +dnl Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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_REQUIRE([gl_STDLIB_H_DEFAULTS]) + AC_CHECK_FUNCS_ONCE([setenv]) + if test $ac_cv_func_setenv = no; then + HAVE_SETENV=0 + 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_REQUIRE([gl_STDLIB_H_DEFAULTS]) + AC_CHECK_FUNCS_ONCE([setenv]) + if test $ac_cv_func_setenv = no; then + HAVE_SETENV=0 + fi + gl_PREREQ_SETENV +]) + +AC_DEFUN([gl_FUNC_UNSETENV], +[ + AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) + AC_CHECK_FUNCS([unsetenv]) + if test $ac_cv_func_unsetenv = no; then + HAVE_UNSETENV=0 + AC_LIBOBJ([unsetenv]) + gl_PREREQ_UNSETENV + else + AC_CACHE_CHECK([for unsetenv() return type], gt_cv_func_unsetenv_ret, + [AC_TRY_COMPILE([#include +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 + VOID_UNSETENV=1 + fi + fi +]) + +# Prerequisites of lib/setenv.c. +AC_DEFUN([gl_PREREQ_SETENV], +[ + AC_REQUIRE([AC_FUNC_ALLOCA]) + AC_REQUIRE([gl_ENVIRON]) + AC_CHECK_HEADERS_ONCE(unistd.h) + AC_CHECK_HEADERS(search.h) + AC_CHECK_FUNCS(tsearch) +]) + +# Prerequisites of lib/unsetenv.c. +AC_DEFUN([gl_PREREQ_UNSETENV], +[ + AC_REQUIRE([gl_ENVIRON]) + AC_CHECK_HEADERS_ONCE(unistd.h) +]) 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/snprintf.m4 b/m4/snprintf.m4 new file mode 100644 index 0000000..f21200d --- /dev/null +++ b/m4/snprintf.m4 @@ -0,0 +1,31 @@ +# snprintf.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_SNPRINTF], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_CHECK_FUNCS([snprintf]) + if test $ac_cv_func_snprintf = no; then + gl_REPLACE_SNPRINTF + fi + AC_CHECK_DECLS_ONCE([snprintf]) + if test $ac_cv_have_decl_snprintf = no; then + HAVE_DECL_SNPRINTF=0 + fi +]) + +AC_DEFUN([gl_REPLACE_SNPRINTF], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_LIBOBJ([snprintf]) + if test $ac_cv_func_snprintf = yes; then + REPLACE_SNPRINTF=1 + fi + gl_PREREQ_SNPRINTF +]) + +# Prerequisites of lib/snprintf.c. +AC_DEFUN([gl_PREREQ_SNPRINTF], [:]) 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 ], + [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 + #include + #if HAVE_SYS_TIME_H + # include + #endif + #include + 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 + #include ])], + [#include + #include ])], + [#include + #include ])], + [#include + #include ]) +]) + +# 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 + #include ])], + [#include + #include ])], + [#include + #include ]) +]) diff --git a/m4/stdarg.m4 b/m4/stdarg.m4 new file mode 100644 index 0000000..21910e4 --- /dev/null +++ b/m4/stdarg.m4 @@ -0,0 +1,67 @@ +# stdarg.m4 serial 2 +dnl Copyright (C) 2006, 2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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 . + +AC_DEFUN([gl_STDARG_H], +[ + STDARG_H=''; AC_SUBST([STDARG_H]) + NEXT_STDARG_H=''; AC_SUBST([NEXT_STDARG_H]) + AC_MSG_CHECKING([for va_copy]) + AC_CACHE_VAL([gl_cv_func_va_copy], [ + AC_TRY_COMPILE([#include ], [ +#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 + dnl Provide a substitute. + dnl Usually a simple definition in is enough. Not so on AIX 5 + dnl with some versions of the /usr/vac/bin/cc compiler. It has an + dnl which does '#undef va_copy', leading to a missing va_copy symbol. For + dnl this platform, we use an substitute. But we cannot use this + dnl approach on other platforms, because often defines only + dnl preprocessor macros and gl_ABSOLUTE_HEADER, gl_CHECK_NEXT_HEADERS do + dnl not work in this situation. + AC_EGREP_CPP([vaccine], + [#if defined _AIX && !defined __GNUC__ + AIX vaccine + #endif + ], [gl_aixcc=yes], [gl_aixcc=no]) + if test $gl_aixcc = yes; then + dnl Provide a substitute file. + STDARG_H=stdarg.h + gl_CHECK_NEXT_HEADERS([stdarg.h]) + dnl Fallback for the case when contains only macro definitions. + if test "$gl_cv_next_stdarg_h" = '""'; then + gl_cv_next_stdarg_h='"///usr/include/stdarg.h"' + NEXT_STDARG_H="$gl_cv_next_stdarg_h" + fi + else + dnl Provide a substitute in , either __va_copy or as a simple + dnl assignment. + AC_CACHE_VAL([gl_cv_func___va_copy], [ + AC_TRY_COMPILE([#include ], [ +#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 + 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 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 + #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..bb6c34f --- /dev/null +++ b/m4/stdint.m4 @@ -0,0 +1,395 @@ +# stdint.m4 serial 29 +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 Paul Eggert and Bruno Haible. +dnl Test whether 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 . + 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 . + 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]) + + gl_CHECK_NEXT_HEADERS([stdint.h]) + if test $ac_cv_header_stdint_h = yes; then + HAVE_STDINT_H=1 + else + HAVE_STDINT_H=0 + fi + AC_SUBST([HAVE_STDINT_H]) + + dnl Now see whether we need a substitute . + if test $ac_cv_header_stdint_h = yes; then + AC_CACHE_CHECK([whether stdint.h conforms to C99], + [gl_cv_header_working_stdint_h], + [gl_cv_header_working_stdint_h=no + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ +#define __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 _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */ +#include +/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in . */ +#if !(defined WCHAR_MIN && defined WCHAR_MAX) +#error "WCHAR_MIN, WCHAR_MAX not defined in " +#endif +] +gl_STDINT_INCLUDES +[ +#ifdef INT8_MAX +int8_t a1 = INT8_MAX; +int8_t a1min = INT8_MIN; +#endif +#ifdef INT16_MAX +int16_t a2 = INT16_MAX; +int16_t a2min = INT16_MIN; +#endif +#ifdef INT32_MAX +int32_t a3 = INT32_MAX; +int32_t a3min = INT32_MIN; +#endif +#ifdef INT64_MAX +int64_t a4 = INT64_MAX; +int64_t a4min = INT64_MIN; +#endif +#ifdef UINT8_MAX +uint8_t b1 = UINT8_MAX; +#else +typedef int b1[(unsigned char) -1 != 255 ? 1 : -1]; +#endif +#ifdef UINT16_MAX +uint16_t b2 = UINT16_MAX; +#endif +#ifdef UINT32_MAX +uint32_t b3 = UINT32_MAX; +#endif +#ifdef UINT64_MAX +uint64_t b4 = UINT64_MAX; +#endif +int_least8_t c1 = INT8_C (0x7f); +int_least8_t c1max = INT_LEAST8_MAX; +int_least8_t c1min = INT_LEAST8_MIN; +int_least16_t c2 = INT16_C (0x7fff); +int_least16_t c2max = INT_LEAST16_MAX; +int_least16_t c2min = INT_LEAST16_MIN; +int_least32_t c3 = INT32_C (0x7fffffff); +int_least32_t c3max = INT_LEAST32_MAX; +int_least32_t c3min = INT_LEAST32_MIN; +int_least64_t c4 = INT64_C (0x7fffffffffffffff); +int_least64_t c4max = INT_LEAST64_MAX; +int_least64_t c4min = INT_LEAST64_MIN; +uint_least8_t d1 = UINT8_C (0xff); +uint_least8_t d1max = UINT_LEAST8_MAX; +uint_least16_t d2 = UINT16_C (0xffff); +uint_least16_t d2max = UINT_LEAST16_MAX; +uint_least32_t d3 = UINT32_C (0xffffffff); +uint_least32_t d3max = UINT_LEAST32_MAX; +uint_least64_t d4 = UINT64_C (0xffffffffffffffff); +uint_least64_t d4max = UINT_LEAST64_MAX; +int_fast8_t e1 = INT_FAST8_MAX; +int_fast8_t e1min = INT_FAST8_MIN; +int_fast16_t e2 = INT_FAST16_MAX; +int_fast16_t e2min = INT_FAST16_MIN; +int_fast32_t e3 = INT_FAST32_MAX; +int_fast32_t e3min = INT_FAST32_MIN; +int_fast64_t e4 = INT_FAST64_MAX; +int_fast64_t e4min = INT_FAST64_MIN; +uint_fast8_t f1 = UINT_FAST8_MAX; +uint_fast16_t f2 = UINT_FAST16_MAX; +uint_fast32_t f3 = UINT_FAST32_MAX; +uint_fast64_t f4 = UINT_FAST64_MAX; +#ifdef INTPTR_MAX +intptr_t g = INTPTR_MAX; +intptr_t gmin = INTPTR_MIN; +#endif +#ifdef UINTPTR_MAX +uintptr_t h = UINTPTR_MAX; +#endif +intmax_t i = INTMAX_MAX; +uintmax_t j = UINTMAX_MAX; + +#include /* for CHAR_BIT */ +#define TYPE_MINIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) +#define TYPE_MAXIMUM(t) \ + ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) +struct s { + int check_PTRDIFF: + PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t) + && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t) + ? 1 : -1; + /* Detect bug in FreeBSD 6.0 / ia64. */ + int check_SIG_ATOMIC: + SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t) + && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t) + ? 1 : -1; + int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1; + int check_WCHAR: + WCHAR_MIN == TYPE_MINIMUM (wchar_t) + && WCHAR_MAX == TYPE_MAXIMUM (wchar_t) + ? 1 : -1; + /* Detect bug in mingw. */ + int check_WINT: + WINT_MIN == TYPE_MINIMUM (wint_t) + && WINT_MAX == TYPE_MAXIMUM (wint_t) + ? 1 : -1; + + /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */ + int check_UINT8_C: + (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1; + int check_UINT16_C: + (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1; + + /* Detect bugs in OpenBSD 3.9 stdint.h. */ +#ifdef UINT8_MAX + int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1; +#endif +#ifdef UINT16_MAX + int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1; +#endif +#ifdef UINT32_MAX + int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1; +#endif +#ifdef UINT64_MAX + int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1; +#endif + int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1; + int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1; + int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1; + int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1; + int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1; + int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1; + int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1; + int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1; + int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1; + int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1; + int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1; +}; + ]])], + [gl_cv_header_working_stdint_h=yes])]) + fi + if test "$gl_cv_header_working_stdint_h" = yes; then + STDINT_H= + else + dnl Check for , and for + dnl (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]) + + dnl Check for (missing in Linux uClibc when built without wide + dnl character support). + AC_CHECK_HEADERS_ONCE([wchar.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 ], [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: , and must be + included before . */ + #include + #include + #if HAVE_WCHAR_H + # include + # include + # include + #endif +]]) + +dnl gl_STDINT_TYPE_PROPERTIES +dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t +dnl of interest to stdint.in.h. +AC_DEFUN([gl_STDINT_TYPE_PROPERTIES], +[ + 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 exists, +# doesn't clash with , 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 +#include ], + [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 exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4 new file mode 100644 index 0000000..a40d418 --- /dev/null +++ b/m4/stdio_h.m4 @@ -0,0 +1,85 @@ +# stdio_h.m4 serial 9 +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_CHECK_NEXT_HEADERS([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_FOPEN=0; AC_SUBST([GNULIB_FOPEN]) + GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN]) + 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]) + GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM]) + GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE]) + 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]) + REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN]) + REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN]) + 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]) + HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) + HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) + REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) +]) + +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 ], +[#if defined __SL64 && defined __SCLE /* cygwin */ + /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making + fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and + it is easier to do a version check than building a runtime test. */ +# include +# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25) + choke me +# endif +#endif])], + [gl_cv_var_stdin_large_offset=yes], + [gl_cv_var_stdin_large_offset=no])]) +]) diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4 new file mode 100644 index 0000000..d9240b4 --- /dev/null +++ b/m4/stdlib_h.m4 @@ -0,0 +1,45 @@ +# stdlib_h.m4 serial 6 +dnl Copyright (C) 2007, 2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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_CHECK_NEXT_HEADERS([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_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX]) + GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) + GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) + GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) + GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) + GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) + GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV]) + GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV]) + GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD]) + GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV]) + dnl Assume proper GNU behavior unless another module says otherwise. + HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX]) + HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) + HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX]) + HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) + HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX]) + HAVE_SETENV=1; AC_SUBST([HAVE_SETENV]) + HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD]) + HAVE_UNSETENV=1; AC_SUBST([HAVE_UNSETENV]) + REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) + REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV]) + REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD]) + VOID_UNSETENV=0; AC_SUBST([VOID_UNSETENV]) +]) diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4 new file mode 100644 index 0000000..c38f40e --- /dev/null +++ b/m4/stpcpy.m4 @@ -0,0 +1,26 @@ +# stpcpy.m4 serial 6 +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 to declare stpcpy(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'. + AC_REQUIRE([AC_C_RESTRICT]) + + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_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..79c525c --- /dev/null +++ b/m4/strcase.m4 @@ -0,0 +1,44 @@ +# strcase.m4 serial 9 +dnl Copyright (C) 2002, 2005-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_STRCASE], +[ + gl_FUNC_STRCASECMP + gl_FUNC_STRNCASECMP +]) + +AC_DEFUN([gl_FUNC_STRCASECMP], +[ + AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) + AC_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_STRINGS_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..7c1273a --- /dev/null +++ b/m4/strchrnul.m4 @@ -0,0 +1,21 @@ +# strchrnul.m4 serial 6 +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 to declare strchrnul(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + 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..eb7d45a --- /dev/null +++ b/m4/strerror.m4 @@ -0,0 +1,47 @@ +# strerror.m4 serial 7 +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_REQUIRE([gl_FUNC_STRERROR_SEPARATE]) + if test $gl_cv_func_working_strerror = no; then + AC_LIBOBJ([strerror]) + AC_DEFINE_UNQUOTED([REPLACE_STRERROR], [$REPLACE_STRERROR], + [Define this to 1 if strerror is broken.]) + fi +]) + +# Like gl_FUNC_STRERROR, except prepare for separate compilation (no AC_LIBOBJ). +AC_DEFUN([gl_FUNC_STRERROR_SEPARATE], +[ + AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS]) + AC_CACHE_CHECK([for working strerror function], + [gl_cv_func_working_strerror], + [AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [#include + ], + [return !*strerror (-2);])], + [gl_cv_func_working_strerror=yes], + [gl_cv_func_working_strerror=no], + [dnl Assume crossbuild works if it compiles. + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [#include + ], + [return !*strerror (-2);])], + [gl_cv_func_working_strerror=yes], + [gl_cv_func_working_strerror=no])])]) + if test $gl_cv_func_working_strerror = no ; then + REPLACE_STRERROR=1 + gl_PREREQ_STRERROR + fi +]) + +# Prerequisites of lib/strerror.c. +AC_DEFUN([gl_PREREQ_STRERROR], [ + AC_CHECK_DECLS([strerror]) +]) diff --git a/m4/string_h.m4 b/m4/string_h.m4 new file mode 100644 index 0000000..766d7e9 --- /dev/null +++ b/m4/string_h.m4 @@ -0,0 +1,87 @@ +# Configure a GNU-like replacement for . + +# Copyright (C) 2007, 2008 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# 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_CHECK_NEXT_HEADERS([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_STRSTR=0; AC_SUBST([GNULIB_STRSTR]) + GNULIB_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR]) + GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R]) + GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN]) + GNULIB_MBSNLEN=0; AC_SUBST([GNULIB_MBSNLEN]) + GNULIB_MBSCHR=0; AC_SUBST([GNULIB_MBSCHR]) + GNULIB_MBSRCHR=0; AC_SUBST([GNULIB_MBSRCHR]) + GNULIB_MBSSTR=0; AC_SUBST([GNULIB_MBSSTR]) + GNULIB_MBSCASECMP=0; AC_SUBST([GNULIB_MBSCASECMP]) + GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP]) + GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP]) + GNULIB_MBSCASESTR=0; AC_SUBST([GNULIB_MBSCASESTR]) + GNULIB_MBSCSPN=0; AC_SUBST([GNULIB_MBSCSPN]) + GNULIB_MBSPBRK=0; AC_SUBST([GNULIB_MBSPBRK]) + GNULIB_MBSSPN=0; AC_SUBST([GNULIB_MBSSPN]) + GNULIB_MBSSEP=0; AC_SUBST([GNULIB_MBSSEP]) + GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R]) + GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR]) + GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL]) + 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_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]) + HAVE_DECL_STRERROR=1; AC_SUBST([HAVE_DECL_STRERROR]) + HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL]) + REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR]) + REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL]) + REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM]) + REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR]) + REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR]) +]) diff --git a/m4/strings_h.m4 b/m4/strings_h.m4 new file mode 100644 index 0000000..03ac182 --- /dev/null +++ b/m4/strings_h.m4 @@ -0,0 +1,33 @@ +# Configure a replacement for . + +# 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. + +AC_DEFUN([gl_HEADER_STRINGS_H], +[ + dnl Use AC_REQUIRE here, so that the default behavior below is expanded + dnl once only, before all statements that occur in other macros. + AC_REQUIRE([gl_HEADER_STRINGS_H_BODY]) +]) + +AC_DEFUN([gl_HEADER_STRINGS_H_BODY], +[ + AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) + gl_CHECK_NEXT_HEADERS([strings.h]) +]) + +AC_DEFUN([gl_STRINGS_MODULE_INDICATOR], +[ + dnl Use AC_REQUIRE here, so that the default settings are expanded once only. + AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS]) + GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 +]) + +AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS], +[ + dnl Assume proper GNU behavior unless another module says otherwise. + HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP]) + HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP]) +]) diff --git a/m4/strndup.m4 b/m4/strndup.m4 new file mode 100644 index 0000000..f7934ef --- /dev/null +++ b/m4/strndup.m4 @@ -0,0 +1,53 @@ +# strndup.m4 serial 14 +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 to declare strndup(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + 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 + #include ], [[ +#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..d8307ed --- /dev/null +++ b/m4/strnlen.m4 @@ -0,0 +1,31 @@ +# strnlen.m4 serial 9 +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 to declare strnlen(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + 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 doesn'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..6ed66c9 --- /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 defines strtoimax as a macro], + gl_cv_func_strtoimax_macro, + [AC_EGREP_CPP([inttypes_h_defines_strtoimax], [#include +#ifdef strtoimax + inttypes_h_defines_strtoimax +#endif], + gl_cv_func_strtoimax_macro=yes, + gl_cv_func_strtoimax_macro=no)]) + + if test "$gl_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..aef5b43 --- /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 defines strtoumax as a macro], + gl_cv_func_strtoumax_macro, + [AC_EGREP_CPP([inttypes_h_defines_strtoumax], [#include +#ifdef strtoumax + inttypes_h_defines_strtoumax +#endif], + gl_cv_func_strtoumax_macro=yes, + gl_cv_func_strtoumax_macro=no)]) + + if test "$gl_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..1bc08a1 --- /dev/null +++ b/m4/sys_stat_h.m4 @@ -0,0 +1,48 @@ +# sys_stat_h.m4 serial 6 -*- 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 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 + dnl instead. + AC_CHECK_DECLS([mkdir], + [], + [AC_CHECK_HEADERS([io.h])], + [#include ]) + 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_CHECK_NEXT_HEADERS([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..13ac576 --- /dev/null +++ b/m4/sys_time_h.m4 @@ -0,0 +1,57 @@ +# Configure a replacement for . + +# 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]) + gl_CHECK_NEXT_HEADERS([sys/time.h]) + + if test $ac_cv_header_sys_time_h = yes; then + HAVE_SYS_TIME_H=1 + else + HAVE_SYS_TIME_H=0 + fi + 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 + #endif + #include + ]], + [[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..bbd6973 --- /dev/null +++ b/m4/sysexits.m4 @@ -0,0 +1,43 @@ +# sysexits.m4 serial 4 +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_CHECK_NEXT_HEADERS([sysexits.h]) + AC_TRY_COMPILE([#include ], + [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([SYSEXITS_H]) +]) diff --git a/m4/system.m4 b/m4/system.m4 new file mode 100644 index 0000000..f0845af --- /dev/null +++ b/m4/system.m4 @@ -0,0 +1,29 @@ +# Configuration for paxutils/lib/system.h. + +# 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. + +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 pwd.h grp.h]) + + AC_CHECK_HEADERS([sys/buf.h], [], [], + [#if HAVE_SYS_PARAM_H +#include +#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..d42a635 --- /dev/null +++ b/m4/time_h.m4 @@ -0,0 +1,74 @@ +# Configure a more-standard replacement for . + +# 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_CHECK_NEXT_HEADERS([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 ], + [gl_cv_sys_struct_timespec_in_time_h], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + ]], + [[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 ], + [gl_cv_sys_struct_timespec_in_sys_time_h], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#include + ]], + [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], + [gl_cv_sys_struct_timespec_in_sys_time_h=yes], + [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) + if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then + SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 + 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..c871b56 --- /dev/null +++ b/m4/time_r.m4 @@ -0,0 +1,43 @@ +dnl Reentrant time functions like localtime_r. + +dnl Copyright (C) 2003, 2006, 2007, 2008 Free Software Foundation, Inc. +dnl This file is free software; the Free 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 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 ], + [/* We don't need to append 'restrict's to the argument types, + even though the POSIX signature has the 'restrict's, + since C99 says they can't affect type compatibility. */ + struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r; + if (ptr) return 0; + /* Check the return type is a pointer. On HP-UX 10 it is 'int'. */ + *localtime_r (0, 0);], + [gl_cv_time_r_posix=yes], + [gl_cv_time_r_posix=no])]) + if test $gl_cv_time_r_posix = yes; then + REPLACE_LOCALTIME_R=0 + else + REPLACE_LOCALTIME_R=1 + 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 ]) +]) 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..e8ccab1 --- /dev/null +++ b/m4/unistd_h.m4 @@ -0,0 +1,63 @@ +# unistd_h.m4 serial 11 +dnl Copyright (C) 2006-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl Written by Simon Josefsson, Bruno Haible. + +AC_DEFUN([gl_UNISTD_H], +[ + dnl Use AC_REQUIRE here, so that the default behavior below is expanded + dnl once only, before all statements that occur in other macros. + AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) + + gl_CHECK_NEXT_HEADERS([unistd.h]) + + AC_CHECK_HEADERS_ONCE([unistd.h]) + if test $ac_cv_header_unistd_h = yes; then + HAVE_UNISTD_H=1 + else + HAVE_UNISTD_H=0 + fi + AC_SUBST([HAVE_UNISTD_H]) +]) + +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_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON]) + 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_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE]) + GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN]) + 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_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE]) + HAVE_READLINK=1; AC_SUBST([HAVE_READLINK]) + HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP]) + HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON]) + HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R]) + HAVE_OS_H=0; AC_SUBST([HAVE_OS_H]) + HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H]) + REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN]) + REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR]) + REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD]) + REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE]) + REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN]) + 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 . + # 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 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 . +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 + #endif + #include + #ifdef HAVE_UTIME_H + #include + #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 . + 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 +#include +#include +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 +#include +#include +#include +#include +#include +#include +#include +#include + +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..536258c --- /dev/null +++ b/m4/vasnprintf.m4 @@ -0,0 +1,260 @@ +# vasnprintf.m4 serial 25 +dnl Copyright (C) 2002-2004, 2006-2008 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_VASNPRINTF], +[ + AC_CHECK_FUNCS_ONCE([vasnprintf]) + if test $ac_cv_func_vasnprintf = no; then + gl_REPLACE_VASNPRINTF + fi +]) + +AC_DEFUN([gl_REPLACE_VASNPRINTF], +[ + AC_CHECK_FUNCS_ONCE([vasnprintf]) + AC_LIBOBJ([vasnprintf]) + AC_LIBOBJ([printf-args]) + AC_LIBOBJ([printf-parse]) + AC_LIBOBJ([asnprintf]) + if test $ac_cv_func_vasnprintf = yes; then + AC_DEFINE([REPLACE_VASNPRINTF], 1, + [Define if vasnprintf exists but is overridden by gnulib.]) + fi + gl_PREREQ_PRINTF_ARGS + gl_PREREQ_PRINTF_PARSE + gl_PREREQ_VASNPRINTF + gl_PREREQ_ASNPRINTF +]) + +# 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_TYPE([ptrdiff_t], , + [AC_DEFINE([ptrdiff_t], [long], + [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) + ]) + AC_REQUIRE([gt_AC_TYPE_INTMAX_T]) +]) + +# Prerequisites of lib/vasnprintf.c. +AC_DEFUN([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) + dnl Use the _snprintf function only if it is declared (because on NetBSD it + dnl is defined as a weak alias of snprintf; we prefer to use the latter). + AC_CHECK_DECLS([_snprintf], , , [#include ]) +]) + +# 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_long_double" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], 1, + [Define if the vasnprintf implementation needs special code for + infinite 'long double' arguments.]) + ;; + esac + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive. +AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A], +[ + AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) + case "$gl_cv_func_printf_directive_a" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], 1, + [Define if the vasnprintf implementation needs special code for + the 'a' and 'A' directives.]) + AC_CHECK_FUNCS([nl_langinfo]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive. +AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F], +[ + AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) + case "$gl_cv_func_printf_directive_f" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], 1, + [Define if the vasnprintf implementation needs special code for + the 'F' directive.]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting the ' flag. +AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING], +[ + AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + case "$gl_cv_func_printf_flag_grouping" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], 1, + [Define if the vasnprintf implementation needs special code for the + ' flag.]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag. +AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST], +[ + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) + case "$gl_cv_func_printf_flag_leftadjust" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], 1, + [Define if the vasnprintf implementation needs special code for the + '-' flag.]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag. +AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO], +[ + AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) + case "$gl_cv_func_printf_flag_zero" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_FLAG_ZERO], 1, + [Define if the vasnprintf implementation needs special code for the + 0 flag.]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for supporting large precisions. +AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION], +[ + AC_REQUIRE([gl_PRINTF_PRECISION]) + case "$gl_cv_func_printf_precision" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], 1, + [Define if the vasnprintf implementation needs special code for + supporting large precisions without arbitrary bounds.]) + AC_DEFINE([NEED_PRINTF_DOUBLE], 1, + [Define if the vasnprintf implementation needs special code for + 'double' arguments.]) + AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], 1, + [Define if the vasnprintf implementation needs special code for + 'long double' arguments.]) + ;; + esac +]) + +# Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory +# conditions. +AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM], +[ + AC_REQUIRE([gl_PRINTF_ENOMEM]) + case "$gl_cv_func_printf_enomem" in + *yes) + ;; + *) + AC_DEFINE([NEED_PRINTF_ENOMEM], 1, + [Define if the vasnprintf implementation needs special code for + surviving out-of-memory conditions.]) + AC_DEFINE([NEED_PRINTF_DOUBLE], 1, + [Define if the vasnprintf implementation needs special code for + 'double' arguments.]) + AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], 1, + [Define if the vasnprintf implementation needs special code for + 'long double' arguments.]) + ;; + esac +]) + +# Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance. +AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS], +[ + AC_REQUIRE([gl_PREREQ_VASNPRINTF]) + gl_PREREQ_VASNPRINTF_LONG_DOUBLE + gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE + gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE + gl_PREREQ_VASNPRINTF_DIRECTIVE_A + gl_PREREQ_VASNPRINTF_DIRECTIVE_F + gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST + gl_PREREQ_VASNPRINTF_FLAG_ZERO + gl_PREREQ_VASNPRINTF_PRECISION + gl_PREREQ_VASNPRINTF_ENOMEM +]) + +# Prerequisites of lib/asnprintf.c. +AC_DEFUN([gl_PREREQ_ASNPRINTF], +[ +]) diff --git a/m4/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..70b1248 --- /dev/null +++ b/m4/wchar.m4 @@ -0,0 +1,54 @@ +dnl A placeholder for ISO C99 , 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 4 + +AC_DEFUN([gl_WCHAR_H], +[ + AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) + AC_CACHE_CHECK([whether is standalone], + [gl_cv_header_wchar_h_standalone], + [AC_COMPILE_IFELSE([[#include +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=wchar.h + fi + + dnl Prepare for creating substitute . + dnl Do it always: WCHAR_H may be empty here but can be set later. + dnl Check for (missing in Linux uClibc when built without wide + dnl character support). + AC_CHECK_HEADERS_ONCE([wchar.h]) + if test $ac_cv_header_wchar_h = yes; then + HAVE_WCHAR_H=1 + else + HAVE_WCHAR_H=0 + fi + AC_SUBST([HAVE_WCHAR_H]) + gl_CHECK_NEXT_HEADERS([wchar.h]) +]) + +AC_DEFUN([gl_WCHAR_MODULE_INDICATOR], +[ + dnl Use AC_REQUIRE here, so that the default settings are expanded once only. + AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) + GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1 +]) + +AC_DEFUN([gl_WCHAR_H_DEFAULTS], +[ + GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH]) + dnl Assume proper GNU behavior unless another module says otherwise. + HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH]) + REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH]) + 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 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 + 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..7483c4f --- /dev/null +++ b/m4/wctype.m4 @@ -0,0 +1,44 @@ +dnl A placeholder for ISO C99 , 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 NEXT_WCTYPE_H even if WCTYPE_H is empty, + dnl for the benefit of builds from non-distclean directories. + gl_CHECK_NEXT_HEADERS([wctype.h]) + HAVE_WCTYPE_H=1 + else + HAVE_WCTYPE_H=0 + fi + 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..04a9fc2 --- /dev/null +++ b/m4/wcwidth.m4 @@ -0,0 +1,85 @@ +# wcwidth.m4 serial 13 +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], +[ + AC_REQUIRE([gl_WCHAR_H_DEFAULTS]) + + dnl Persuade glibc to declare wcwidth(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + + AC_REQUIRE([gt_TYPE_WCHAR_T]) + AC_REQUIRE([gt_TYPE_WINT_T]) + + AC_CHECK_HEADERS_ONCE([wchar.h]) + AC_CHECK_FUNCS_ONCE([wcwidth]) + + AC_CHECK_DECLS([wcwidth], [], [], [ +/* AIX 3.2.5 declares wcwidth in . */ +#include +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include +]) + if test $ac_cv_have_decl_wcwidth != yes; then + HAVE_DECL_WCWIDTH=0 + fi + + if test $ac_cv_func_wcwidth = no; then + REPLACE_WCWIDTH=1 + else + dnl On MacOS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1. + dnl On OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1. + dnl This leads to bugs in 'ls' (coreutils). + AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales], + [gl_cv_func_wcwidth_works], + [ + AC_TRY_RUN([ +#include +/* AIX 3.2.5 declares wcwidth in . */ +#include +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include +#if !HAVE_DECL_WCWIDTH +extern +# ifdef __cplusplus +"C" +# endif +int wcwidth (int); +#endif +int main () +{ + if (setlocale (LC_ALL, "fr_FR.UTF-8") != NULL) + if (wcwidth (0x0301) > 0 || wcwidth (0x200B) > 0) + return 1; + return 0; +}], [gl_cv_func_wcwidth_works=yes], [gl_cv_func_wcwidth_works=no], + [gl_cv_func_wcwidth_works="guessing no"]) + ]) + case "$gl_cv_func_wcwidth_works" in + *yes) ;; + *no) REPLACE_WCWIDTH=1 ;; + esac + fi + if test $REPLACE_WCWIDTH = 1; then + AC_LIBOBJ([wcwidth]) + fi + + if test $REPLACE_WCWIDTH = 1 || test $HAVE_DECL_WCWIDTH = 0; then + WCHAR_H=wchar.h + fi +]) diff --git a/m4/wint_t.m4 b/m4/wint_t.m4 new file mode 100644 index 0000000..af5ed93 --- /dev/null +++ b/m4/wint_t.m4 @@ -0,0 +1,28 @@ +# wint_t.m4 serial 2 (gettext-0.17) +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 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: must be included before + . + BSD/OS 4.0.1 has a bug: , and must be included + before . */ +#include +#include +#include +#include + 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/xsize.m4 b/m4/xsize.m4 new file mode 100644 index 0000000..85bb721 --- /dev/null +++ b/m4/xsize.m4 @@ -0,0 +1,13 @@ +# xsize.m4 serial 3 +dnl Copyright (C) 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_XSIZE], +[ + dnl Prerequisites of lib/xsize.h. + AC_REQUIRE([gl_SIZE_MAX]) + AC_REQUIRE([AC_C_INLINE]) + AC_CHECK_HEADERS(stdint.h) +]) 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..1fdcf71 --- /dev/null +++ b/m4/xstrtol.m4 @@ -0,0 +1,13 @@ +#serial 10 +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_XSTRTOL], +[ + AC_LIBOBJ([xstrtol]) + AC_LIBOBJ([xstrtoul]) + AC_LIBOBJ([xstrtol-error]) +]) diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..fc16c2c --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,35 @@ +bg +cs +da +de +el +es +et +eu +fi +fr +ga +gl +hr +hu +id +it +ja +ko +ky +ms +nb +nl +pl +pt +pt_BR +ro +ru +sk +sl +sv +tr +uk +vi +zh_CN +zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..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 +# +# 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..bcf2401 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,62 @@ +# List of files which contain translatable strings. + +# Copyright (C) 1996, 1999, 2000, 2003, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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/closeout.c +lib/error.c +lib/getopt.c +lib/obstack.c +lib/human.c +lib/obstack.c +lib/openat-die.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 +lib/version-etc.c +lib/xalloc-die.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 +src/checkpoint.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..f32845d Binary files /dev/null and b/po/bg.gmo differ diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..b5d7e88 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,2737 @@ +# 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 , 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: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2006-11-23 22:40+0200\n" +"Last-Translator: Anton Zinoviev \n" +"Language-Team: Bulgarian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "неправилен аргумент %s за %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "двусмислен аргумент %s за %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Допустими аргументи са:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: параметърът ARGP_HELP_FMT изисква стойност" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: параметърът ARGP_HELP_FMT трябва да бъде положителен" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: непознат параметър ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Боклук в ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Аргументите, задължителните или незадължителни за дългите опции, са " +"съответно задължителни или незадължителни и за кратките опции." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "Използване:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " или: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [ОПЦИЯ...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "Използвайте „%s --help“ or „%s --usage“ за повече информация.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"Съобщавайте за програмни грешки на %s.\n" +"За грешки в българския превод на .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Непозната системна грешка" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "показва тази справка" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "показва кратко съобщение за използването" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "ИМЕ" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "посочва името на програмата" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "СЕК" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "спира за СЕК секунди (подразбира се 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "показва версията на програмата" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(ДЕФЕКТ В ПРОГРАМАТА) Не е известна версията!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Твърде много аргументи\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(ДЕФЕКТ В ПРОГРАМАТА) Опцията би трябвало да е била разпозната!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: опцията „%s“ е двусмислена\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: опцията „--%s“ не допуска аргумент\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: опцията „%c%s“ не допуска аргумент\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: опцията „%s“ изисква аргумент\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: непозната опция „--%s“\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: непозната опция „%c%s“\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: неправилна опция -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: неправилна опция -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: опцията изисква аргумент -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: опцията „-W %s“ е двусмислена\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: опцията „-W %s“ не допуска аргумент\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "паметта е изчерпана" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Не може да се смени работният каталог" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Премахва се началното „%s“ от имената на членове" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Премахва се началното „%s“ от целите на твърдите връзки" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Полага се „.“ вместо празно име на член" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "„" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "“" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[дДoOyY]" + +#: lib/rpmatch.c:72 +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 "Не може да се стартира отдалечена командна обвивка" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Общо записани байтове" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Общо прочетени байтове" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Общо изтрити байтове: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(канал)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Неправилна стойност на record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Не е посочено име на архив" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Не може да се проверяват архиви на стандартните вход/изход" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Архивът е компресиран. Използвайте опцията %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Не може да се актуализират компресирани архиви" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "В началото на лентата, край на изпълнението" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Твърде много грешки, край на изпълнението" + +#: src/buffer.c:678 +#, 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:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "Размер на записа = %lu блок" +msgstr[1] "Размер на записа = %lu блока" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" +"Невъзможно е връщане назад в архивния файл; той може да е нечитаем без опция " +"-i" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek не завърши при граница на запис" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: съдържа неправилен номер на том" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Препълване на номера на том" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Подгответе том №%d за %s и натиснете return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "EOF, когато се очакваше отговор от потребителя" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ВНИМАНИЕ: Архивът е незавършен" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Поражда вторична командна обвивка\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Извежда този списък\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Няма повече томове; изход.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Не е посочено име на файл. Опитайте отново.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Неправилна команда. Използвайте ? за справка.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "командата %s не успя" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" +"%s вероятно продължава в този том: заглавният запис съдържа отрязано име" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s не продължава с този том" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s е грешен размер (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Този том е извън поредицата" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Архивът не е етикетиран да отговаря на %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Томът %s не съответства на %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Изолиран блок от нули при %s" + +#: src/create.c:67 +#, fuzzy, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: каталогът е обозначен като кеш; не се архивира" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "" +"стойността на %s е извън границите %s на диапазона %s..%s; замества се с %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "стойността %s е извън границите %s на диапазона %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Генерират се отрицателни осмични заглавни записи" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: файловото име е твърде дълго (максимум %d); не е архивирано" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "" +"%s: файловото име е твърде дълго (не може да се раздели); не е архивирано" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: името на символната връзка е твърде дълго; не е архивирано" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: файлът е в друга файлова система; не се архивира" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Непознат файлов тип; файлът се пренебрегва" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Неархивирани връзки с %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: файлът не е променен; не се архивира" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: файлът е архив; не се архивира" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Файлът бе изтрит преди да бъде прочетен" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: каталогът е обозначен като кеш; не се архивира" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: файлът бе изменен по време на четене" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: гнездото се пренебрегва" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Каталогът бе преименуват от %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Каталогът бе преименуван" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Каталогът е нов" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Записано е неправилно време" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Неправилно време на промяна (секунди)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Неправилно време на промяна (наносекунди)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Неправилен номер на устройство" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Неправилен номер на i-възел" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Твърде дълго поле при четене на snapshot-файл" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Грешка при четене в snapshot-файл" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Неочакван край на snapshot-файл" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Неочаквана стойност на поле в snapshot-файл" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Липсва завършител на записа" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Грешен инкрементален файлов формат" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Неподдържана версия на инкрементален формат: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Лошо формиран dumpdir: очаква се „%c“, а вместо това има %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Лошо формиран dumpdir: „X“ е дублиран" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Лошо формиран dumpdir: празно име в „R“" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Лошо формиран dumpdir: „T“ не се предхожда от „R“" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Лошо формиран dumpdir: празно име в „T“" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "Лошо формиран dumpdir: очаква се „%c“, вместо това данните свършват" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Лошо формиран dumpdir: „X“ никога не се използва" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Не може да се създаде временен каталог, използвайки шаблона %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Каталогът не се изчиства: не може да се достъпи" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: каталогът е на друго устройство: не се изчиства" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Изтрива се %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "И двете опции „-%s“ и „-%s“ изискват стандартен вход" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Неправилен архивен формат" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Поискани са ГНУ-възможности при несъвместим архивен формат" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Вид основно действие:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "изрежда съдържанието на архив" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "извлича файлове от архива" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "създава нов архив" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "намира разликите между архива и файловата система" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "добавя файлове в края на архив" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "добавя само файлове, по-нови от копието в архива" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "прибавя tar-файлове към архива" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "трие файлове от архива (не при магнитни ленти!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "проверява етикета на тома и завършва" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Модификатори на действието:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "работи ефективно с разредени файлове" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "ГОЛЯМ[.МАЛЪК]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "определя версията на формата разредени файлове (влече --sparse)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "със стар формат ГНУ за инкрементално архивиране" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "ФАЙЛ" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "с новия формат на ГНУ за инкрем. архивиране" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "при нечитаеми файлове не завършва с грешка" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "N" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "архивът е с произволен достъп" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Регулиране заместването на файлове:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "след записа опитва да провери архива" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "изтрива файловете след като ги добави в архива" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "при извличане не замества съществуващи файлове" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" +"не замества съществуващи файлове, ако са по-нови от копията им в архива" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "при извличане замества съществуващи файлове" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "изтрива всеки файл преди да извлича върху него" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "изпразва йерархията преди извличане на каталог" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "запазва метаданните на съществуващи каталози" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"при извличане замества метаданните на съществуващи каталози (подразбира се)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Избор на изходен поток:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "извлича файловете на стандартния изход" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "подава с канал всеки извлечен файл към КОМАНДА" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "игнорира кода на завършване на породени процеси" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "счита за грешка всеки ненулев код на завършване на породен процес" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Подход спрямо файловите атрибути:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "прави ИМЕ да е собственик на добавените файлове" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "прави ИМЕ да бъде групата на добавените файлове" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "ДАТА-ИЛИ-ФАЙЛ" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "прави времето на промяна на добавяни файлове като ДАТА-ИЛИ-ФАЙЛ" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "ПРОМЕНИ" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "модифицира режима за достъп на добавени файлове" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "МЕТОД" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "не извлича времето на промяна на файловете" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "опитва да възстановява собствеността на файловете" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "извлича файловете от ваше име" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "използва числа вместо имена за потребител и група" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"възстановява точно (без umask) режима на достъп (подразбира се при " +"привилегирован потребител)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"прилага umask на потребителя при извличане на файлове (подразбира се при " +"обикновен потребител)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "файловете за извличане са сортирани според архива" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "същото като едновременно -p и -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"забавя настройката на времето на промяна и режима за достъп на извличаните " +"каталози докато извличането завърши" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "отменя ефекта на --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Избор на устройство и смяна:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "АРХИВ" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "използва архивния файл или устройство АРХИВ" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "архивният файл е локален дори при двуеточие" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "използва посочената КОМАНДА вместо rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "използва посочената КОМАНДА вместо rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "посочва устройство и гъстота" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "създава/извежда/извлича многотомен архив" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "смяна на лентата след запис на 1024 x N байта" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "изпълнява скрипт в края на всяка лента (влече -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "ползва от и обновява във ФАЙЛ номера на тома" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Блокуване на устройството:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "БЛОКОВЕ" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "БЛОКОВЕ x 512 байта в секунда" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "прави N-байтови записи, кратно на 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "пренебрегва блоковете от нули и продължава" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "преформира при четене блоковете (канали 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Избор на архивен формат:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "ФОРМАТ" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "създава архив с посочения формат" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "ФОРМАТ е някой от следните:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "стар формат tar, V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "формат на ГНУ при tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "формат на версия 1.13.x на tar на ГНУ" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "формат POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "формат POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "същото като pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "същото като --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "същото като --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "ключдума[[:]=стойност][,ключдума[[:]=стойност]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "управляващи ключови думи за pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "ТЕКСТ" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" +"създава архив с име на том ТЕКСТ; при извеждане или извличане сравнява името " +"на тома с ТЕКСТ" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Противоречащи си опции за компресиране" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "Не може да се пише към компресиращата програма" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "прекарва архива през bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "прекарва архива през gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "прекарва архива през compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "прекарва архива през gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "ПРОГ" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "прекарва архива през ПРОГ (трябва да приема -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Избор на локален файл:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" +"добавя посочения ФАЙЛ към архива (полезно е, ако името му започва с минус)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "КАТ" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "работи в каталога КАТ" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "взема имената за извличане или създаване от ФАЙЛ" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T чете имена, завършващи с нулев байт" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "декодира „\\“ във файловите имена на -T (подразб.)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "не декодира „\\“ във файловите имена на -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "ОБРАЗЕЦ" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "без файловете, отговарящи на ОБРАЗЕЦ" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "пропуска файловете, отговарящи на образци в ФАЙЛ" + +#: src/tar.c:631 +#, fuzzy +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "без каталози, обозначени като кеширащи" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "без автоматично влизане в подкаталозите" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "работи в рамките на локалната файлова система" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "влиза рекурсивно в подкаталозите (подразбира се)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "не маха „/“ в началото на файлови имена" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "следва симв. връзки; архивира сочените файлове" + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "следва симв. връзки; архивира сочените файлове" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "ЧЛЕН-ИМЕ" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "започва от файл с име ЧЛЕН-ИМЕ в архива" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "съхранява само файлове, по-нови от ДАТА-ИЛИ-ФАЙЛ" + +#: src/tar.c:664 +msgid "DATE" +msgstr "ДАТА" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "сравнява времето само ако данните са променени" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "МЕТОД" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "резервно копира съществуващи файлове с МЕТОД" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "НИЗ" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"резервно копира преди да трие, използвайки НИЗ вместо обичайния суфикс („~“, " +"освен ако не е бил сменен с променливата от обкръжението " +"SIMPLE_BACKUP_SUFFIX)" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Промени на файловите имена:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "при извличане маха N начални каталози от файловите пътеки" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "ИЗРАЗ" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" +"преобразува файловите имена, използвайки посочения ИЗРАЗ за замяна на sed" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Съпоставяне с файлови имена (влияе и на включващи, и на изключващи образци):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "пренебрегва разликата между големи/малки букви" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "съпоставянето с образците започва от началото на файловото име" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "съпоставянето започва след кой да е „/“ (подразбира се при изключване)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "отчита се разликата между малки и големи букви (подразбира се)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "ползва „*“ и „?“ (подразбира се за изключване)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "дословно низово сравнение" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "„/“ не пасва с „*“ и „?“" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "„/“ пасва с „*“ и „?“ (подразб. за изключване)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Извеждане на информация:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "подробно изрежда обработените файлове" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "извежда напредъка след всеки N-ти запис (подразбира се 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "съобщава, ако не всички твърди връзки са включени" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "СИГНАЛ" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "извежда времената по Гринуич" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "изпраща подробния изход във ФАЙЛ" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "показва номера на блок в архива с всяко съобщение" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "изисква потвърждение за всяко действие" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "показва подразбираното от tar" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" +"при извеждане или извличане изрежда всеки каталог, който се пропуска по " +"някаква причина" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "показва преобразуваните файлови имена в архива" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "НАЧИН" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" +"начин за цитиране на специални знаци; вж. по-долу за стойностите на НАЧИН" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "работи и със знаците от НИЗ като със специални" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "не работи със знаците от НИЗ като със специални" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Опции за съвместимост:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" +"при създаване е същото като --old-archive; при извличане е същото като --no-" +"same-owner" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Други опции:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "забранява някои потенциално опасни опции" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Не може да се използва повече от една опция „-Acdtrux“" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Противоречащи си опции за компресиране" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Непознато име на сигнал: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Не е открит еталлонният файл за дата" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Използва се %s вместо непознатия файлов формат за дата %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Опция %s: Датата „%s“ се разглежда като %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: файловият списък вече е прочетен" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: файловото име съдържа нулев байт" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Правилни аргументи за опциите --quoting-style са:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Този* tar подразбира следното:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Неправилен фактор за блокуване" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "Внимание: опцията -I не се поддържа. Може би имате предвид -j или -T?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Неправилна дължина на лента" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Повече от една ограничителна дата" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Неправилна версия на формат разредени файлове" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' не се поддържа на тази платформа" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "стойността на --checkpoint не е цяло число" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Неправилна група" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "На опция е подаден неправилен режим" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Неправилно число" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Неправилен собственик" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Неправилен размер на запис" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Размерът на запис трябва да е кратен на %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Неправилен брой елементи" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Позволява се само една опция --to-command" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Лошо образуван аргумент за гъстота: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Непозната гъстота: „%c“" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "Опциите „-[0-7][lmh]“ не се поддържат от *този* tar" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[ФАЙЛ]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Старата опция „%c“ изисква аргумент." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "без списък файлове опцията --occurrence е безсмислена" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "не може да се използва --occurrence при пожелания начин на работа" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Използването на много архивни файлове изисква опция „-M“" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Не може да се съчетават --listed-incremental с --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Не може да се проверяват многотомни архиви" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Не може да се проверяват компресирани архиви" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Не може да се използват многотомни компресирани архиви" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Не може да се съединяват компресирани архиви" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" +"опцията --pax-option може да се използва само при архиви във формат POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Страхлив отказ да се създава празен архив" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Опциите „-Aru“ са несъвместими с „-f -“" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Трябва да посочите поне една от опциите „-Acdtrux“" + +#: src/tar.c:2483 +#, 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; нечетен брой стойности" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Неправилна група" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Контролна точка при четене %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile борави с файловете с данни за тестовия пакет GNU paxutils.\n" +"ОПЦИИТЕ са:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Опции за създаването на файл:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "РАЗМЕР" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Създава файл с посочения РАЗМЕР" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Запис във файл ИМЕ вместо на стандартния изход" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Чете файловите имена от ФАЙЛ" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T чете имена, завършващи с нулев байт" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"Попълва файла с посочения ОБРАЗЕЦ. ОБРАЗЕЦ може да бъде „default“ или „zeros“" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Размер на блок за разреден файл" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"Генерира разреден файл. Останалата част от командния ред дава карта на файла." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "след записа опитва да провери архива" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Опции за файлови статистики:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" +"Извежда съдържанието на структурата stat за всеки файл. По подразбиране " +"ФОРМАТ е: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Опции за синхронизирано изпълнение:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Изпълнява посочената КОМАНДА. Полезно с --checkpoint и някоя от --cut, --" +"append, --touch" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" +"Изпълнява посоченото действие (вж. по-долу) до достигането на контролна " +"точка N" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Посочва дата за следващата опция --touch" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Извежда изпълнените контролни точки и кода на завършване на КОМАНДА" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Синхронизирано изпълнение на действията. Те се изпълняват когато се достигне " +"контролната точка с номер, посочен с --checkpoint." + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Отсича ФАЙЛ до размера, определен с предхождаща опция --length (подразбира " +"се 0)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" +"Добавя РАЗМЕР байтове към ФАЙЛ. РАЗМЕРът се определя от предхождаща опция --" +"length." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Обновява времето на достъп и промяна на FILE" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Изпълнява КОМАНДА" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Неправилен размер: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Номер извън допустимия диапазон: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Отрицателен размер: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "не успя stat(%s)" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Грешка при анализа на число до „%s“" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Непознат формат за дата" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[АРГУМ...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "Не може да се отвори „%s“" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Не може да се изпълни %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "името на файла съдържа нулев байт" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"не може да се създават разредени файлове на стандартния изход, използвайте " +"опцията --file" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "неправилна маска (до „%s“)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Непознато поле „%s“" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "не може да се смени времето на „%s“" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Командата завърши успешно\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Командата завърши с код %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Командата бе прекратена със сигнал %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Командата бе спряна със сигнал %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Командата генерира core\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Командата бе прекратена\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat изисква файлови имена" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "твърде много аргументи" + +#~ msgid "block size" +#~ 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 "[.]NUMBER" +#~ msgstr "[.]N" + +#~ 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 "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..1ef7960 Binary files /dev/null and b/po/cs.gmo differ diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..fd2405e --- /dev/null +++ b/po/cs.po @@ -0,0 +1,3033 @@ +# Czech translations for GNU tar +# Copyright (C) 1997 Free Software Foundation, Inc. +# Vladimir Michl , 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: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2001-09-01 10:55+0200\n" +"Last-Translator: Vladimir Michl \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument %s je pro %s neplatný" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument %s není pro %s jednoznaèný" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Platné argumenty jsou:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Pou¾ití: %s [PØEPÍNAÈ]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +" Chyby v programu oznamujte na adrese (pouze anglicky),\n" +"pøipomínky k pøekladu zasílejte na adresu (èesky).\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Neznámá systémová chyba" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: pøepínaè `%s' vy¾aduje argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: pøepínaè `%s' není jednoznaèný\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: pøepínaè `%s' vy¾aduje argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neznámý pøepínaè `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neznámý pøepínaè `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neznámý pøepínaè -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neznámý pøepínaè -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: pøepínaè vy¾aduje argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: pøepínaè `-W %s' není jednoznaèný\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "pamì» vyèerpána" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Pracovní adresáø nelze zmìnit" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Pracovní adresáø nelze uchovat" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Odstraòuji úvodní `%.*s' z názvù souborù" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Odstraòuji úvodní `%.*s' z názvù souborù" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Odstraòuji úvodní `%.*s' z názvù souborù" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Napsal François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Napsal François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Napsal François Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 (pouze anglicky),\n" +"pøipomínky k pøekladu zasílejte na adresu (è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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Celkem zapsáno bajtù: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Celkem zapsáno bajtù: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(roura)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Chybná hodnota pro velikost záznamu" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Název archivu nebyl zadán" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Stdin/Stdout archiv nelze ovìøit" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Komprimovaný archiv nelze aktualizovat" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Páska na zaèátku, konèím" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Pøíli¹ mnoho chyb, konèím" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: obsahuje neplatné èíslo svazku" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "U èísla svazku nastalo pøeteèení" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Místo u¾ivatelské odpovìdi byl zadán konec souboru" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "VAROVÁNÍ: Archiv je nekompletní" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Není nový svazek; konèím.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "pøíkaz `%s' selhal" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nepokraèuje na tomto svazku" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s je ¹patné délky (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Tento svazek není následníkem pøedchozího" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Pro vyhodnocení vzorku `%s' musí být archiv pojmenován" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Svazek %s neodpovídá vzorku %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "hodnota %s typu %s je mimo rozsah %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Generuji záporné osmièkové hlavièky" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: soubor není zmìnìn; neaktualizován" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Neznámý typ souboru; soubor ignorován" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " odkaz na %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: soubor není zmìnìn; neaktualizován" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: soubor je archiv; nearchivován" + +#: src/create.c:1573 +#, 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:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: soubor byl bìhem ètení zmìnìn" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: soket ignorován" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Adresáø byl pøejmenován" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Adresáø byl pøejmenován" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Adresáø je nový" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Neplatný èas souboru" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Zadána chybná práva" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Neplatné èíslo zaøízení" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Neplatné èíslo i-uzlu" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Neoèekávaný konec archivu" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Ma¾u %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Neplatná skupina" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU roz¹íøení po¾adovány na nekompatibilním formátu archivu" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Neoèekávaný konec archivu" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +#, fuzzy +msgid "append files to the end of an archive" +msgstr "%d bajtù smetí ma konci archivu ignorováno" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Chyba pøi zápise na standardní výstup" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Vícesvazkový archiv není mo¾né ovìøit" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Odporující si archivní formáty" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Odporující si kompresní pøepínaèe" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: soubor je archiv; nearchivován" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: soubor je archiv; nearchivován" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: soubor je archiv; nearchivován" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Pracovní adresáø nelze zmìnit" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Odstraòuji úvodní `%.*s' z názvù souborù" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Svazek %s neodpovídá vzorku %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Odporující si kompresní pøepínaèe" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " neznámý souborový typ %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Soubor ze kterého se má vzít datum a èas nebyl nalezen" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: soubor je archiv; nearchivován" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Neplatný poèet bajtù na záznam" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Neplatná délka pásky" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Více ne¾ jedeno poèáteèní datum" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Neplatná skupina" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Zadána chybná práva" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Neplatné èíslo i-uzlu" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Neplatný vlastník" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Chybná velikost záznamu" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Velikost záznamu musí být násobek %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Neplatná délka pásky" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Neznámý vzorek `%s'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Pøepínaè `%c' vy¾aduje argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Více archivaèních souborù vy¾aduje pøepínaè `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental a --newer nelze kombinovat" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Vícesvazkový archiv není mo¾né ovìøit" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Komprimovaný archiv nelze ovìøit" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Vícesvazkový komprimovaný archiv nelze vytvoøit" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Komprimovaný archiv nelze aktualizovat" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Vytvoøení prázdného archivu odmítnuto." + +#: src/tar.c:2343 +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:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Musíte zadat jeden z pøepínaèù `-Acdtrux'" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Neplatná skupina" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Ètení testovacího bodu %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Odporující si kompresní pøepínaèe" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Chyba pøi zápise na standardní výstup" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Neplatný èas souboru" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Èíslo i-uzlu mimo rozsah" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Neznámá systémová chyba" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "Neznámý vzorek `%s'" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Nelze zavøít" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "Neznámý vzorek `%s'" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Nelze zmìnit pozici v souboru na %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Potomek byl ukonèen signálem %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Rozdìlený název souboru--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "velikost bloku" + +#~ 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'" diff --git a/po/da.gmo b/po/da.gmo new file mode 100644 index 0000000..1d68606 Binary files /dev/null and b/po/da.gmo differ diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..bd9b073 --- /dev/null +++ b/po/da.po @@ -0,0 +1,3045 @@ +# Danish messages for GNU tar. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Keld Jørn Simonsen , 2000-2001. +# Claus Hindsgaul , 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.13.25\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-03-27 13:57+0100\n" +"Last-Translator: Keld Jørn Simonsen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ugyldigt argument %s for %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "flertydigt argument '%s' for %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Gyldige argumenter er:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Brug: %s [FLAG]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Rapportér fejl til .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Ukendt systemfejl" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: flag '%s' kræver et argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "skrivefejl" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flag '%s' er flertydigt\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flag '%s' tillader ikke et argument\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flag '%s' kræver et argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ukendt flag '--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ukendt flag '%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ulovligt flag -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt flag -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flag kræver et argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flag '-W %s' er flertydigt\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flag '-W %s' tillader ikke et argument\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "hovedlager opbrugt" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Kan ikke ændre arbejdskatalog" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Kan ikke gemme arbejdskatalog" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Fjerner indledende '%.*s' fra medlemsnavne" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Fjerner indledende '/' fra absolutte lænker" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Fjerner indledende '%.*s' fra medlemsnavne" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "'" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[jJyY]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Skrevet af François Pinard " + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Skrevet af François Pinard " + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Skrevet af François Pinard " + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Totalt antal byte skrevet: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Totalt antal byte skrevet: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(datakanal)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Ugyldig værdi for record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arkivnavn er ikke opgivet" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Kan ikke verificere standard-ind/standard-ud arkiver" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Kan ikke opdatere komprimerede arkiver" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Ved begyndelsen af båndet, afslutter nu" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "For mange fejl, afslutter" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: indeholder ugyldigt delarkivs-nummer" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Overløb på delarkiv-nummer" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Filafslutning hvor svar fra bruger var forventet" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ADVARSEL: Arkivet er ufuldstændigt" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Intet nyt delarkiv; afslutter.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "'%s'-kommando mislykkedes" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s fortsætter ikke i dette delarkiv" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s har forkert størrelse (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Dette delarkiv kommer ude af rækkefølge" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arkivet er ikke navngivet til at passe med %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volumenet '%s' stemmer ikke overens med %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Genererer negative oktale hoveder" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: file er uændret; ikke lagret" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Ukendt filtype; filen blev ignoreret" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " lænke til %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: file er uændret; ikke lagret" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: fil er det samme som arkivet; ikke lagret" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fil fjernet før vi læste den" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: Fil ændredes mens vi læste den" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: sokkel ignoreret" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Kataloget er blevet omdøbt" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Kataloget er blevet omdøbt" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Kataloget er nyt" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Ugyldigt tidsstempel" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Ugyldig modus angivet i flag" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Ugyldigt enhedsnummer" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Ugyldigt inode-nummer" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Uventet filslutning i arkivet" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "kan ikke oprette kataloget '%s'" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Sletter %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Flagene '-%s' and '-%s' vil begge have standard inddata" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: ugyldig gruppe" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU-funktioner forsøgt på inkompatibelt arkiv-format" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Uventet filslutning i arkivet" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +#, fuzzy +msgid "append files to the end of an archive" +msgstr "%d overflødige byte ignoreret ved slutningen på arkiv" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Fejl ved skrivning til standard uddata" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Kan ikke verificere arkiv som går over flere delarkiver" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Konflikt i flagene for arkiv-format" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Konflikt i komprimeringsflag" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: fil er det samme som arkivet; ikke lagret" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: fil er det samme som arkivet; ikke lagret" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: fil er det samme som arkivet; ikke lagret" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Kan ikke ændre arbejdskatalog" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Fjerner indledende '/' fra absolutte lænker" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Volumenet '%s' stemmer ikke overens med %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Du kan ikke angive mere end et af '-Acdtrux'-flagene" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Konflikt i komprimeringsflag" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " ukendt filtype %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Datofil ikke fundet" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Erstatter %s for ukendt dato-format %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: fil er det samme som arkivet; ikke lagret" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Ugyldig blokfaktor" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Ugyldig båndlængde" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mere end én grænse-dato" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: ugyldig gruppe" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Ugyldig modus angivet i flag" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Ugyldigt inode-nummer" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Ugyldig ejer" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Ugyldig poststørrelse" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Poststørrelse skal være deleligt med %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Ugyldig båndlængde" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Ukendt mønster '%s'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Gammelt flag '%c' behøver et argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Ved flere arkivfiler kræves '-M'-flaget" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Kan ikke kombinere --listed-incremental med --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Kan ikke verificere arkiv som går over flere delarkiver" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Kan ikke verificere komprimerede arkiver" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Kan ikke bruge komprimerede arkiver som går over flere delarkiver" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Kan ikke opdatere komprimerede arkiver" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Nægter stædigt at oprette et tomt arkiv" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Flagene '-Aru' er inkompatible med '-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Du skal angive et af '-Acdtrux'-flagene" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: ugyldig gruppe" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +#, fuzzy +msgid "write" +msgstr "skrivefejl" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Læser kontrolpunkt %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Konflikt i komprimeringsflag" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Fejl ved skrivning til standard uddata" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Ugyldigt tidsstempel" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Inode-nummer uden for område" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Ukendt systemfejl" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "kan ikke ændre ejer (chown) '%s'" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Kan ikke lukke" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "Ukendt mønster '%s'" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "kan ikke oprette kataloget '%s'" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Underproces døde med signal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Ødelagte filnavne--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "blokstørrelse" + +#~ 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 "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 "`%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..9f7bfbf Binary files /dev/null and b/po/de.gmo differ diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..1ac0444 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2652 @@ +# German messages for GNU tar. +# Copyright (C) 2001 Free Software Foundation, Inc. +# Ulrich Drepper , 1995? +# Karl Eichwalder , 1996 +# Christian Kirsch , 1996, 2001 +# Michael Piefel , 2003, 2006, 2007, 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-11 11:03+0100\n" +"Last-Translator: Michael Piefel \n" +"Language-Team: German \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ungültiges Argument %s für %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "mehrdeutiges Argument %s für %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Zulässige Argumente sind:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT-Parameter muss positiv sein" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: unbekannter ARGP_HELP_FMT-Parameter" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Müll in ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Aufruf:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " oder: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPTION...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, 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:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Unbekannter Systemfehler." + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "diese Hilfe ausgeben" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "eine kurze Benutzungsübersicht ausgeben" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NAME" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "den Programmnamen setzen" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEK" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "für SEK Sekunden hängenbleiben (Voreinst.: 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "Programmversion ausgeben" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMMFEHLER) Keine Version bekannt!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Zu viele Argumente\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMMFEHLER) Option hätte erkannt werden müssen!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "Schreibfehler" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Option „%s“ ist mehrdeutig\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: Option „--%s“ erlaubt keinen Parameter\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: Option „%s“ benötigt einen Parameter.\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: Unbekannte Option „--%s“\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: Unbekannte Option „%c%s“\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: Unzulässige Option -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: Ungültige Option -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: Option benötigt einen Parameter -- %c.\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Option „-W %s“ ist mehrdeutig.\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: Option „-W %s“ erlaubt keinen Parameter.\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "Kein Speicher mehr" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "Kann Arbeitsverzeichnis nicht aufzeichnen." + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "Konnde nicht zu ursprünglichem Arbeitsverzeichnis zurückkehren." + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Entferne führende „%s“ von Elementnamen" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Entferne führende „%s“ von Zielen harter Verknüpfungen" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Ersetze „.“ für leeren Elementnamen" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "„" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "“" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yYjJ]" + +#: lib/rpmatch.c:72 +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." + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"License GPLv3+: GNU GPL Version 3 oder später \n" +"Dies ist freie Software: Sie dürfen sie ändern und weiter verbreiten.\n" +"Es gibt KEINERLEI GARANTIE, so weit das Gesetz es erlaubt.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Geschrieben von %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Geschrieben von %s und %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Geschrieben von %s, %s und %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s\n" +"und %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s und %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s, %s und %s.\n" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s, %s, %s und %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s, %s, %s, %s\n" +"und %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s und %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Geschrieben von %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s und anderen.\n" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Gesamtzahl geschriebener Bytes" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Gesamtzahl gelesener Bytes" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Gesamtzahl gelöschter Bytes: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Ungültiger Wert für „record_size“." + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Kein Archivname angegeben" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Kann Archive auf Standard-Ein-/Ausgabe nicht prüfen." + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Archiv ist komprimiert. Benutzen Sie die Option %s." + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Kann komprimierte Archive nicht aktualisieren" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Am Anfang des Mediums, beende jetzt." + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Zu viele Fehler, beende." + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "„rmtlseek“ nicht an Recordgrenze angehalten" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: enthält ungültige Teil-Nummer." + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Teil-Nummer zu groß." + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Dateiende gefunden, Benutzereingabe erwartet" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "WARNUNG: Archiv unvollständig" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Shell in einem Unterprozess starten\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? diese Liste ausgeben\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Kein neues Medium; halte an.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Dateiname nicht angegeben. Versuchen Sie es noch einmal.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Ungültige Eingabe. Geben Sie „?“ für Hilfe ein.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "„%s“-Kommando gescheitert." + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "Dieser Teil ist keine Fortsetzung von %s." + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s hat die falsche Größe (%s != %s + %s)." + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Dieser Teil ist nicht an der Reihe." + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Kennzeichnung des Archivs passt nicht zu „%s“." + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Teil „%s“ passt nicht zu „%s“." + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Ein einzelner Nullblock bei %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: enthält eine „Cache-Verzeichnis“-Markierung %s; %s" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "Wert %s außerhalb des %s-Bereichs %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Erzeuge negative oktale Kopfteile" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: Verknüpfungsname ist zu lang; nicht gesichert." + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "Inhalt nicht gesichert" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Unbekannter Dateityp; Datei ignoriert." + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Fehlende Verküpfungen zu %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "Datei %s ist unverändert; nicht gesichert." + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s ist das Archiv; nicht gesichert." + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Datei gelöscht, bevor sie gelesen wurde." + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "Verzeichnis nicht gesichert" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: Datei hat sich beim Lesen geändert." + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: Socket ignoriert" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Verzeichnis wurde von „%s“ umbenannt." + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Verzeichnis wurde umbenannt." + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "Verzeichnis „%s“ ist neu." + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Ungültiges Datum" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Ungültige Änderungszeit (Sekunden)." + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Ungültige Änderungszeit (Nanosekunden)." + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Ungültige Gerätenummer" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Ungültige Inode-Nummer" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Feld zu lang beim Lesen der Schnappschussdatei" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Lesefehler in Schnappschussdatei" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Unerwartetes Dateiende im Schnappschussdatei." + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Unerwarteter Feldwert in Schnappschussdatei" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Fehlender Record-Abschluss" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "unzulässiges inkrementelles Dateiformat" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Nicht unterstützte Version des inkrementellen Formats: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Fehlgeformtes Verzeichnis für Dump: „%c“ erwartet, aber %#3o gefunden" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Fehlgeformtes Verzeichnis für Dump: „X“ dupliziert" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Fehlgeformtes Verzeichnis für Dump: leerer Name in „R“" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Fehlgeformtes Verzeichnis für Dump: „T“ folgt nicht „R“" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Fehlgeformtes Verzeichnis für Dump: leerer Name in „T“" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Fehlgeformtes Verzeichnis für Dump: „X“ nie benutzt" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Kann kein temporäres Verzeichnis mit der Schablone %s anlegen" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Entferne Verzeichnis nicht: kann nicht zugreifen" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Lösche %s.\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Die beiden Optionen „-%s“ und „-%s“ verlangen Standard-Eingabe." + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Ungültiges Archivformat" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU-Erweiterungen bei einem inkompatiblen Archiv-Format verlangt." + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Hauptsächlicher Arbeitsmodus:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "den Inhalt eines Archivs auflisten" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "Dateien aus einem Archiv extrahieren" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "ein neues Archiv anlegen" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "Unterschiede zwischen Archiv und Dateisystem suchen" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "Dateien hinten an das Archiv anfügen" + +#: src/tar.c:384 +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:386 +msgid "append tar files to an archive" +msgstr "tar-Dateien an ein Archiv anfügen" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "aus dem Archiv löschen (nicht auf Magnetband!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "den Archiv-Teil-Namen überprüfen und beenden" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Feineinstellungen:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "löchrige Dateien („sparse files“) effizient behandeln" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAJOR[.MINOR]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "zu benutzende Version des Sparse-Formats setzen (impliziert --sparse)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "inkrementelle Sicherung im alten GNU-Format" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "DATEI" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "inkrementelle Sicherung im neuen GNU-Format" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "kein Abbruch mit Existatus!=0 bei unlesbaren Dateien" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "ZAHL" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "im Archiv kann positioniert werden" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Steuerung des Überschreibens:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "Archiv nach dem Schreiben prüfen" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "Dateien nach dem Hinzufügen zum Archiv löschen" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "vorhandene Dateien beim Extrahieren nicht überschreiben" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "vorhandene Dateien beim Extrahieren überschreiben" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "zu überschreibende Dateien vor dem Extrahieren löschen" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" +"Verzeichnishierarchien rekursiv vor dem Extrahieren eines Verzeichnisses " +"löschen" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "Metadaten existierender Verzeichnisse erhalten" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"Metadaten existierender Verzeichnisse beim Extrahieren überschreiben " +"(Voreinstellung)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Wahl des Ausgabestroms:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "Dateien auf die Standardausgabe extrahieren" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "BEFEHL" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "extrahierte Dateien an ein anderes Programm weiterreichen" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "Exitstatus der Kinder ignorieren" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "Exitstatus!=0 von Kindern als Fehler ansehen" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Behandlung der Datei-Attribute:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "Eigentümer für hinzugefügte Dateien auf NAME setzen" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "Gruppe für hinzugefügte Dateien auf NAME setzen" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATUM-ODER-DATEI" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "ÄNDERUNGEN" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "den (symbolischen) Modus ÄNDERUNGEN für hinzugefügte Dateien erzwingen" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METHODE" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "die geänderte Zeit nicht extrahieren" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" +"versuchen, die Dateien mit denselben Eigentumsverhältnisse zu extrahieren" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "Dateien als aktueller Nutzer extrahieren" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "immer Zahlen für Nutzer-/Gruppennamen verwenden" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"Informationen über Dateizugriffsrechte mit extrahieren (Voreinstellung für " +"Root)" + +#: src/tar.c:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "zu entpackende Dateinamen wie im Archiv sortieren" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "wie -p und -s zusammen" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "den Effekt von --delay-directory-restore aufheben" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Geräteauswahl und -umschaltung:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIV" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "Archivdatei oder Gerät ARCHIV benutzen" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "statt „rmt“ den gegebenen BEFEHL benutzen" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "statt „rsh“ den entfernten BEFEHL benutzen" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "Laufwerk und Schreibdichte angeben" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "mehrteiliges Archiv anlegen/listen/extrahieren" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "Medium wechseln, wenn ZAHL × 1024 Bytes geschrieben wurden" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "am Ende jedes Mediums das Skript ausführen (impliziert -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "Teil-Nummer in DATEI benutzen/aktualisieren" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blockung des Gerätes:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLÖCKE" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLÖCKE × 512 Bytes pro Record" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "ZAHL Bytes pro Record, Vielfaches von 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "Blöcke mit Nullen im Archiv ignorieren (heißt EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "erneut Blocken beim Lesen (für 4.2BSD‐Pipes)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Auswahl des Archiv-Formats:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "Archiv mit dem gegebenen Format anlegen" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT ist eines der folgenden:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "altes V7-tar-Format" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU-Format wie mit tar <=1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU-tar-1.13.x-Format" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "Format von POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "Format von POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "wie pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "wie --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "wie --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "Schlüsselwort[[:]=Wert][,Schlüsselwort[[:]=Wert]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "Pax-Schlüsselwörter steuern" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEXT" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "Kompressionsoptionen:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "Archiverweiterung nehmen, um Kompressionsprogramm zu bestimmen" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "Archiv durch bzip2 filtern" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "Archiv durch gzip filtern" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "Archiv durch compress filtern" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "Archiv durch lzma filtern" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "durch PROG filten (muss -d akzeptieren)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Auswahl der lokalen Dateien:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "VERZEICHNIS" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "zu VERZEICHNIS wechseln" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "Namen der zu bearbeitenden Dateien aus DATEI lesen" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T liest null-terminierte Namen, verbiete -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"Dateinamen, die mit -T gelesen werden, von Zitat befreien (Voreinstellung)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "Dateinamen, die mit -T gelesen werden, nicht von Zitat befreien" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MUSTER" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "Dateien auslassen, auf die MUSTER passt" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "Dateien auslassen, auf die in DATEI angegebene Muster passen" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"Inhalt von Verzeichnissen auslassen, die CACHEDIR.TAG enthalten, außer der " +"Markierungsdatei selbst" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" +"alles unterhalb von Verzeichnissen auslassen, die CACHEDIR.TAG enthalten" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "Verzeichnisse auslassen, die CACHEDIR.TAG enthalten" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"Inhalt von Verzeichnissen auslassen, die DATEI enthalten, außer DATEI selbst" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "alles unterhalb von Verzeichnissen auslassen, die DATEI enthalten" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "Verzeichnisse auslassen, die DATEI enthalten" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "Verzeichnisse von Versionskontrollsystemen auslassen" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "automatischen Abstieg in Vezeichnisse vermeiden" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "beim Anlegen eines Archivs im lokalen Dateisystem bleiben" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "in Verzeichnisse absteigen (Voreinstellung)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "führende „/“-Zeichen in den Dateinamen erhalten" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" +"symbolischen Verknüpfungen folgen; die Dateien archivieren und abspeichern, " +"auf die sie zeigen" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"harten Verknüpfungen folgen; die Dateien archivieren und abspeichern, auf " +"die sie sich beziehen" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "ELEMENT-NAME" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "mit ELEMENT-NAME im Archiv beginnen" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "nur Dateien ablegen, die neuer als DATUM-ODER-DATEI sind" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATUM" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "Datum und Zeit nur überprüfen, wenn Daten geändert wurden" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "KONTROLLE" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "Sicherung vor dem Entfernen, wähle Versions-KONTROLLE" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "ZEICHENKETTE" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Dateinamentransformationen:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "ZAHL führende Komponenten beim Extrahieren von Dateinamen entfernen" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "AUSDRUCK" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "den sed-AUSDRUCK zur Dateinamentransformation benutzen" + +#: src/tar.c:684 +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:687 +msgid "ignore case" +msgstr "Groß-/Kleinschreibung ignorieren" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "Muster am Dateinamensanfang ausrichten" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "Muster passen nach jedem „/“ (Voreinstellung beim Ausschluss)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "Groß-/Kleinschreibung beachten (Voreinstellung)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "Muster benutzen (Voreinstellung für Ausschluss)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "Zeichenketten sind buchstabengetreu" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "Jokerzeichen passen nicht auf „/“" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "Jokerzeichen passen auf „/“ (Voreinstellung für Ausschluss)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informationen:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "bearbeitete Dateien ausführlich listen" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" +"Fortschrittsnachrichten bei jedem ZAHLten Record (Voreinstellung 10) anzeigen" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "AKTION" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "AKTION bei jedem Kontrollpunkt ausführen" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" +"eine Nachricht ausgeben, wenn nicht alle Verknüpfungen abgespeichert werden" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "Dateiänderungszeiten in UTC anzeigen" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "ausführliche Ausgabe in DATEI schreiben" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "bei jeder Nachricht die Blocknummer innerhalb des Archivs mit anzeigen" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "für jede Aktion um Bestätigung bitten" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "Voreinstellungen von tar anzeigen" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "Datei- oder Archivnamen nach der Transformation anzeigen" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STIL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "zusätzliche Zeichen aus ZEICHENKETTE zitieren" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "Zeichen aus ZEICHENKETTE nicht zitieren" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Kompatibilitätsoptionen:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Weitere Optionen:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "möglicherweise schädliche Optionen deaktivieren" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Von den Optionen „-Acdtrux“ ist nur _eine_ erlaubt." + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Kompressionsoptionen schließen sich gegenseitig aus." + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Unbekannter Signalname: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Datumsdatei nicht gefunden" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Ersetze %s für unbekanntes Datumsformat %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Option %s: Behandle Datum „%s“ als %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: Dateiliste schon gelesen" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: gelesener Dateiname enthält ein NULL-Zeichen" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Gültige Argumente für die Option --quoting-style sind:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Dieses* „tar“ hat als Voreinstellung:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Ungültige Blockgröße" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Ungültige Bandlänge" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mehr als ein Datum angegeben." + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Ungültiger Wert für Sparse-Version" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' wird auf dieser Plattform nicht unterstützt" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "Wert für --checkpoint ist keine ganze Zahl" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Ungültige Gruppe" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Ungültige Zugriffsrechte angegeben." + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Ungültige Zahl" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Ungültiger Benutzer" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Ungültiger Wert für Recordgröße." + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Die Recordgröße muss ein Vielfaches von %d sein." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Ungültige Elementanzahl" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Nur eine Option --to-command erlaubt" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Fehlgeformtes Dichteargument: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Unbekannte Dicht: „%c“" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[DATEI]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Die alte Option „%c“ benötigt einen Parameter." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence ist ohne Dateiliste bedeutungslos" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" +"--occurrence kann im angeforderten Operationsmodus nicht benutzt werden" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Mehrere Archivdateien verlangen die Option „-M“." + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental kann nicht mit --newer benutzt werden" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Kann mehrteilige Archive nicht prüfen." + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Kann komprimierte Archive nicht prüfen" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Kann keine mehrteiligen komprimierten Archive verwenden." + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Kann komprimierte Archive nicht aneinanderhängen" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option kann nur mit POSIX-Archiven benutzt werden" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Anlegen eines leeren Archivs wird feige verweigert." + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Die Optionen „-Aru“ sind nicht kompatibel mit „-f -“." + +#: src/tar.c:2432 +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:2483 +#, 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öhnliche Anzahl von " +"Werten" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: kein gültiger Zeitüberschreitungswert" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: unbekannte Kontrollpunkt-Aktion" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "lesen" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "schreiben" + +#. 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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Lese-Kontrollpunkt %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Optionen beim Anlegen von Dateien:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "GRÖßE" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Datei der gegebenen GRÖßE anlegen" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "in Datei NAME anstelle der Standardausgabe schreiben" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Dateinamenlist aus DATEI lesen" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T liest null-terminierte Namen" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Größe eines Blocks für löchrige Dateien" + +# „map“: Karte, Abbildung? +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "POSITION" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "vor dem Schreiben zur gegebenen Position springen" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Dateistatistikoptionen:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Optionen für synchrone Ausführung:" + +#: tests/genfile.c:163 +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:166 +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:169 +msgid "Set date for next --touch option" +msgstr "Datum für nächste „--touch“-Operation setzen" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "ausgeführte Kontrollpunkte und Beendigungsstatus von BEFEHL anzeigen" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Aktionen für synchrone Ausführung. Diese werden beim Erreichen des " +"Kontrollpunkts, der mit der Option --checkpoint gesetzt wurde, ausgeführt." + +#: tests/genfile.c:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "Zugriffs- und Änderungszeiten der DATEI neu setzen" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "BEFEHL ausführen" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Ungültige Größe: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Zahl außerhalb des zulässigen Bereichs: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negative Größe: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) fehlgeschlagen" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Fehler beim Parser der Zahl in der Nähe von „%s“" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Unbekanntes Datumsformat" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENTE...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "kann „%s“ nicht öffnen" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "kann nicht positionieren" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "Dateiname enthält Null-Zeichen" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "inkorrekte Maske (nahe „%s“)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "unbekannte Feld „%s“" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "kann an „%s“ keine Zeit setzen" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Befehl erfolgreich ausgeführt\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Befehl schlug mit Beendigungsstatus %d fehl.\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Befehl beendete sich bei Signal %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Befehl hieltb bei Signal %d an\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Befehl erzeugte einen Core-Dump\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Befehl beendet\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat erfordert Dateinamen" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "zu viele Argumente" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]ZAHL" + +#~ msgid "block size" +#~ msgstr "Blockgröße" + +#~ 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..5501f19 Binary files /dev/null and b/po/el.gmo differ diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..e9e53f0 --- /dev/null +++ b/po/el.po @@ -0,0 +1,3051 @@ +# Greek translation of tar +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. +# Μπαλάσκας Ευάγγελος (Balaskas Euaggelos) , 2004. +# Simos Xenitellis , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.13.25 \n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2004-03-08 14:44+0200\n" +"Last-Translator: Μπαλάσκας Ευάγγελος (Balaskas Euaggelos) \n" +"Language-Team: Greek \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "άκυρο όρισμα %s για %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "αμφιλεγόμενο όρισμα %s για %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Έγκυρα ορίσματα είναι:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Χρήση: %s [ΕΠΙΛΟΓΉ]...\n" + +#: lib/argp-help.c:1682 +#, fuzzy, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "Προσπαθήστε `%s --help' για περισσότερες πληροφορίες.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Αναφορά σφαλμάτων στο .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Άγνωστο σφάλμα συστήματος" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: η επιλογή `%s' απαιτεί όρισμα\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: η επιλογή`%s' είναι αμφιλεγόμενη\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: η επιλογή `--%s' δεν επιτρέπει όρισμα\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: η επιλογή `%c%s' δεν επιτρέπει όρισμα\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: η επιλογή `%s' απαιτεί όρισμα\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: μη αναγνωρίσιμη επιλογή `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: μη αναγνωρίσιμη επιλογή `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: παράνομη επιλογή -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: άκυρη επιλογή -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: η επιλογή απαιτεί όρισμα -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: η επιλογή `-W %s' είναι αμφιλεγόμενη\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: η επιλογή `-W %s' δεν επιτρέπει όρισμα\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "η μνήμη εξαντλήθηκε" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Δεν είναι δυνατή η τροποποίηση του τρέχοντος καταλόγου" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Απομακρύνονται τα αρχικά `%.*s' από τα ονόματα των μελών" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Απομακρύνονται τα αρχικά `%.*s' από τα ονόματα των μελών" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Απομακρύνονται τα αρχικά `%.*s' από τα ονόματα των μελών" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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 "Δεν είναι δυνατή η εκτέλεση απομακρυσμένου κελύφους (φλοιού)" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "" +"Γράφτηκε από τον F. Pinard.\n" +"Μεταφράστηκε από τον Μπαλάσκα Ευάγγελο." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "" +"Γράφτηκε από τον F. Pinard.\n" +"Μεταφράστηκε από τον Μπαλάσκα Ευάγγελο." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" +"Γράφτηκε από τον F. Pinard.\n" +"Μεταφράστηκε από τον Μπαλάσκα Ευάγγελο." + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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" +"Αναφορά σφαλμάτων στο .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Συνολικά byte που γράφτηκαν: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Συνολικά byte που γράφτηκαν: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(σωλήνωση)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Άκυρη τιμή για record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Δεν δόθηκε όνομα αρχειοθήκης" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "" +"Δεν είναι δυνατή η επαλήθευση των κανονικών εισόδων/εξόδων της αρχειοθήκης" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Δεν είναι δυνατή η ανανέωση των συμπιεσμένων αρχειοθηκών" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Στην αρχή της ταινίας, τερματισμός τώρα" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Πάρα πολλά σφάλματα, τερματισμός" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: περιέχει άκυρο αριθμό τόμου" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Υπερχήλιση αριθμού τόμου" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Προετοίμασε τον τόμο #%d για %s και πάτα το πλήκτρο επιστροφής γραμμής" + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "EOF (Τέλος Αρχείου) ενώ η απάντηση του χρήστη αναμενότανε" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ΠΡΟΕΙΔΟΠΟΊΗΣΗ: Η αρχειοθήκη είναι ημιτελής" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Κανένας νέος τόμος; έξοδος\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "`%s' η εντολή απέτυχε" + +#: src/buffer.c:1199 +#, fuzzy, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s δεν συνεχίζεται σε αυτόν τον τόμο" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s δεν συνεχίζεται σε αυτόν τον τόμο" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s είναι το εσφαλμένο μέγεθος (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Αυτός ο τόμος είναι εκτός συνέχειας" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Η αρχειοθήκη δεν έχει ετικέτα για ταίριασμα %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Ο τόμος %s δεν ταιριάζει %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "η τιμή %s είναι εκτός του %s εύρος %s..%s; αντικαταστήθηκε από %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "η τιμή %s είναι εκτός του %s εύρους %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Παράχθηκαν αρνητικές οκταδικές επικεφαλίδες" + +#: src/create.c:624 src/create.c:687 +#, fuzzy, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: δεν μπορεί να τροποποιηθεί το αρχείο; δεν αποθηκεύτηκε" + +#: src/create.c:634 +#, fuzzy, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s: δεν μπορεί να τροποποιηθεί το αρχείο; δεν αποθηκεύτηκε" + +#: src/create.c:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: δεν μπορεί να τροποποιηθεί το αρχείο; δεν αποθηκεύτηκε" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: το αρχείο είναι σε διαφορετικό σύστημα αρχείων; δεν αποθηκεύτηκε" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Άγνωστος τύπος αρχείου; το αρχείο αγνοήθηκε" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " σύνδεσμος σε %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: δεν μπορεί να τροποποιηθεί το αρχείο; δεν αποθηκεύτηκε" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: το αρχείο είναι η αρχειοθήκη; δεν αποθηκεύτηκε" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Το αρχείο απομακρύνθηκε πριν το διαβάσουμε" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: αρχείο τροποποιήθηκε κατά την ανάγνωση" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: η υποδοχή αγνοήθηκε" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Ο κατάλογος έχει μετονομαστεί" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Ο κατάλογος έχει μετονομαστεί" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Ο κατάλογος είναι καινούριος" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Άκυρη ένδειξη χρόνου" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Άκυρη κατάσταση δόθηκε σε επιλογή" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Άκυρος αριθμός συσκευής" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Άκυρος αριθμός i-κόμβου" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Μη αναμενόμενο EOF (Τέλος Αρχείου) στην αρχειοθήκη" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Δεν είναι δυνατή η δέσμευση μνήμης για τον συντελεστή ομαδοποίησης %d" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, fuzzy, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: το αρχείο είναι σε διαφορετικό σύστημα αρχείων; δεν αποθηκεύτηκε" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Διαγραφή %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Οι επιλογές `-%s' και `-%s' απαιτούν κανονική είσοδο" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Άκυρη ομάδα" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Τα χαρακτηριστικά GNU απαιτούν μη συμβατή διαμόρφωση αρχειοθήκης" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Μη αναμενόμενο EOF (Τέλος Αρχείου) στην αρχειοθήκη" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Σφάλμα κατά την εγγραφή στην κανονική έξοδο" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Δεν είναι δυνατή η επαλήθευση πολλαπλών αρχειοθηκών" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Συγκρουόμενες επιλογές διαμόρφωσης αρχειοθήκης" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Συγκρουόμενες επιλογές συμπίεσης" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: το αρχείο είναι η αρχειοθήκη; δεν αποθηκεύτηκε" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: το αρχείο είναι η αρχειοθήκη; δεν αποθηκεύτηκε" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: το αρχείο είναι η αρχειοθήκη; δεν αποθηκεύτηκε" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Δεν είναι δυνατή η τροποποίηση του τρέχοντος καταλόγου" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Απομακρύνονται τα αρχικά `%.*s' από τα ονόματα των μελών" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Ο τόμος %s δεν ταιριάζει %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Ίσως δεν καθορίσατε παραπάνω από μία επιλογή `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Συγκρουόμενες επιλογές συμπίεσης" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " άγνωστος τύπος αρχείου %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Το αρχείο ημερομηνίας δεν βρέθηκε" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Αντικατάσταση %s για άγνωστη διαμόρφωση ημερομηνίας %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: το αρχείο είναι η αρχειοθήκη; δεν αποθηκεύτηκε" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Άκυρος συντελεστής ομαδοποίησης" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" +"Προειδοποίηση: η -I επιλογή δεν υποστηρίζεται; ίσως εννοούσατε την -j ή την -" +"T;" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Άκυρο μέγεθος ταινίας" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Παραπάνω από ένα όριο ημερομηνίας" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Άκυρη ομάδα" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Άκυρη κατάσταση δόθηκε σε επιλογή" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Άκυρος αριθμός i-κόμβου" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Άκυρος ιδιοκτήτης" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Άκυρο μέγεθος εγγραφής" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Το μέγεθος της εγγραφής πρέπει να είναι πολλαπλάσιο του %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Άκυρο μέγεθος ταινίας" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "" +"Οι επιλογές `-[0-7][lmh]' δεν υποστηρίζονται από *αυτήν* την εντολή tar" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Παλιά επιλογή `%c' απαιτεί όρισμα." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Πολλαπλά αρχεία αρχειοθηκών απαιτούν την επιλογή `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Δεν είναι δυνατός ο συνδυασμός --listed-incremental με --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Δεν είναι δυνατή η επαλήθευση πολλαπλών αρχειοθηκών" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Δεν είναι δυνατή η επαλήθευση των συμπιεσμένων αρχειοθηκών" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Δεν είναι δυνατή η χρήση πολλαπλών συμπιεσμένων αρχειοθηκών" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Δεν είναι δυνατή η ανανέωση των συμπιεσμένων αρχειοθηκών" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Αρνούμαι δειλά στη δημιουργία μίας κενής αρχειοθήκης" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Οι επιλογές `-Aru' δεν είναι συμβατές με `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Πρέπει να καθορίσεις μία από τις επιλογές `-Acdtrux'" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Άκυρη ομάδα" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Ανάγνωση σημείου ελέγχου %d" + +#: tests/genfile.c:111 +#, fuzzy +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "Παράγει αρχεία δεδομένων για δοκιμαστική πλατφόρμα GNU tar.\n" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "Συγκρουόμενες επιλογές συμπίεσης" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Σφάλμα κατά την εγγραφή στην κανονική έξοδο" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Άκυρη ένδειξη χρόνου" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Ο αριθμός του i-κόμβου είναι εκτός εύρους" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Άγνωστο σφάλμα συστήματος" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Δεν είναι δυνατό το κλείσιμο" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " άγνωστος τύπος αρχείου %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Δεν είναι δυνατή η αναζήτηση σε %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Η θυγατρική διεργασία τερματίστηκε με το σήμα %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Κατακερματισμένα ονόματα αρχείων--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ 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" 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..39d4386 Binary files /dev/null and b/po/es.gmo differ diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..2677be2 --- /dev/null +++ b/po/es.po @@ -0,0 +1,3814 @@ +# Mensajes en español para GNU tar. +# Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +# Federico Rivas , 1997. +# Enrique Melero , 1997. +# Santiago Vila Doncel , 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: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2004-12-27 20:45+0100\n" +"Last-Translator: Santiago Vila Doncel \n" +"Language-Team: Spanish \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumento %s inválido para %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumento %s ambiguo para %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Los argumentos válidos son:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Parámetro ARGP_HELP_FMT desconocido" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Incongruencia en ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Modo de empleo:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " o bien: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPCIÓN...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Comunicar bichos a %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Error del sistema desconocido" + +#: lib/argp-parse.c:81 src/tar.c:763 +#, fuzzy +msgid "give this help list" +msgstr "Da esta lista de ayuda" + +#: lib/argp-parse.c:82 src/tar.c:764 +#, fuzzy +msgid "give a short usage message" +msgstr "Da un mensaje de uso corto" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NOMBRE" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +#, fuzzy +msgid "print program version" +msgstr "Muestra la versión del programa" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: la opción `%s' requiere un argumento\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: la opción `%s' es ambigua\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: la opción `%s' requiere un argumento\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción no reconocida `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción no reconocida `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción ilegal -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: la opción requiere un argumento -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: la opción `-W %s' es ambigua\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memoria agotada" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "No se pudo obtener el directorio actual" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "No se puede determinar el directorio de trabajo inicial" + +# 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Eliminando la `%s' inicial de los nombres" + +#: lib/paxnames.c:156 +#, 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:169 +msgid "Substituting `.' for empty member name" +msgstr "Se sustituye `.' por el nombre vacío" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Escrito por François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Escrito por François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Escrito por François Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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" + +#: src/buffer.c:281 src/buffer.c:520 src/buffer.c:1106 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" + +# ¿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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Bytes escritos en total: %s (%s, %s/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +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:344 +#, 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:433 +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:456 +msgid "Invalid value for record_size" +msgstr "El valor de `record_size' no es válido" + +#: src/buffer.c:459 +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:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "No se puede verificar la entrada/salida estándar" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "El archivo está comprimido. Utilice la opción %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "No se pueden actualizar archivos comprimidos" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Al principio de la cinta, se terminará ahora" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Demasiados errores, abandono" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek no paró en los límites de un registro" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: contiene un número de volumen inválido" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Desbordamiento en el número de volumen" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Prepare el volumen #%d para %s y pulse intro: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "" +"Se encontró un final de fichero mientras se esperaba respuesta del usuario" + +#: src/buffer.c:920 src/buffer.c:952 +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:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, 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:947 +msgid "No new volume; exiting.\n" +msgstr "No hay volumen nuevo; finalizando.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "La orden `%s' falló" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s no continúa en este volumen" + +#: src/buffer.c:1217 +#, 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:1227 +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:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "El archivo no está etiquetado para que coincida con %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "El volumen %s no coincide con %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Un bloque de ceros aislado en %s" + +#: 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:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "valor %s fuera del rango %s %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Generando cabeceras octales negativas" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +#, 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:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tipo de fichero desconocido; no se tendrá en cuenta" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "Faltan enlaces a '%s'.\n" + +#: src/create.c:1535 +#, 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:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: el fichero es el propio archivo; no se vuelca" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: El fichero fue borrado antes de leerlo" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: contiene una marca de directorio caché; no se vuelca" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: el fichero cambió mientras se estaba leyendo" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: el `socket' no se tendrá en cuenta" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: El directorio ha sido renombrado" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: El directorio ha sido renombrado" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: El directorio es nuevo" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Marca de tiempo inválida" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Se ha especificado un modo no válido en la opción" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Número de dispositivo inválido" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Número de nodo-i inválido" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "Error de lectura en %s" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Fin de fichero inesperado en el archivo" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Argumento de densidad mal formado: '%s'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Argumento de densidad mal formado: '%s'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "" + +#: src/incremen.c:1543 +#, 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:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Borrando %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Las opciones `-%s' y `-%s' requieren entrada estándar" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Formato de archivo inválido" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Se requieren características de GNU en formato de archivo incompatible" + +#: src/tar.c:241 +#, 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:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "Modo principal de operación:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "lista el contenido de un archivo" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "extrae ficheros de un archivo" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "crea un nuevo archivo" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "encuentra las diferencias entre un archivo y el sistema de ficheros" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "añade ficheros al final de un archivo" + +#: src/tar.c:384 +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:386 +msgid "append tar files to an archive" +msgstr "añade ficheros tar a un archivo" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "borra del archivo (¡no en cintas magnéticas!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modificadores de operación:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "maneja ficheros dispersos de forma eficiente" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "maneja el formato GNU antiguo de respaldo incremental" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FICHERO" + +#: src/tar.c:405 +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:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "no sale con estado distinto de cero cuando hay ficheros ilegibles" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NÚMERO" + +#: src/tar.c:409 +#, 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:415 +#, fuzzy +msgid "archive is seekable" +msgstr "El archivo admite `seek'" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "intenta verificar el archivo después de escribirlo" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "borra los ficheros después de añadirlos al archivo" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "no reemplaza ficheros que existan al extraer" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "sobreescribe los ficheros que existan al extraer" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "borra cada fichero antes de extraer sobre él" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "vacía jerarquías antes de extraer directorios" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "conserva los metadatos de los directorios que existan" + +#: src/tar.c:445 +#, fuzzy +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "sobreescribe los ficheros que existan al extraer" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "extrae los ficheros a la salida estándar" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "ORDEN" + +#: src/tar.c:456 +#, fuzzy +msgid "pipe extracted files to another program" +msgstr "extrae los ficheros a la salida estándar" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Manejo de los atributos del fichero:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "fuerza NOMBRE como propietario de los ficheros que se añaden" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "fuerza NOMBRE como grupo para los ficheros que se añaden" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "FECHA-O-FICHERO" + +#: src/tar.c:472 +#, 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:473 +msgid "CHANGES" +msgstr "CAMBIOS" + +#: src/tar.c:474 +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:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "no extrae la fecha de modificación del fichero" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "intenta extraer los ficheros con el mismo propietario" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "extrae los ficheros como usted mismo" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "utiliza siempre números para los nombres de usuarios/grupos" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "ordena los nombres que se extraen para que coincidan con el archivo" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "lo mismo que -p y -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Selección de dispositivo y opciones:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIVO" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "utiliza un archivo o el dispositivo ARCHIVO" + +#: src/tar.c:513 +#, 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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "utiliza la ORDEN rmt dada en vez de rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "utiliza la ORDEN remota en vez de rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "especifica la unidad y la densidad" + +#: src/tar.c:535 +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:537 +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:539 +msgid "run script at end of each tape (implies -M)" +msgstr "ejecuta un script al final de cada cinta (implica -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "usa/actualiza el número de volumen en FICHERO" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Bloques en los dispositivos:" + +#: src/tar.c:549 +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:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOQUES x 512 bytes por registro" + +#: src/tar.c:552 +#, fuzzy +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "TAMAÑO bytes por registro, múltiplo de 512" + +#: src/tar.c:554 +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:556 +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:561 +msgid "Archive format selection:" +msgstr "Selección del formato de archivo:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMATO" + +#: src/tar.c:564 +#, fuzzy +msgid "create archive of the given format" +msgstr "crea un archivo en el formato dado." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMATO es uno de los siguientes:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "formato tar V7 antiguo" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "formato GNU de tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "formato GNU tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "formato POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "formato POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +#, fuzzy +msgid "same as pax" +msgstr "Lo mismo que pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "lo mismo que --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "lo mismo que --format=posix" + +#: src/tar.c:584 +#, fuzzy +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "palabra[[:]=valor][,palabra[[:]=valor], ...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "palabras clave de control de pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEXTO" + +#: src/tar.c:587 +#, 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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opciones de compresión en conflicto" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "No se puede escribir al programa de compresión" + +#: src/tar.c:596 +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:598 +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:602 +msgid "filter the archive through compress" +msgstr "filtra el archivo a través de compress" + +# FIXME: Decir al autor que ponga el "itself". sv +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "filtra el arhivo a través de gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtra a través de PROG (debe aceptar -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Selección del fichero local:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "DIR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "cambia al directorio DIR" + +#: src/tar.c:619 +#, 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:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T lee nombres terminados en nulo, desactiva -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +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:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATRÓN" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "excluye ficheros, dados como un PATRÓN" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "excluye los patrones listados en FICHERO" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "excluye los directorios que contienen una marca de caché" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "excluye los directorios que contienen una marca de caché" + +#: src/tar.c:639 +#, 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:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "excluye los directorios que contienen una marca de caché" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "excluye los directorios que contienen una marca de caché" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "evita descender automáticamente en los directorios" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "permanece en el sistema de ficheros locales al crear el archivo" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "opera recursivamente sobre los directorios (por omisión)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "no elimina la `/' inicial de los nombres de ficheros" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NOMBRE-DE-MIEMBRO" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "comienza por el miembro NOMBRE-DE-MIEMBRO dentro del archivo" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "almacena solamente ficheros más recientes que FECHA-O-FICHERO" + +#: src/tar.c:664 +msgid "DATE" +msgstr "FECHA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "compara la fecha y hora solamente cuando cambian los datos" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTROL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "se hace un respaldo antes de borrar, escoja el CONTROL de versión" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "CADENA" + +#: src/tar.c:669 +#, 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:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +#, 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:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "la exclusión no distingue mayúsculas de minúsculas" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "" +"los patrones de exclusión encajan con el comienzo del nombre del fichero" + +#: src/tar.c:691 +#, 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:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "la exclusión distingue mayúsculas de minúsculas (por omisión)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "los comodines de patrones de exclusión no encajan con '/'" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "" +"los comodines de los patrones de exclusión encajan con '/' (por omisión)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Salida informativa:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "lista los ficheros procesados detalladamente" + +#: src/tar.c:711 +#, fuzzy +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "muestra mensajes de progreso cada 10 registros" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "muestra un mensaje si no se vuelcan todos los enlaces" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "muestra las fechas de modificación de los ficheros en UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "envía la salida detallada a FICHERO" + +#: src/tar.c:728 +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:730 +msgid "ask for confirmation for every action" +msgstr "pide confirmación para cada acción" + +#: src/tar.c:733 +#, fuzzy +msgid "show tar defaults" +msgstr "Muestra los valores predeterminados de tar" + +#: src/tar.c:735 +#, 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:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Opciones de compatibilidad:" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "Otras opciones:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Opciones de compresión en conflicto" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " tipo de fichero desconocido %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "No se encontró la fecha del fichero" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Sustituyendo %s por el formato de fecha desconocido %s" + +#: src/tar.c:1022 +#, 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:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: el fichero es el propio archivo; no se vuelca" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Las opciones predeterminadas de *esta* versión de tar son:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Factor de bloqueo inválido" + +#: src/tar.c:1340 +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:1373 +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:1409 +msgid "More than one threshold date" +msgstr "Se ha especificado más de una fecha tope" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Grupo inválido" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Se ha especificado un modo no válido en la opción" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Número inválido" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Propietario inválido" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "El tamaño del registro es inválido" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "Número inválido de elementos" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, fuzzy, c-format +msgid "Malformed density argument: %s" +msgstr "Argumento de densidad mal formado: '%s'" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Densidad desconocida: '%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FICHERO]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "La opción antigua `%c' requiere un argumento" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence no tiene sentido sin una lista de ficheros" + +#: src/tar.c:2202 +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:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Los archivos múltiples requieren la opción `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "No se puede combinar --listed-incremental con --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "No se pueden verificar archivos multivolumen" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "No se pueden verificar archivos comprimidos" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "No se pueden utilizar archivos multivolumen comprimidos" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "No se pueden actualizar archivos comprimidos" + +#: src/tar.c:2293 +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:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Rechazo cobarde a crear un archivo vacío" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Las opciones `-Aru' son incompatibles con `-f -'" + +#: src/tar.c:2432 +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:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Grupo inválido" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Punto de comprobación de lectura %d" + +# Acepto sugerencias para el `test suite'. sv +# "test suite"="paquete/conjunto de pruebas/análisis", en cualquier +# combinación. jmg +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Otras opciones:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "crea un archivo en el formato dado." + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "extrae los ficheros a la salida estándar" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "Leídos %s bytes como %s" + +#: tests/genfile.c:134 +#, fuzzy +msgid "-T reads null-terminated names" +msgstr "-T lee nombres terminados en nulo, desactiva -C" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "intenta verificar el archivo después de escribirlo" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, 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:190 +#, fuzzy +msgid "Execute COMMAND" +msgstr "ORDEN" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Marca de tiempo inválida" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Número de nodo-i fuera de rango" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Error del sistema desconocido" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "No se puede abrir %s" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "No se puede cerrar" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, 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:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "No se puede leer el estado del fichero %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "El proceso hijo terminó con la señal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Nombres de fichero modificados--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "tamaño del bloque" + +#~ 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." + +# 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 "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" + +#~ msgid "Cannot exec %s" +#~ msgstr "No se puede ejecutar %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 %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 "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..9b45a27 Binary files /dev/null and b/po/et.gmo differ diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..747f07c --- /dev/null +++ b/po/et.po @@ -0,0 +1,2580 @@ +# Estonian translations for GNU tar. +# Copyright (C) 2001 Free Software Foundation, Inc. +# Toomas Soome , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.15.92\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2006-10-26 14:45+0300\n" +"Last-Translator: Toomas Soome \n" +"Language-Team: Estonian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "vigane argument %s (`%s')" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "segane argument %s (`%s')" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Lubatud argumendid on:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT parameeter peab olema positiivne" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Tundmatu ARGP_HELP_FMT parameeter" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Prügi ARGP_HELP_FMT parameetrites: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Kasutamine:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " või: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [VÕTI...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Teated vigadest saatke palun aadressil %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Tundmatu süsteemi viga" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "näita seda abiinfot" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "näita lühikest kasutamise õpetust" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NIMI" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "sea programmi nimi" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEK" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "oota SEK sekundeid (vaikimisi 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "esita programmi versioon" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMMI VIGA) Versioon pole teada!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Liiga palju argumente\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMMI VIGA) Võti peaks olema ära tuntud!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: võti `%s' on segane\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: võtmel `--%s' pole argumente\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: võti `%s' nõuab argumenti\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: tundmatu võti `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: tundmatu võti `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: vigane võti -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: vigane võti -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: võti nõuab argumenti -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: võti `-W %s' on segane\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: võti `-W %s' ei luba argumenti\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "mälu on otsas" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Ei õnnestu vahetada töökataloogi" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Töökataloogi ei õnnestu salvestada" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Eemaldan liikmete nimedelt prefiksi `%s'" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Eemaldan viidatavate nimedelt prefiksi `%s'" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Kasutan tühjade nimede asemel `.'" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[jJ]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Baite kirjutatud kokku" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Baite loetud kokku" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Baite kirjutatud kokku: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(toru)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Kirje suuruse väärtus on vigane" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arhiivi nime pole" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Ei saa kontrollida sisend/väljund arhiive" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Arhiiv on tihendatud. Kasutage võtit %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Ei saa uuendada pakitud arhiive" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Lindi alguses, lõpetan töö" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Liig palju vigu, jätan töö pooleli" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek ei peatunud kirje piiril" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: sisaldab vigast volüümi numbrit" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Volüümi number on liiga suur" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "EOF kasutaja vastuse asemel" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "HOIATUS: Arhiiv pole täielik" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Loo alamshell\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Väljasta see info\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Pole uus volüüm; lõpetan töö.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Puudub faili nimi. Proovige uuesti.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Vigane sisend. ? annab abiinfot.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "%s käsklus sai vea" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s ei jätku sellel volüümil" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s on vale suurusega (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "See volüüm on väljaspoolt järjekorda" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arhiivi märgend ei sobi `%s'" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volüüm `%s' ei sobi volüümiga `%s'" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Üksik null blokk kohal %s" + +#: 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:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Genereerin negatiivsed kaheksand päised" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: viite nimi on liiga pikk; ei salvesta" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: fail on teises failisüsteemis; ei salvesta" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tundmatu failitüüp; ignoreerin seda faili" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "%s-le puudub viiteid.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: pole muutunud; ei salvesta" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s on arhiiv; ei salvesta" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fail kustutati enne lugemist" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: sisaldab vahemälu kataloogi lipikut; ei salvesta" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: fail muutus lugemisel" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: ignoreerin pesa" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Kataloog %s on ümber nimetatud" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Kataloog on ümber nimetatud" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Kataloog on uus" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Vigane ajatempel" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Vigane muutmise aeg (sekundid)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Vigane muutmise aeg (nanosekundid)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Vigane seadmenumber" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Vigane i-kirje number" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Snapshoti faili lugemisel leiti liiga pikk väli" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Snapshoti failist lugemise viga" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Ootamatu snapshoti faili lõpp" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Snapshoti failis on väljal ootamatu väärtus" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Puudub kirje lõpetaja" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Inkrementaalse faili vorming on vigane" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Mittetoetatud inkrementaalse vormingu versioon: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Vigane taastamise kataloog: eeldasin '%c', sain %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Vigane taastamise kataloog: dubleeritud 'X'" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Vigane taastamise kataloog: tühi nimi 'R' väljal" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Vigane taastamise kataloog: 'R' ei ole 'T' ees" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Vigane taastamise kataloog: tühi nimi 'T' väljal" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Vigane taastamise kataloog: 'X' ei kasutata" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Vormiga %s ei saa ajutist kataloogi luua" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Ei puhasta kataloogi: stat ebaõnnestus" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: kataloog on teisel seadmel; ei puhasta" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Kustutan %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Vigane arhiivi vorming" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Arhiivi formaat ei toeta GNU laiendusi" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Põhiline töö:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "näita arhiivi sisukorda" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "taasta failid arhiivist" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "loo uus arhiiv" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "otsi arhiivi ja failisüsteemi erinevusi" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "lisa failid arhiivi lõppu" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "lisa arhiivi ainult failid uuemad kui arhiivis" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "lisa tar failid arhiivi" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "kustuta arhiivist (mitte magnetlindilt!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "testi arhiivi volüümi märgendit ja lõpeta töö" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Töö täpsustamine:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "tööta aukudega failidega efektiivsemalt" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "PÕHI[.ALAM]" + +#: src/tar.c:401 +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:403 +msgid "handle old GNU-format incremental backup" +msgstr "käsitle vana GNU vormingus inkrementaalset koopiat" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FAIL" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "käsitle uue GNU vormingu inkrementaalset koopiat" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "ära lõpeta loetamatute failide korral veakoodiga" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "N" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "arhiiv on positsioneeritav" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Ülekirjutamise juhtimine:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "kontrolli arhiivi peale arhiivi kirjutamist" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "kustuta failid peale arhiveerimist" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "olemasolevaid faile taastamisel üle ei kirjuta" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "kirjuta olemasolevad failid üle" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "kustuta fail enne taastamist" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "kustuta hierarhia enne kataloogi taastamist" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "säilita olemasolevate kataloogide metainfo" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "taastamisel kirjuta olemasolevate kataloogide metainfo üle (vaikimisi)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Vali väljundvoog:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "taasta failid standardväljundisse" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "KÄSK" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "taasta failid läbi toru teise programmi" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "ignoreeri alamprotsesside lõpetamise koode" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "käsitle alamprotsesside nullist erinevaid lõpetamise koode veana" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Faili atribuutide käsitlemine:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "kasuta NIMEe kui lisatud failide omanikku" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "kasuta NIMEe kui lisatud failide gruppi" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "KUUP-VÕI-FAIL" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "sea lisatud failide muutmise ajaks KUUP-VÕI-FAIL" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "MUUTUSED" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "kasuta lisatud failidel sümbol moodi MUUTUSED" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "MEETOD" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "ära taasta faili muutmise aega" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "säilita taastamisel failide omanikud" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "taasta failid enda õigustes" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "kasuta kasutaja/grupp numbreid" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "taasta ka info failide õigustest (vaikimisi superkasutaja korral)" + +#: src/tar.c:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "taasta failid arhiveerimis järjekorras" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "sama, kui -p ja -s" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "katkesta --delay-directory-restore võtme mõju" + +#: src/tar.c:508 +#, fuzzy +msgid "Device selection and switching:" +msgstr "Seadme valik ja vahetamine:\n" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARHIIV" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "kasuta arhiivi faili või seadet ARHIIV" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "arhiivi fail on lokaalne isegi kui sisaldab koolonit" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "kasuta rmt asemel antud käsku" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "kasuta rsh asemel antud käsku" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "määra seade ja tihedus" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "loo/näita/taasta mitme volüümilisi arhiive" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "vaheta peale NUMBER x 1024 baidi kirjutamist linti" + +#: src/tar.c:539 +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:542 +msgid "use/update the volume number in FILE" +msgstr "kasuta/uuenda volüümi numbrit failis FAIL" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Seadme blokkimine:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKKE" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOKKE x 512 baiti kirjele" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "NUMBER baiti kirjele, 512 kordne" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ignoreeri null blokke arhiivis (tähistab EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "bloki lugemisel uuesti (4.2BSD torude jaoks)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Arhiivi vormingu valikud:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "VORMING" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "loo arhiiv antud vormingus" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "VORMING on üks järgnevaist:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "vana V7 tar vorming" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU vorming tar <= 1.12 korral" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x vorming" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) vorming" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) vorming" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "sama, kui pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "sama, kui --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "sama, kui --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "võtmesõna[[:]=väärtus][,võtmesõna[[:]=väärtus]...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "pax võtmesõnade kasutamine" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEKST" + +#: src/tar.c:587 +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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Konfliktsed pakkimisvõtmed" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtreeri arhiiv läbi bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtreeri arhiiv läbi gzipi" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtreeri arhiiv läbi compressi" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "filtreeri arhiiv läbi gzipi" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtreeri läbi programmi (peab lubama võtit -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Lokaalse faili valik:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "KAT" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "mine kataloogi KAT" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "loe taastatavate või varundatavate failide nimed failist NIMI" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T loeb nullidega lõpetatud nimesid, blokeeri -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "eemalda -T võtmega loetud failinimedest kvootimissümbolid (vaikimisi)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "ära eemalda -T võtmega loetud failinimedest kvootimissümboleid" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MUSTER" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "MUSTRI järgi välistatud failid" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "välistavad mustrid on FAILIS" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "välista kataloogid, mis on märgitud vahemälu jaoks" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "välista kataloogid, mis on märgitud vahemälu jaoks" + +#: src/tar.c:639 +#, 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:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "välista kataloogid, mis on märgitud vahemälu jaoks" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "välista kataloogid, mis on märgitud vahemälu jaoks" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "ära sisene kataloogidesse" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "püsi arhiivi loomise ajal kohalikus failisüsteemis" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "sisene kataloogidesse (vaikimisi)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "ära eemalda faili nimedelt prefiksit `/'" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "järgi nimeviiteid; arhiveeri ja taasta viidatavad failid" + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "järgi nimeviiteid; arhiveeri ja taasta viidatavad failid" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "KOMPONENT" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "alusta arhiivi liikmest KOMPONENT" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "salvesta ainult failid mis on uuemad kui KUUP-VÕI-FAIL" + +#: src/tar.c:664 +msgid "DATE" +msgstr "KUUPÄEV" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "võrdle kuupäevi ainult kui andmed on muutunud" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "KONTROLL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "loo enne eemaldamist varukoopia, vali versioonikontroll" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "SÕNE" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Failide nimede muutmine:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "eemalda taastamisel failide nimede algusest NUMBER komponenti" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "AVALDIS" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "kasuta failide nimede muutmiseks sed asendus avaldist" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "Failinimede otsimine (mõjutab nii kaasamist, kui välistamist):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "tõstutundetu" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "mustrid alustavad faili nime algusest" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "mustrid toimivad iga / järel (välistamise korral vaikimisi)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "tõstutundlik otsimine (vaikimisi)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "kasuta jokkersümboleid (välistamise korral vaikimisi)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "täht-täheline sõne otsimine" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "jokkerid ei leia '/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "jokkersümbolid leiavad '/' (välistamise korral vaikimisi)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informatsioon:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "väljasta töödeldavate failide kohta infot" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "anna töö kohta infot iga NUMBER kirje järel (vaikimisi 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "väljasta teade, kui kõike viiteid pole salvestatud" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "väljasta failide muutmise ajad UTC esituses" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "salvesta täiendav info FAILi" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "näita iga teatega ka arhiivi bloki numbrit" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "küsi iga tegevuse kohta kinnitust" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "näita tar vaikeseadeid" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "peale teisendamist näita faili või arhiivi nime" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STIIL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "lisaks kvoodi sõnes näidatud sümbolid" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "keela sõnes toodud sümbolite kvootimine" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Ühilduvuse võtmed:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Muud võtmed:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "blokeeri potentsiaalselt ohtlikud võtmed" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Korraga ainult üks võtmetest `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Konfliktsed pakkimisvõtmed" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Tundmatu signaali nimi: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Kuupäeva fail puudub" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Kasutan %s tundmatu ajaformaadi %s asemel" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Võti %s: Käsitlen aega `%s' kui %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: failide nimekiri on juba loetud" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: loetud faili nimi sisaldab sümbolit nul" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Võtmega --quoting-style on lubatud järgnevad argumendid:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*See* tar kasutab vaikimisi:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Vigane blokkimisfaktor" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Vigane lindi pikkus" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Rohkem kui üks etteantud aeg" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Vigane aukudega faili versiooni väärtus" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' ei ole sellel platvormil toetatud" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint väärtus ei ole täisarv" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Vigane grupp" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Võtmega anti vigane mood" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Vigane number" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Vigane omanik" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Vigane kirje suurus" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Kirje suurus peab olema %d kordne." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Vigane elementide arv" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Lubatud on ainult üks --to-command võti" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Vigane tiheduse argument: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Tundmatu tihedus: `%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FAIL]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Vana võti `%c' nõuab argumenti." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence ei oma failide nimekirjata mõtet" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence ei saa valitud tööre¸iimil kasutada" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Mitme arhiivifaili kasutamine nõuab võtit `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental ja --newer ei saa koos kasutada" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Ei suuda kontrollida mitme volüümilisi arhiive" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Ei saa kontrollida pakitud arhiive" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Ei saa kasutada mitme volüümilisi pakitud arhiive" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Tihendatud arhiive ei saa ühendada" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option saab kasutada ainult POSIX arhiividega" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Ega ikka ei tee küll tühja arhiivi" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Võtmeid `-Aru' ei saa kasutada võtmega `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Peab kasutama vähemalt üht võtmetest `-Acdtrux'" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Vigane grupp" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Lugemise kontrollpunkt %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Faili loomise võtmed:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "SUURUS" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Loo määratud suurusega fail" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Kirjuta standardväljundi asemel faili NIMI" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Loe failide nimed failist FAIL" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T loeb nullidega lõpetatud nimesid" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Bloki suurus aukudega faili korral" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "kontrolli arhiivi peale arhiivi kirjutamist" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Statistika faili kohta:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Sünkroonse täitmise võtmed:" + +#: tests/genfile.c:163 +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:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "Jõudes kontrollpunkti NUMBER, täida antud tegevus (vt. allpool)" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Määra järgmise --touch võtme ajatempel" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Esita täidetud kontrollpunktid ja käsu lõpetamise olek" + +#: tests/genfile.c:177 +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:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "Uuenda faili kasutamise ja muutmise ajatempleid" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Käivita KÄSK" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Vigane suurus: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Number on piiridest väljas: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negatiivne suurus: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) ebaõnnestus" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Viga `%s' juures numbri parsimisel" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Tundmatu kuupäeva vorming" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENDID...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "`%s' ei saa avada" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s: Ei õnnestu liikuda positsioonile %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "faili nimi sisaldab null sümbolit" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "vigane mask (`%s' lähedal)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Tundmatu väli `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "ei õnnestu seada `%s' aega" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Käsk lõpetas töö edukalt\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Käsk lõpetas veakoodiga %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Käsk katkestati signaaliga %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Käsk peatati signaaliga %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Käsk salvestas mälupildi\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Käsk katkestas\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat nõuab failinimesid" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "liiga palju argumente" + +#~ msgid "block size" +#~ msgstr "bloki suurus" + +#~ 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" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]NUMBER" diff --git a/po/eu.gmo b/po/eu.gmo new file mode 100644 index 0000000..5a56273 Binary files /dev/null and b/po/eu.gmo differ diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..1343625 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,2629 @@ +# Translation of tar messages to Basque. +# Copyright (C) 2006 Free Software Foundation, Inc. +# Mikel Olasagasti , 2006. +# Piarres Beobide , 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: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2006-12-13 19:52+0100\n" +"Last-Translator: Mikel Olasagasti \n" +"Language-Team: Basque \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "%s argumentu baliogabea %s-rentzat" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "%s argumentu anbiguoa %s-rentzat" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumentu erabilgarriak:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: ARGP_HELP_FMT parametro ezezaguna" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Zaborra ARGP_HELP_FMT-en: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Erabilera:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " edo: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [AUKERA...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Arazoen berri %s-en eman.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Sistema errore ezezaguna" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "laguntza zerrenda hau eman" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "erabilera mezu labur bat eman" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "IZENA" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "programa izen ezarri" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEG" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "SEG segundu gelditu (lehenetsia 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "programa bertsioa bistarazi" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMA ERROREA) Ez da bertsioa ezagutzen!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Argumentu gehiegi\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMA ERROREA) Aukera ezaguna izan beharko zen!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' aukera anbiguoa da\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' aukerak ez du argumenturik onartzen\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: `%s' aukerak argumentu bat behar du\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: `--%s' aukera ezezaguna\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: `%c%s' aukera ezezaguna\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: -- %c legezkanpoko aukera\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: -- %c ekintza baliogabea\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: aukerak -- %c argumentu bat behar du.\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' aukera anbiguoa da\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' aukerak ez du argumenturik onartzen\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memoria askieza" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Ezin da lan direktorioa aldatu" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Ezin da lan direktorioa gorde" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "`.' partaide izen hutsagatik aldatzen" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[bB]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Idatziriko byte-ak guztira" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Irakurritako byte-ak guztira" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Ezabaturiko byte-ak guztira: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(tutua)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "balio baliogabea record_size-rentzat" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Ez da fitxategi izenik eman" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Ezin da sarrera/irteera estandar fitxategia egiaztatu" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Fitxategia konprimiturik dago. %s aukera erabili" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Ezin dira konprimituriko fitxategiak eguneratu" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Zintaren hasieran, uzten" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Errore gehiegi, uzten" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: bolumen zenbaki baliogabea du" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Bolumen zenbaki gainezkatzea" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "#%d bolumena %s -rako prestatu eta enter sakatu: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Fitxategi amaiera erabiltzaile erantzuna espero zenean" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "Oharra: Paketea ez dago osaturik" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Azpishell bat sortu\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Zerrenda hau inprimatu\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Ez dago bolumen berririk; uzten.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Ez da fitxategi izenik ezarri. Berriz saiatu.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "SArrera baliogabea. ? idatzi laguntzarako.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "%s komandoak huts egin du" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s ez da bolumen honen jarraipena" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s okerreko tamaina da (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Bolumen hau sekuentziatik kanpo dago" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "%s bolumena ez da %s-ren pareko" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: 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:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "%s balioa %s eremutik %s..%s kanpo dago" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Zortzitar buru negatiboak sortzen" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: lotura izena luzeegia da; ez da irauliko" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Fitxategi mota ezezaguna; fitxategia alde batetara utziko da" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "%s-ra lotura falta da.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: fitxategia ez da aldatu, ez da irauliko" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: fitxategia paketea da, ez da irauliko" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fitxategia irakurri baino lehen ezabaturik" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: katxe direktorioa marka bat du; ez da irauliko" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: fitxategia aldatu egin da irakurtzen ari zenean" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket-a alde batetara utzi da" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Direktorioa %s-tik berrizendatua izan da" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Direktorioa berrizendatua izan da" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Direktorioa berria da" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "denbora marka baliogabea" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Eraldaketa denbora (segundu) baliogabea" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Eraldaketa denbora (nanosegundu) baliogabea" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "gailu zenbaki baliogabea" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Inodo zenbaki baliogabea" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Eremu luzeegia snapshot fitxategia irakurtzerakoan" + +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "Eremu balio esperogabea snapshot fitxategian" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Eremu balio esperogabea snapshot fitxategian" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Eremu balio esperogabea snapshot fitxategian" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Gordetze amaiera falta da" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Fitxategi inkremental formatu okerra" + +#: src/incremen.c:1214 +#, fuzzy, c-format +msgid "Unsupported incremental format version: %" +msgstr "Onartugabeko inkremental formatu bertsioa: %d" + +#: src/incremen.c:1369 +#, 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:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Gaizki eratutako iraulketa direktorioa: 'X' bikoizturik" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Gaizki eratutako iraulketa direktorioa: izen hutsa 'R'-en" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Gaizki eratutako iraulketa direktorioa: 'T' ez doa 'R' atzean" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Gaizki eratutako iraulketa direktorioa: izen hutsa 'T'-en" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Gaizki eratutako iraulketa direktorioa: 'X' ez da inoiz erabili" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Ezin da aldiroko direktorioa sortu %s txantiloia erabiliaz" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Ez da direktorioa garbituko: ezin da egoera eskuratu" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s ezabatzen\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "`-%s' eta `-%s' aukerek sarrera estandarra behar dute" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Pakete formatu baliogabea" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU ezaugarriak behar dira pakete formatu bateraezinean" + +#: src/tar.c:241 +#, 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:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "Ekintza nagusi modua:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "pakete baten edukiak zerrendatu" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "pakete batetako fitxategiak atera" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "pakete berri bat sortu" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "paketea eta fitxategi sistema arteko ezberdintasunak bilatu" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "fitxategiak paketearen amaieran gehitu" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" +"paketean dauden kopiak baino berriagoak diren fitxategiak bakarrik gehitu" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "gehitu tar fitxategiak pakete batetara" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "paketetik ezabatu (ez mag zintetan!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "pakete bolumen etiketa egiaztatu eta irten" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Ekintza aldagaiak:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "sakabanatutako fitxategiak egoki kudeatu" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "GNU basbeskopia inkremenetal formatu zaharra kudeatu" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FITXATEGIA" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "GNU basbeskopia inkremenetal formatu berria kudeatu" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "ZENBAKIA" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "paketeak `seek' onartzen du" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +#, fuzzy +msgid "Overwrite control:" +msgstr "Gainidazketa kontrola:\n" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "fitxategia egiaztatzen saiatu idatzi aurretik" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "ezabatu fitxategiak paketera gehitu aurretik" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "ez ordezkatu dauden fitxategiak ateratzerakoan" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "gainidatzi dauden fitxategiak ateratzerakoan" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "dauden direktorioen metadata mantendu" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "dauden direktorioen metadata gainidatzi ateratzerakoan (lehenetsia)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Irteera korrontea hautatu:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "fitxategiak irteera estandarrera atera" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "KOMANDOA" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "bideratu ateratako fitxategiak beste programa batetara" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "alde batetara utzi semeen irteera kodeak" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "zero ez diren semeen irteera kodeekin errore bat bezala jokatu" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Fitxategi atributu kudeaketa:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "indartu IZENA jabe bezala gehituriko fitxategientzat" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "indartu IZENA talde bezala gehituriko fitxategientzat" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATA-EDO-FITXATEGIA" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "ALDAKETAK" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "indartu (sinbolikoa) modu ALDAKETAK gehituriko lerroentzat" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METODOA" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "ez atera fitxategi eraldaketa data" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "jabe berdinaren fitxategiak ateratzen saiatu" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "atera fitxategiak zure kabuz" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "beti erabili zenbakiak erabiltzaile/talde izenen ordez" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"fitxategi baimenei buruzko argibideak atera (lehenetsia root " +"erabiltzailearentzat)" + +#: src/tar.c:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "-p eta -s bikotearen berdina" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "--delay-directory-restore aukeraren eragina ezeztatu" + +#: src/tar.c:508 +#, fuzzy +msgid "Device selection and switching:" +msgstr "Gailu hautapen eta aldaketa:\n" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "PAKETEA" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "pakete fitxategia edo gailu PAKETEA erabili" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "pakete fitxategi lokala da nahiz bi puntu izan" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "Emandako rmt KOMANDOA erabili rmt ordez" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "Urruneko KOMANDOA erabili rsh ordez" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "Gailu eta dentsitatea ezarri" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "sortu/zerrendatu/atera bolumen-anitzeko paketea" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "zinta aldatu ZENBAKIA x 1024 byte idatzi ondoren" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "scipt-a abiarazi zinta bakoitzaren amaieran (-M behar du)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "erabili/eguneratu FITXATEGI bolumen zenbakia" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Gailu blokeak:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKE" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOKE x 512 byte grabazio bakoitzeko" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "grabazio bakoitzeko byte ZENBAKIA, 512-ren multiploa" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "paketean zeroz betetako blokeak alde batetara utzi" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "irakurri ahala berriz bloke egin (4.2BSD tutuentzat)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Pakete formatu hautapena:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMATUA" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "emandako formatuko pakete bat sortu" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMATUA hauetako bat da:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "V7 tar formatu zaharra" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU formatua tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x formatua" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) formatua" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) formatua" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "pax-en berdina" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "--format=v7-ren berdina" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "--format=posix-ren berdina" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "gakoa[[:]=balioavalue][,gakoa[[:]=balioa]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TESTUA" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Elkarjotzen duten konpresio aukerak" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "fitxategia bzip2 bidez iragazi" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "fitxategia gzip bidez iragazi" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "fitxategia konpresorearen bidez iragazi" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "fitxategia gzip bidez iragazi" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "PROG bidez iragazi (-d onartu behar du)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Fixtategi lokal hautapena:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "DIR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "DIR direktoriora aldatu" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "ateratzeko edo sortzeko izenak FITXATEGIA-tik eskuratu" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATROIA" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "fixtategiak utzi, PATROIA bezala emandakoak" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "FITXATEGIAN zerrendaturiko patroiak alde batetara utzi" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "katxe marka duten direktorioak alde batetara utzi" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "katxe marka duten direktorioak alde batetara utzi" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "katxe marka duten direktorioak alde batetara utzi" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "katxe marka duten direktorioak alde batetara utzi" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "katxe marka duten direktorioak alde batetara utzi" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "sahiestu automatikoki direktorioetan zehar jeistea" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "fitxategi sistema lokalean egon paketea sortzerakoan" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "direktorioetan barrena (lehenetsia)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "Ez kendu hasierako `/' fitxategi izenetatik" + +#: src/tar.c:656 +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:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"lotura sinbolikoak jarraitu; lotzen dituzten fitxategiak irauli eta paketean " +"sartu" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "PARTAIDE IZEN" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "data eta ordua parekatu data bakarrik aldatzen denean" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "KONTROL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "babeskopia egin ezabatu aurretik, KONTROL bertsioa hautatu" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "KATEA" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Fitxategi izen eraldaketak:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "ESPRESIOA" + +#: src/tar.c:679 +#, fuzzy +msgid "use sed replace EXPRESSION to transform file names" +msgstr "Sed-en ordezko EXPRESIOA erabili fitxategi izenak eraldatzeko" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "kasua alde batetara utzi" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "verbatim kate parekatzea" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "irteera informatiboa:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" +"Aurrerapen mezuak bistarazi grabaketa ZENBAKI bakiotzagatik (lehenetsia 10 " +"da)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "mezu bat inprimatu lotura guztiak ez badira iraultzen" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SEINALEA" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "eraldaketa datak UTC orduan bistarazi" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "irteera luzea FITXATEGIRA bidali" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "Bloke zenbakia bistarazu pakete bakoitzeko mezu bakoitzagatik" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "berrespena eskatu ekintza bakoitzean" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "tar lehenespenak bistarazi" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "fixtategi edo pakete izenak bistarazi eraldaketaren aurretik" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "ESTILOA" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "Gako karaktere gehigarriak KATE-tik" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "gakoak kendu karaktereentzat KATE-tik" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Bateragarritasun aukerak:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Beste aukerak:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "ezgaitu arriskutsu izan daitezken zenbait aukera" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Ezin duzu `-Acdtrux' aukera bat baino gehiago ezarri" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Elkarjotzen duten konpresio aukerak" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Seinale izen ezezaguna: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Data adibide fitxategia ez da aurkitu" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "%s %s data formatu ezezagunagatik aldatzen" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: fitxategi zerrenda irakurria dagoeneko" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "--quoting-style-entzat balio erabilgarriak:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Blokeo faktore baliogabea" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Zinta luzera baliogabea" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Atari data bat baino gehiago" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' ez da onartzen plataforma honetan" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint balioa ez da zenbaki oso bat" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Talde baliogabea" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Modu baliogabea eman da aukeran" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Zenbaki baliogabea" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Jabe baliogabea" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Grabazio tamaina baliogabea" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Grabaszio tamaina %d-ren multiplo bat izan behar da." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Elementu kopuru baliogabea" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "--to-command aukera bat bakarrik onartzen da" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Gaizki eratutako dentsitate argumentua: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Dentsitate Ezezaguna: `%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FITXATEGIA]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "`%c' zaharkituriko aukerak argumentu bat behar du" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Pakete fitxategi anitzentzat `-M' aukera erabili behar da" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Ezin dira --listed-incremental eta --newer batera erabili" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Ezin dira bolumen-anitzeko paketeak egiaztatu" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Ezin dira konprimituriko fitxategiak egiaztatu" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Ezin dira bolumen anitzeko konprimituriko paketeak erabaili" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Ezin dira konprimituriko paketeak kateatu" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option POSIX paketeekin bakarrik erabili daiteke" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr " `-Aru' aukerak bateraezinak dira `-f -' rekin" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Behintzat `-Acdtrux' aukeretako bat ezarri behar duzu" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Talde baliogabea" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Irakurketa %u egiaztapen puntua" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Pakete sortze aukerak:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "TAMAINA" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Emandako TAMAINAko paketea sortu" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Fitxategi IZENEAN idatzi irteera estandarren ordez" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Fitxategi izenak PAKETEtik irakurri" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Bloke tamaina fitxategi sakabanatuentzat" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "fitxategia egiaztatzen saiatu idatzi aurretik" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Fixtategi estatistika aukerak:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Sinkronizatutako exekuzio aukerak:" + +#: tests/genfile.c:163 +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:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Ezarri data hurrengo --touch aukerarentzat" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "FITXATEGIAREN irakurketa eta eraldaketa denborak aldatu" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "KOMANDOA exekutatu" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Tamaina baliogabea: %s" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Inodo zenbakia eremuz kanpo dago" + +#: tests/genfile.c:248 +#, fuzzy, c-format +msgid "Negative size: %s" +msgstr "Tamaina baliogabea: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) -ek huts egin du" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Errorea zenbakia analizatzean hemendi gertu: `%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Data formatu ezezaguna" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARG...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "Ezin da `%s' ireki" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s: Ezin da %s-ra seek egin" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "fitxategia izenak karaktere baliogabea du" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "maskara baliogabea (`%s'-etik gertu)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "`%s' eremu ezezaguna" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "ezin da `%s'-ren denbora ezarri" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Komandoa behar bezala irten da\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Komandoa %d egoerarekin huts egin du\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Komandoa %d seinalearekin amaitu da\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Komandoa %d seinalearekin geratu da\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Komando iraulketa nagusia\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Komandoa amaitua\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat -ek fitxategi izenak behar ditu" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "argumentu gehiegi" + +#~ msgid "block size" +#~ msgstr "bloke tamaina" + +#~ 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" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]ZENBAKIA" diff --git a/po/fi.gmo b/po/fi.gmo new file mode 100644 index 0000000..d21c46f Binary files /dev/null and b/po/fi.gmo differ diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..235f05b --- /dev/null +++ b/po/fi.po @@ -0,0 +1,3262 @@ +# Finnish messages for GNU tar. +# Copyright © 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +# Lauri Nurmi , 2002-2006. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.16.1\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2006-12-09 18:58+0200\n" +"Last-Translator: Lauri Nurmi \n" +"Language-Team: Finnish \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumentti %s on virheellinen %s:lle" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumentti %s on moniselitteinen %s:lle" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Kelvolliset argumentit ovat:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: ARGP_HELP_FMT-parametri vaatii arvon" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT-parametrin on oltava positiivinen" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Tuntematon ARGP_HELP_FMT-parametri" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Roskaa ARGP_HELP_FMT:ssä: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Käyttö:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " tai: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [VALITSIN...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Ilmoita ohjelmistovioista (englanniksi) osoitteeseen %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Tuntematon järjestelmävirhe" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "näytä tämä ohje" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "näytä lyhyt käyttöohje" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NIMI" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "näytä ohjelman versio" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Liian monta argumenttia\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: valitsin ”%s” on moniselitteinen\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: valitsin ”--%s” ei salli argumenttia\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: valitsin ”%s” vaatii argumentin\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: tunnistamaton valitsin ”--%s”\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: tunnistamaton valitsin ”%c%s”\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: virheellinen valitsin -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: valitsin vaatii argumentin -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: valitsin ”-W %s” on moniselitteinen\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: valitsin ”-W %s” ei salli argumenttia\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "muisti lopussa" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Työhakemistoa ei voi vaihtaa" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Työhakemistoa ei voi tallentaa" + +# 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Poistetaan ”%s” tiedostonimien alusta" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Poistetaan ”%s” kovien linkkien kohdenimien alusta" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Korvataan ”.” tyhjällä tiedostonimellä" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "”" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "”" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[kKyY]" + +#: lib/rpmatch.c:72 +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ää" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Kirjoittanut François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Kirjoittanut François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Kirjoittanut François Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Kirjoitettuja tavuja yhteensä" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Poistettuja tavuja yhteensä: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(putki)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Virheellinen arvo kentälle record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arkiston nimeä ei ole annettu" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Vakiosyötteessä/tulosteessa olevaa arkistoa ei voi varmistaa" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Arkisto on tiivistetty. Käytä valitsinta %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Pakattuja arkistoja ei voi päivittää" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Nauhan alussa, lopetetaan" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Liian monta virhettä, lopetetaan" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek ei pysähtynyt tietueen rajalle" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: sisältää virheellisen arkiston osan järjestysnumeron" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Arkisto-osan järjestysnumeron ylivuoto" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Valmistele osa #%d arkistolle %s ja paina return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Tiedoston loppu odotetun käyttäjän syötteen sijaan" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "VAROITUS: Arkisto on epätäydellinen" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Käynnistä alikuori\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Näytä tämä lista\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Ei uutta arkiston osaa, poistutaan.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Tiedostonimeä ei annettu. Yritä uudelleen.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Komento %s epäonnistui" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s ei jatku tällä arkiston osalla" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s on väärän kokoinen (%s ≠ %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Tämä arkiston osa ei ole järjestyksessä" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arkistoa ei ole nimetty täsmää nimiöön %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Arkiston osa %s ei täsmää nimiöön %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Yksinäinen nollalohko kohdassa %s" + +#: 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:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Luodaan otsakkeet negatiivisilla oktaaleilla" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: linkin nimi on liian pitkä, ei lisätä" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tuntematon tiedostotyyppi, tiedostoa ei huomioida" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Puuttuvat linkit tiedostoon %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: tiedosto on muuttumaton, ei lisätä" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: tiedosto on arkistossa, ei lisätä" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Tiedosto oli poistettu ennen sen lukemista" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: näyttää välimuistihakemistolta, ei lisätä" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: tiedosto muuttui lukemisen aikana" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: pistoketta ei huomioida" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Hakemisto %s on nimetty uudelleen" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Hakemisto on nimetty uudelleen" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Hakemisto on uusi" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Virheellinen aikaleima" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Virheellinen muutosaika (sekunnit)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Virheellinen muutosaika (nanosekunnit)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Virheellinen laitenumero" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Virheellinen i-solmun numero" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Odottamaton tiedoston loppu arkistossa" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Kelvoton tiheysargumentti: ”%s”" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Kelvoton tiheysargumentti: ”%s”" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Väliaikaishakemiston luominen %s-mallia käyttäen ei onnistu" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Ei poisteta hakemistoa: stat ei onnistu" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: hakemisto on eri laitteella, ei poisteta" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Poistetaan %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Kumpikin valitsimista ”-%s” ja ”-%s” käyttää vakiosyötettä" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Virheellinen arkistomuoto" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "" +"Haluttiin käyttää GNU-ominaisuuksia yhteensopimattoman arkistomuodon kanssa" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Päätoimintatila:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "listaa arkiston sisältö" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "pura tiedostoja arkistosta" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "luo uusi arkisto" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "etsi arkiston ja tiedostojärjestelmän väliset erot" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "lisää tiedostoja arkiston loppuun" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "lisää vain arkistokopiota uudemmat tiedostot" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "lisää tar-tiedostoja arkistoon" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "poista tiedostoja arkistosta (ei toimi magneettinauhoilla!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Toimintovalinnat:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "käsittele harvat tiedostot tehokkaasti" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "käsittele vanha GNU-muotoinen lisääntyvä varmuuskopio" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "TIED" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "käsittele uusi GNU-muotoinen lisääntyvä varmuuskopio" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "jatka lukukelvottomista tiedostoista huolimatta" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "MÄÄRÄ" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "arkisto on selattava" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "yritä varmistaa arkisto kirjoittamisen jälkeen" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "poista tiedostot arkistoon lisäämisen jälkeen" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "älä korvaa olemassaolevia tiedostoja purettaessa" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "ylikirjoita olemassaolevat tiedostot purettaessa" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "poista jokainen tiedosto ennen sen päälle purkamista" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "tyhjennä rakenne ennen hakemiston purkamista" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "säilytä olemassaolevien hakemistojen metatiedot" + +#: src/tar.c:445 +#, fuzzy +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "ylikirjoita olemassaolevat tiedostot purettaessa" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Valitse tulostusvirta:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "pura tiedostot vakiotulosteeseen" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "KOMENTO" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "putkita puretut tiedostot toiselle ohjelmalle" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "jätä lapsiprosessien paluuarvot huomiotta" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "käsittele lapsiprosessien nollasta poikkeavat paluuarvot virheinä" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Tiedostojen ominaisuuksien käsittely:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "pakota NIMI lisättyjen tiedostojen omistajaksi" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "pakota NIMI lisättyjen tiedostojen ryhmäksi" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "PÄIVÄYS-TAI-TIED" + +#: src/tar.c:472 +#, fuzzy +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "tallenna vain PÄIVÄYS-TAI-TIEDostoa uudemmat tiedostot" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "MUUTOS" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "pakota (symbolinen) tila MUUTOS lisätyille" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "älä pura tiedoston muutosaikaa" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "yritä purkaa tiedostot samalla omistajuudella" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "pura tiedostot itsenäsi" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "käytä aina numeroita käyttäjän/ryhmän nimissä" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "lajittele purettavat tiedostonimet täsmäämään arkistoon" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "sama kuin -p ja -s yhdessä" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +#, fuzzy +msgid "Device selection and switching:" +msgstr "Laitteen valinta ja vaihtaminen:\n" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARKISTO" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "käytä arkistotiedostoa tai -laitetta ARKISTO" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "arkisto on paikallinen vaikka nimessä olisi kaksoispiste" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "käytä rmt-KOMENTOA rmt:n sijaan" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "käytä etäKOMENTOa rsh:n sijaan" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "anna asema ja tiheys" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "luo/listaa/pura moniosainen arkisto" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "vaihda nauhaa MÄÄRÄ × 1024 kirjoitetun tavun jälkeen" + +#: src/tar.c:539 +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:542 +msgid "use/update the volume number in FILE" +msgstr "käytä/päivitä arkiston osan numero TIEDostossa" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Laitteen lohkot:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "LOHKOT" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "LOHKOT × 512 tavua tietuetta kohti" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "MÄÄRÄ tavua tietuetta kohti, 512:n monikerta" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "älä huomioi nollattuja lohkoja arkistossa (merkitsee tiedoston loppua)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "suorita lohkominen uudelleen luettaessa (4.2BSD-putkia varten)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Arkistomuodon valinta:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "MUOTO" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "luo annetun muotoinen arkisto" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "MUOTO on yksi seuraavista:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "vanha V7-tar-muoto" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU-muoto tar-versioilla ≤ 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x -muoto" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) -muoto" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) -muoto" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "sama kuin pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "sama kuin --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "sama kuin --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "avainsana[[:]=arvo][,avainsana[[:]=arvo]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "määrittele pax-avainsanoja" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEKSTI" + +#: src/tar.c:587 +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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Ristiriitaiset pakkausvalitsimet" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "ohjaa arkisto bzip2-ohjelman läpi" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "ohjaa arkisto gzip-ohjelman läpi" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "ohjaa arkisto compress-ohjelman läpi" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "ohjaa arkisto gzip-ohjelman läpi" + +#: src/tar.c:606 +msgid "PROG" +msgstr "OHJ" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "ohjaa OHJelman läpi (on hyväksyttävä -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Paikallisten tiedostojen valinta:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "HAK" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "siirry hakemistoon HAK" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "hae purettavat/luotavat nimet TIEDOSTOsta" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T lukee nollaan päättyviä nimiä, poistaa käytöstä -C:n" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "HAHMO" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "jätä pois HAHMOn mukaiset tiedostot" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "jätä pois TIEDOSTOssa listatut hahmot" + +#: src/tar.c:631 +#, fuzzy +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "jätä pois välimuistihakemistot" + +#: src/tar.c:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "jätä pois TIEDOSTOn sisältävät hakemistot" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "jätä pois TIEDOSTOn sisältävät hakemistot" + +#: src/tar.c:639 +#, 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:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "jätä pois TIEDOSTOn sisältävät hakemistot" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "jätä pois TIEDOSTOn sisältävät hakemistot" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "estä automaattinen eteneminen alihakemistoihin" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "pysy nykyisessä tiedostojärjestelmässä arkistoa luotaessa" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "etene alihakemistoihin (oletus)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "älä poista ”/”-merkkiä tiedostonimien alusta" + +#: src/tar.c:656 +#, fuzzy +msgid "follow symlinks; archive and dump the files they point to" +msgstr "seuraa symlinkkejä; " + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "seuraa symlinkkejä; " + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "TIED-NIMI" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "aloita arkiston tiedostosta TIED-NIMI" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "tallenna vain PÄIVÄYS-TAI-TIEDostoa uudemmat tiedostot" + +#: src/tar.c:664 +msgid "DATE" +msgstr "PÄIVÄYS" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "vertaa vain tiedoston muutosaikaa" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "HALLINTA" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "varmuuskopiointi ennen poistoa, valitse versionHALLINTA" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "MERKKIJONO" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +#, fuzzy +msgid "strip NUMBER leading components from file names on extraction" +msgstr "poista MÄÄRÄn verran osia tiedostonimien alusta" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "poisjättäminen ei huomioi kirjainkokoa" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "poisjättöhahmoja verrataan nimen alkuun" + +#: src/tar.c:691 +#, fuzzy +msgid "patterns match after any `/' (default for exclusion)" +msgstr "poisjättöhahmoja verrataan jokaisen ”/”:n jälkeen" + +#: src/tar.c:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "poisjättäminen huomioi kirjainkoon (oletus)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "poisjättöhahmon jokerimerkit eivät täsmää ”/”-merkkiin" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "poisjättöhahmon jokerimerkit vastaavat merkkiä ”/”" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Tietoja antava tuloste:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "listaa käsiteltävät tiedostot" + +#: src/tar.c:711 +#, fuzzy +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "näytä edistymisviesti 10 sekunnin välein" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "näytä viesti, ellei kaikkia linkkejä lisätty" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "näytä tiedostojen muutosajat UTC-aikoina" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "ohjaa monisanainen tuloste TIEDostoon" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "näytä lohkonumero arkistossa viestien yhteydessä" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "kysy varmistusta jokaiselle toiminnolle" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "näytä tarin oletukset" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Yhteensopivuusvalitsimet:" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "Muut valitsimet:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "poista käytöstä joitakin potentiaalisesti vahingollisia valitsimia" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Vain yhtä valitsimista ”-Acdtrux” voi käyttää kerrallaan" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Ristiriitaiset pakkausvalitsimet" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Tuntematon signaalin nimi: %s" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Päiväystiedostoa ei löytynyt" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Korvataan tuntematon päiväysmuoto %2$s arvolla %1$s" + +#: src/tar.c:1022 +#, 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:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: tiedosto on arkistossa, ei lisätä" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: tiedostonimi sisältää nul-merkin" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Kelvolliset argumentit --quoting-style -valitsimille ovat:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Tämä* tar käyttää oletuksena:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Virheellinen lohkomiskerroin" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Virheellinen nauhan pituus" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Annettu useampi kuin yksi kynnyspäiväys" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' ei ole tuettu tällä alustalla" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Virheellinen ryhmä" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Valitsimelle annettiin virheellinen tila" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Virheellinen määrä" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Virheellinen omistaja" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Virheellinen tietueen koko" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Tietueen koon on oltava %d:n monikerta." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Virheellinen osien määrä" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Kelvoton tiheysargumentti: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Tuntematon tiheys: ”%c”" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[TIEDOSTO]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Vanha valitsin ”%c” vaatii argumentin." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "valitsin --occurence on merkityksetön ilman tiedostoluetteloa" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "valitsinta --occurence ei voi käyttää pyydetyssä toimintatilassa" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Usean arkistotiedoston käyttäminen vaatii valitsimen ”-M”" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Valitsimia --listed-incremental ja --newer ei voi käyttää yhdessä" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Moniosaisia arkistoja ei voi tarkastaa" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Pakattuja arkistoja ei voi varmistaa" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Pakattuja moniosaisia arkistoja ei voi käyttää" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Pakattuja arkistoja ei voi liittää toisiinsa" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "Valitsinta --pax-option voi käyttää vain POSIX-arkistoille" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Kieltäydytään pelkurimaisesti luomasta tyhjää arkistoa" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Valitsimet ”-Aru” eivät ole yhteensopivia valitsinten ”-f -” kanssa" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Vähintään yhtä valitsimista ”-Acdtrux” on käytettävä" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Virheellinen ryhmä" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Lukemisen tarkistuspiste %u" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Muut valitsimet:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "luo annetun muotoinen arkisto." + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "pura tiedostot vakiotulosteeseen" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "Luettiin %s tavua arkistosta %s" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T lukee nollatavuun päättyviä nimiä" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "yritä varmistaa arkisto kirjoittamisen jälkeen" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Suorita KOMENTO" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Virheellinen koko: %s" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "I-solmun numero ei ole sallitulla välillä" + +#: tests/genfile.c:248 +#, fuzzy, c-format +msgid "Negative size: %s" +msgstr "Virheellinen koko: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) epäonnistui" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Tuntematon järjestelmävirhe" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARG...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s: Siirtyminen kohtaan %s ei onnistu" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "tiedostonimi sisältää nollatavun" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " tuntematon tiedostotyyppi %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Siirtyminen kohtaan %s ei onnistu" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Komennon suoritus päättyi onnistuneesti\n" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Lapsiprosessi kuoli signaalilla %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Komento keskeytyi signaaliin %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Komento pysähtyi signaaliin %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Komento keskeytyi\n" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Sovitetut tiedostonimet--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "liian monta argumenttia" + +#~ msgid "block size" +#~ msgstr "lohkokoko" + +#, fuzzy +#~ msgid "[.]NUMBER" +#~ msgstr "MÄÄRÄ" + +#~ 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" diff --git a/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000..9781dcb Binary files /dev/null and b/po/fr.gmo differ diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..f270aa1 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2674 @@ +# Messages français pour GNU concernant tar. +# Copyright © 2007 Free Software Foundation, Inc. +# Michel Robitaille , jusqu'en 2004 +# Christophe Combelles , 2007, 2008 +# +msgid "" +msgstr "" +"Project-Id-Version: tar-1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-09 00:26+0100\n" +"Last-Translator: Christophe Combelles \n" +"Language-Team: French \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "Argument %s non valable pour %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "Argument %s ambigu pour %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Les arguments valables sont :" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "ARGP_HELP_FMT : la valeur %s est inférieure ou égale à %s" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s : le paramètre ARGP_HELP_FMT a besoin d'une valeur" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s : le paramètre ARGP_HELP_FMT doit être positif" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s : le paramètre ARGP_HELP_FMT est inconnu" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Déchet dans ARGP_HELP_FMT : %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Les arguments obligatoires ou facultatifs pour les formes longues des " +"options le sont également pour les formes courtes qui leur correspondent." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "Utilisation :" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " ou : " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPTION...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Rapportez toute anomalie à %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Erreur système inconnue" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "Afficher cette aide-mémoire" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "Afficher un court mode d'emploi" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NOM" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "définit le nom du programme" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SECS" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "Bloquer pendant SECS secondes (3600 par défaut)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "Afficher la version du programme" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAM ERROR) Aucune version connue !?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s : trop d'arguments\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAM ERROR) L'option devrait avoir été reconnue !?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "erreur d'écriture" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s : l'option « %s » est ambiguë\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s : l'option « --%s » n'a pas d'argument\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s : l'option « %c%s » n'a pas d'argument\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s : l'option « %s » doit avoir un argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s : l'option « --%s » est inconnue\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s : l'option « %c%s » est inconnue\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s : l'option « -- %c » n'est pas permise\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s : l'option « -- %c » n'est pas valable\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s : l'option « -- %c » a besoin d'un argument\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s : l'option « -W %s » est ambiguë\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s : l'option « -W %s » ne prend pas d'argument\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "mémoire épuisée" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "Impossible d'enregistrer le répertoire de travail actuel" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "Impossible de revenir au répertoire de travail initial" + +#. 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 : la fonction %s a échoué" + +#. 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 : la fonction %s a échoué" + +#: lib/paxerror.c:93 +#, c-format +msgid "%s: Cannot change mode to %s" +msgstr "%s : le mode ne peut pas être changé en %s" + +#: lib/paxerror.c:101 +#, c-format +msgid "%s: Cannot change ownership to uid %lu, gid %lu" +msgstr "%s : le propriétaire ne peut pas être changé en uid %lu, gid %lu" + +#: lib/paxerror.c:127 +#, c-format +msgid "%s: Cannot hard link to %s" +msgstr "%s : impossible de créer un lien physique vers %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 : erreur de lecture à l'octet %s, à la lecture de %lu octet" +msgstr[1] "%s: erreur de lecture à l'octet %s, à la lecture de %lu octets" + +#: 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 : AVERTISSEMENT : erreur de lecture à l'octet %s, à la lecture de %lu " +"octet" +msgstr[1] "" +"%s: AVERTISSEMENT : erreur de lecture à l'octet %s, à la lecture de %lu " +"octets" + +#: lib/paxerror.c:259 +#, c-format +msgid "%s: Cannot seek to %s" +msgstr "%s : Positionnement à %s impossible" + +#: lib/paxerror.c:275 +#, c-format +msgid "%s: Warning: Cannot seek to %s" +msgstr "%s : AVERTISSEMENT : positionnement à %s impossible" + +#: lib/paxerror.c:284 +#, c-format +msgid "%s: Cannot create symlink to %s" +msgstr "%s : un lien symbolique ne peut pas être créé 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 : seulement %lu octet sur %lu a été écrit" +msgstr[1] "%s: seulement %lu octets sur %lu ont été écrits" + +#: lib/paxnames.c:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Suppression de « %s » au début des noms des membres" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Suppression de « %s » au début des liens physiques" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Remplacement des noms vides par « . » pour les membres" + +#: lib/paxnames.c:170 +msgid "Substituting `.' for empty hard link target" +msgstr "Remplacement des cibles vides par « . » pour les liens physiques" + +#. 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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "« " + +#: lib/quotearg.c:267 +msgid "'" +msgstr " »" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[oO]" + +#: lib/rpmatch.c:72 +msgid "^[nN]" +msgstr "^[nN]" + +#: 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 "Impossible de lancer un interpréteur de commandes distant" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Licence GPLv3+ : GNU GPL version 3 ou ultérieure \n" +"Ceci est un logiciel libre : vous êtes libre de le modifier et de le " +"redistribuer.\n" +"Il est fourni SANS GARANTIE, dans la mesure de ce que permet la loi.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Écrit par %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Écrit par %s et %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Écrit par %s, %s et %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Écrit par %s, %s, %s\n" +"et %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s et %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s, %s et %s.\n" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s, %s, %s et %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s, %s, %s, %s\n" +"et %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s et %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Écrit par %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s et d'autres personnes.\n" + +#: rmt/rmt.c:142 +msgid "Input string too long" +msgstr "Chaîne trop longue en entrée" + +#: rmt/rmt.c:161 +msgid "Number syntax error" +msgstr "Erreur de syntaxe de nombre" + +#: rmt/rmt.c:180 +msgid "rmtd: Cannot allocate buffer space\n" +msgstr "rmtd : impossible de réserver un espace tampon\n" + +#: rmt/rmt.c:182 +msgid "Cannot allocate buffer space" +msgstr "Impossible de réserver un espace tampon" + +#: rmt/rmt.c:304 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Pour en savoir davantage, tapez : « %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 "" +"Utilisation : %s [OPTION]\n" +"Ce programme permet de manipuler un lecteur de cartouches en recevant des " +"commandes d'un processus distant.\n" +"\n" +" --version afficher le nom et la version du programme\n" +" --help afficher cette aide-mémoire\n" + +#: rmt/rmt.c:315 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapportez toute anomalie à <%s>.\n" + +#: rmt/rmt.c:397 +msgid "Seek offset error" +msgstr "Erreur de positionnement relatif" + +#: 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 de positionnement hors plage" + +#: rmt/rmt.c:472 +msgid "rmtd: Premature eof\n" +msgstr "rmtd : fin de fichier prématurée\n" + +#: rmt/rmt.c:474 +msgid "Premature end of file" +msgstr "Fin de fichier prématurée" + +#: rmt/rmt.c:672 +msgid "Garbage command" +msgstr "Commande rejetée" + +#: src/buffer.c:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Nombre total d'octets écrits" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Nombre total d'octets lus" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Nombre total d'octets effacés : %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(tube)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valeur incorrecte pour « record_size »" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Aucun nom d'archive donné" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "" +"Une archive utilisant l'entrée/sortie standard ne peut pas être vérifiée" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "L'archive est compressée. Utilisez l'option %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Une archive compressée ne peut pas être mise à jour" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Début de la cartouche atteinte ; arrêt du programme." + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Trop d'erreurs, arrêt du programme." + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" +"Impossible de reculer dans le fichier d'archive ; il se peut qu'il soit " +"illisible sans l'option « -i »" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek ne s'est pas arrêté à une limite d'enregistrement" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s : contient un numéro de volume non valable" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Débordement du numéro de volume" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Préparez le volume n°%d pour %s et appuyez sur Entrée : " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "" +"Fin de fichier rencontrée alors qu'une réponse de l'utilisateur était " +"attendue" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "AVERTISSEMENT : l'archive est incomplète" + +#: src/buffer.c:934 +#, 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 les prochains volumes\n" +" q Arrêter tar\n" +" y ou newline Continuer le traitement\n" + +#: src/buffer.c:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Générer un sous-shell\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Afficher cette liste\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Pas de nouveau volume ; fin du traitement.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Nom de fichier non spécifié. Essaye encore :).\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Données non valables en entrée. Tapez « ? » pour obtenir de l'aide.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Échec de la commande %s" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" +"La suite de %s est probablement sur ce volume : l'en-tête contient un nom " +"tronqué." + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "La suite de %s n'est pas sur ce volume." + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s a une taille incorrecte (%s != %s + %s)." + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Ce volume est hors séquence." + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Archive non étiquetée pour correspondre à %s." + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Le volume %s ne correspond pas à %s." + +#: src/buffer.c:1372 +#, c-format +msgid "" +"%s: file name too long to be stored in a GNU multivolume header, truncated" +msgstr "" +"%s : nom de fichier tronqué, car trop long pour être stocké dans un 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] "Seulement %lu octet sur %lu a pu être lu" +msgstr[1] "Seulement %lu octets sur %lu ont pu être lus" + +#: src/compare.c:106 src/compare.c:388 +msgid "Contents differ" +msgstr "Les contenus sont différents." + +#: src/compare.c:132 src/extract.c:790 src/incremen.c:1329 src/list.c:372 +#: src/list.c:1314 +msgid "Unexpected EOF in archive" +msgstr "Fin prématurée 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 "Le type de fichier est différent." + +#: src/compare.c:183 src/compare.c:203 src/compare.c:328 +msgid "Mode differs" +msgstr "Le mode est différent." + +#: src/compare.c:206 +msgid "Uid differs" +msgstr "L'UID est différent." + +#: src/compare.c:208 +msgid "Gid differs" +msgstr "Le GID est différent." + +#: src/compare.c:212 +msgid "Mod time differs" +msgstr "La date de modification est différente." + +#: src/compare.c:216 src/compare.c:420 +msgid "Size differs" +msgstr "La taille est différente." + +#: src/compare.c:270 +#, c-format +msgid "Not linked to %s" +msgstr "N'est pas lié à %s." + +#: src/compare.c:293 +msgid "Symlink differs" +msgstr "Le lien symbolique est différent." + +#: src/compare.c:322 +msgid "Device number differs" +msgstr "Le numéro de périphérique est différent." + +#: src/compare.c:462 +#, c-format +msgid "Verify " +msgstr "Vérification " + +#: src/compare.c:469 +#, c-format +msgid "%s: Unknown file type `%c', diffed as normal file" +msgstr "" +"%s : type de fichier inconnu « %c », recherche de différence comme pour un " +"fichier normal" + +#: src/compare.c:524 +msgid "Archive contains file names with leading prefixes removed." +msgstr "L'archive contient des noms de fichiers dont le préfixe a été enlevé" + +#: 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 non valable détecté." +msgstr[1] "ÉCHEC DE VÉRIFICATION : %d en-têtes non valables détectés." + +#: src/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Bloc zéro solitaire repéré à %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s : contient une étiquette de répertoire cache %s ; %s" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "Valeur %s en dehors de la plage de %s : %s..%s ; remplacement par %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "Valeur %s en dehors de la plage de %s : %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Génération d'en-têtes octaux négatifs" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s : le nom de fichier est trop long (%d max) ; fichier non archivé" + +#: src/create.c:634 +#, 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é) ; fichier non " +"archivé" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s : le nom du lien est trop long ; fichier non archivé" + +#: src/create.c:1076 +#, 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 : fichier réduit de %s octet ; remplissage avec des zéros" +msgstr[1] "%s : fichier réduit de %s octets ; remplissage avec des zéros" + +#: src/create.c:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "" +"%s : le fichier est sur un système de fichiers différent ; fichier non " +"archivé" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "contenu non archivé" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s : type de fichier inconnu ; fichier ignoré" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Liens manquants vers %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s : le fichier n'est pas modifié ; fichier non archivé" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s : le fichier est l'archive elle-même ; fichier non archivé" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s : fichier supprimé avant d'avoir été lu" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "répertoire non archivé" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s : fichier modifié pendant sa lecture" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s : socket ignorée" + +#: src/create.c:1744 +#, c-format +msgid "%s: door ignored" +msgstr "%s : porte ignorée" + +#: src/delete.c:216 src/list.c:181 src/update.c:170 +msgid "Skipping to next header" +msgstr "On saute à l'en-tête suivant" + +#: src/delete.c:281 +msgid "Deleting non-header from archive" +msgstr "Suppression d'un « non en-tête » de l'archive" + +#: src/extract.c:198 +#, c-format +msgid "%s: implausibly old time stamp %s" +msgstr "%s : l'horodatage %s est trop vieux pour être plausible" + +#: src/extract.c:215 +#, c-format +msgid "%s: time stamp %s is %s s in the future" +msgstr "%s : l'horodatage %s est situé %s secondes dans le futur." + +#: src/extract.c:395 +#, c-format +msgid "%s: Unexpected inconsistency when making directory" +msgstr "%s : incohérence inattendue lors de 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'extraction de son état" + +#: src/extract.c:724 +msgid "Extracting contiguous files as regular files" +msgstr "Extraction des fichiers contigus comme des fichiers réguliers" + +#: src/extract.c:1000 +msgid "Attempting extraction of symbolic links as hard links" +msgstr "Tentative d'extraction des liens symboliques comme des liens physiques" + +#: 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 : extraction impossible (morceau de fichier issu d'un autre volume)" + +#: src/extract.c:1153 src/list.c:1081 +msgid "Unexpected long name header" +msgstr "En-tête à nom long inattendu" + +#: src/extract.c:1159 +#, 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 +#, c-format +msgid "Current %s is newer or same age" +msgstr "Le %s actuel est au moins aussi récent" + +#: src/extract.c:1230 +#, c-format +msgid "%s: Was unable to backup this file" +msgstr "%s : impossible d'archiver ce fichier." + +#: src/extract.c:1358 +#, c-format +msgid "Cannot rename %s to %s" +msgstr "Impossible de renommer %s en %s" + +#: src/extract.c:1370 +#, c-format +msgid "Error is not recoverable: exiting now" +msgstr "Erreur non récupérable : arrêt du traitement" + +#: src/incremen.c:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s : le répertoire a été renommé depuis %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s : le répertoire a été renommé." + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s : le répertoire est nouveau." + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Horodatage non valable" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Temps de modification non valable (secondes)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Temps de modification non valable (nanosecondes)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Numéro de périphérique non valable" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Numéro d'inode non valable" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Champ trop long rencontré pendant la lecture du fichier d'instantané" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Erreur de lecture du fichier d'instantané" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Fin prématurée du fichier d'instantané" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Valeur de champ inattendue dans le fichier d'instantané" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Terminaison de champ manquante" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Mauvais format de fichier incrémental" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Version non prise en charge pour le format incrémental : %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "dumpdir incorrect : « %c » était attendu mais %#3o a été trouvé" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "dumpdir incorrect : « X » en double" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "dumpdir incorrect : nom vide dans « R »" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "dumpdir incorrect : « T » non précédé de « R »" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "dumpdir incorrect : nom vide dans « T »" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "dumpdir incorrect : fin des données trouvées au lieu de « %c »" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "dumpdir incorrect : « X » n'a jamais été utilisé" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Impossible de créer un répertoire temporaire utilisant le modèle %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s : répertoire non purgé : impossible d'évaluer par stat()" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "" +"%s : le répertoire est sur un autre périphérique : répertoire non purgé" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s : suppression de %s\n" + +#: src/incremen.c:1569 +#, c-format +msgid "%s: Cannot remove" +msgstr "%s : suppression impossible" + +#: 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: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 de type %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 "" +"La valeur octale de l'archive %.*s est en dehors de la plage de %s ; " +"complément à 2 supposé" + +#. 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 "La valeur octale de l'archive %.*s est en dehors de la plage de %s" + +#: src/list.c:749 +msgid "Archive contains obsolescent base-64 headers" +msgstr "L'archive contient des en-têtes obsolètes en base 64." + +#: src/list.c:763 +#, c-format +msgid "Archive signed base-64 string %s is out of %s range" +msgstr "Une chaîne en base 64 signée %s de l'archive est hors de la plage %s" + +#: src/list.c:794 +#, c-format +msgid "Archive base-256 value is out of %s range" +msgstr "Une 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 de type %s est " +"attendue." + +#. 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 "La valeur de l'archive %s est hors des limites de %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 "--Lien long--\n" + +#: src/list.c:1247 +#, c-format +msgid "--Long Name--\n" +msgstr "--Nom long--\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 "%s renommé en %s\n" + +#: src/misc.c:465 src/misc.c:483 +#, c-format +msgid "%s: Cannot rename to %s" +msgstr "%s : impossible de renommer en %s" + +#: src/misc.c:488 +#, c-format +msgid "Renaming %s back to %s\n" +msgstr "%s finalement renommé en %s\n" + +#: src/misc.c:615 +msgid "Cannot save working directory" +msgstr "Le répertoire de travail ne peut pas être sauvegardé" + +#: src/misc.c:621 +msgid "Cannot change working directory" +msgstr "Impossible de changer 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 "" +"Caractères de correspondance de motif utilisé dans le nom de fichier. " +"Veuillez " + +#: src/names.c:601 +msgid "use --wildcards to enable pattern matching, or --no-wildcards to" +msgstr "" +"utiliser « --wildcards » pour activer la correspondance de motif ou « --no-" +"wildcards » pour" + +#: src/names.c:603 +msgid "suppress this warning." +msgstr "supprimer cet avertissement." + +#: src/names.c:618 src/names.c:636 +#, c-format +msgid "%s: Not found in archive" +msgstr "%s : non trouvé dans l'archive" + +#: src/names.c:621 +#, c-format +msgid "%s: Required occurrence not found in archive" +msgstr "%s : occurence requise non trouvée dans l'archive" + +#: src/tar.c:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "" +"Les options « -%s » et« -%s » nécessitent toutes les deux l'entrée standard." + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s : format d'archive non valable" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "" +"Fonctionnalités de type GNU demandées pour un format d'archive incompatible." + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" +"Type de protection de caractères inconnu « %s ». Essayez « %s --quoting-" +"style=help » pour avoir une liste." + +#: src/tar.c:334 +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 "" +"Le programme « tar » de GNU permet de sauvegarder une grande quantité de " +"fichiers dans une unique archive sur disque ou sur cartouche et de récupérer " +"ces fichiers depuis l'archive de manière individuelle.\n" +"\n" +"Exemples :\n" +" tar -cf archive.tar foo bar # Crée le fichier archive.tar à partir de foo " +"et bar.\n" +" tar -tvf archive.tar # Liste tous les fichiers de archive.tar de " +"manière détaillée.\n" +" tar -xf archive.tar # Extrait tous les fichiers de archive.tar.\n" + +#: src/tar.c:343 +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 "" +"Le suffixe de sauvegarde est « ~ », à moins qu'il ne soit défini avec « --" +"suffix » ou SIMPLE_BACKUP_SUFFIX.\n" +"Le contrôle de version peut être défini avec « --backup » ou VERSION_CONTROL, " +"les valeurs sont :\n" +"\n" +" none, off Ne jamais faire de sauvegarde.\n" +" t, numbered Faire des sauvegardes numérotées.\n" +" nil, existing Numérotées si déjà numérotées, sinon simples.\n" +" never, simple Faire toujours des sauvegardes simples.\n" + +#: src/tar.c:369 +msgid "Main operation mode:" +msgstr "Mode d'opération principal :" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "Afficher le contenu de l'archive" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "Extraire les fichiers de l'archive" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "Créer une nouvelle archive" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "Trouver les différences entre l'archive et le système de fichiers" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "Ajouter des fichiers à la fin de l'archive" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" +"Ajouter seulement les fichiers plus récents que les copies présentes dans " +"l'archive" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "Ajouter des fichiers tar à une archive" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "Effacer de l'archive (pas sur les bandes magnétiques !)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "Tester l'étiquette du volume d'archive et terminer" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modificateurs d'opération :" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" +"Économiser efficacement l'espace dans les fichiers dispersés (fichiers à " +"trous)" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAJEUR[.MINEUR]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" +"Définir la version du format de dispersion à utiliser (implique « --sparse Â»)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "Prendre en charge les sauvegardes incrémentales à l'ancien format GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FICHIER" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "Prendre en charge les sauvegardes incrémentales au nouveau format GNU" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "Ne pas s'arrêter à cause des non-zéros sur les fichiers illisibles" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NOMBRE" + +#: src/tar.c:409 +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 l'occurrence n°NOMBRE de chaque fichier dans l'archive ; " +"cette option n'est valable qu'accompagnée de l'une des sous-commandes « --" +"delete », « --diff », « --extract » ou « --list » et lorsqu'une liste de " +"fichiers est fournie soit sur la ligne de commande, soit avec l'option « -T " +"». NOMBRE vaut 1 par défaut." + +#: src/tar.c:415 +msgid "archive is seekable" +msgstr "L'archive peut être parcourue" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Contrôle de l'écrasement :" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "Tenter de vérifier l'archive après écriture" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "Supprimer les fichiers après les avoir ajoutés à l'archive" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "Ne pas écraser les fichiers préexistants lors de l'extraction" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" +"Ne pas écraser les fichier préexistants qui sont plus récents que leur copie " +"dans l'archive" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "Écraser les fichiers préexistants lors de l'extraction" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "Effacer chaque fichier préexistant avant l'extraction" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "Vider les hiérarchies avant d'extraire les répertoires" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "Préserver les métadonnées des répertoires préexistants" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"Écraser les métadonnées des répertoires préexistants lors de l'extraction " +"(comportement par défaut)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Choix du flux de sortie :" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "Extraire les fichiers vers la sortie standard" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "COMMANDE" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "Renvoyer par tube les fichiers extraits vers un autre programme" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "Ignorer les codes de retour des processus enfants" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" +"Traiter les codes de retours non nuls des processus enfants comme des erreurs" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Traitement des attributs de fichiers :" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "Utiliser NOM comme propriétaire des fichiers ajoutés" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "Utiliser NOM comme groupe des fichiers ajoutés" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATE-OU-FICHIER" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" +"Définir la date de modification des fichiers ajoutés avec DATE-OU-FICHIER" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "CHANGEMENTS" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" +"Utiliser les CHANGEMENTS de mode (symboliques) pour les fichiers ajoutés" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "MÉTHODE" + +#: src/tar.c:477 +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 "" +"Préserve la date d'accès des fichiers archivés, soit en la restaurant après " +"lecture (MÉTHODE = « replace » par défaut) ou en ne définissant pas les dates " +"initialement (MÉTHODE = « system »)" + +#: src/tar.c:481 +msgid "don't extract file modified time" +msgstr "Ne pas extraire la date de modification du fichier" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "Essayer d'extraire les fichiers avec le même propriétaire" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "Vous approprier les fichiers extraits" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "Toujours utiliser les valeurs numériques des utilisateurs/groupes" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"Extraire les informations de permissions sur les fichiers (par défaut pour " +"le superutilisateur)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"Appliquer l'umask de l'utilisateur lors de l'extraction des permissions (par " +"défaut pour les utilisateurs normaux)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "Trier les noms à extraire dans le même ordre que l'archive" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "Équivalent à « -p -s » à la fois" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"Reporter à la fin de l'extraction le changement des dates de modification et " +"des permissions des répertoires extraits" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "Annule l'effet de l'option « --delay-directory-restore »" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Sélection et option de périphérique :" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIVE" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "Utiliser le fichier ou le périphérique ARCHIVE" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "Utiliser la COMMANDE rmt fournie au lieu de rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "Utiliser la COMMANDE distante à la place de rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "Spécifier le lecteur et la densité" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "Créer/lister/extraire une archive multi-volumes" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "Changer de cartouche après avoir écrit NOMBRE x 1024 octets" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "Exécuter le script à la fin de chaque cartouche (implique « -M »)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "Utiliser/mettre à jour le numéro de volume dans le FICHIER" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blocs du périphérique :" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOCS" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOCS x 512 octets par enregistrement" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "NOMBRE d'octets par enregistrement (multiple de 512)" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "Ignorer les blocs de zéros dans l'archive (càd EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "Refaire les blocs pendant la lecture (pour les tubes BSD 4.2)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Sélection du format d'archive :" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "Créer l'archive au format désiré." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT peut prendre une des valeurs suivantes :" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "Vieux format tar V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "Format GNU issu de tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "Format GNU tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "Format POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "Format POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "Identique à pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "Identique à « --format=v7 »" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "Identique à « --format=posix »" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "mot_clé[[:]=valeur][,mot_clé[[:]=valeur]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "Mots-clés de contrôle pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEXTE" + +#: src/tar.c:587 +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 en attribuant le TEXTE au nom de volume. À la lecture ou à " +"l'extraction, utiliser le TEXTE comme motif de correspondance (glob) au nom " +"de volume." + +#: src/tar.c:592 +msgid "Compression options:" +msgstr "Options de compression :" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" +"Utiliser le suffixe de l'archive pour déterminer le programme de compression" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "Filtrer l'archive à travers « bzip2 »" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "Filtrer l'archive à travers « gzip »" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "Filtrer l'archive à travers « compress »" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "Filtrer l'archive à travers « lzma »" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "Filtrer à travers le PROG (doit accepter l'option « -d »)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Sélection des fichiers locaux :" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" +"Ajouter le FICHIER donné à l'archive (utile si son nom commence par un tiret)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "RÉP" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "Utiliser RÉP comme répertoire de travail" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "Lire depuis le FICHIER la liste des noms à extraire ou à créer" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" +"« -T » permet de lire les noms terminés par un NULL et désactive l'option « -C " +"»" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"Enlever la protection de caractères des noms de fichiers lus avec « -T » (par " +"défaut)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" +"Ne pas enlever la protection de caractères des noms de fichiers lus avec « -T " +"»" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MOTIF" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "Exclure les fichiers correspondant au MOTIF" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "Exclure les motifs listés dans le FICHIER" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"Exclure le contenu des répertoires contenant CACHEDIR.TAG, sauf le fichier " +"de tag lui-même" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "Tout exclure dans les répertoires contenant CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "Exclure les répertoires contenant CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"Exclure le contenu des répertoires contenant le FICHIER, sauf le FICHIER lui-" +"même" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "Tout exclure dans les répertoires contenant le FICHIER" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "Exclure les répertoires contenant le FICHIER" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "Exclure les répertoires de contrôle de version (CVS, .svn, etc.)" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "Empêcher la descente automatique dans les sous-répertoires" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" +"Rester dans le système de fichiers local lors de la création de l'archive" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "Parcourir les sous-répertoires de manière récursive (par défaut)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "Ne pas enlever le « / » au début des noms de fichiers" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" +"Suivre les liens symboliques ; archiver les fichiers vers lesquels ils " +"pointent" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"Suivre les liens physiques : archiver les fichiers vers lesquels ils pointent" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NOM-DE-MEMBRE" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "Débuter au NOM-DE-MEMBRE dans l'archive" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "Stocker seulement les fichiers plus récents que DATE-OU-FICHIER" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATE" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "Ne comparer que la date et l'heure de modification des données" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTRÔLE" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" +"Faire une copie de sauvegarde avant suppression, choisir le CONTRÔLE de " +"version" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "CHAÎNE" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"Faire une copie de sauvegarde avant suppression, en remplaçant le suffixe " +"habituel (« ~ » sauf s'il est définit par la variable d'environnement " +"SIMPLE_BACKUP_SUFFIX)" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Transformation des noms de fichiers :" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" +"Supprimer NOMBRE composants au début des noms de fichiers à l'extraction" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "EXPRESSION" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" +"Utiliser l'EXPRESSION de remplacement « sed » pour transformer les noms de " +"fichiers" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Options de correspondance de noms de fichiers (pour les motifs d'exclusion " +"et d'inclusion)" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "Ignorer la casse (majuscules/minuscules)" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "Les motifs doivent correspondre au début des noms de fichiers" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" +"Les motifs peuvent correspondre après n'importe quel « / » (par défaut pour " +"l'exclusion)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "Correspondance sensible à la casse (comportement par défaut)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" +"Utiliser des caractères de correspondance (par défaut pour l'exclusion)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "Correspondance exacte de chaîne" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "« / » ne correspond à aucun caractère de correspondance" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" +"« / » peut correspondre à un caractère de correspondance (par défaut pour " +"l'exclusion)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Options d'affichage :" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "Afficher de manière détaillée les fichiers traités" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" +"Afficher un message de progression tous les NOMBRE enregistrements (10 par " +"défaut)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "ACTION" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "exécuter l'ACTION à chaque point de contrôle" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" +"Afficher un message si tous les liens n'ont pas pu être suivis et archivés" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAL" + +#: src/tar.c:719 +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 "" +"Afficher le nombre total d'octets après traitement de l'archive. Avec un " +"argument, afficher ce nombre si le SIGNAL est émis. Les signaux permis " +"sont : SIGHUP, SIGQUIT, SIGINT, SIGUSR1 et SIGUSR2. Les noms sans préfixe « " +"SIG » sont aussi acceptés" + +#: src/tar.c:724 +msgid "print file modification dates in UTC" +msgstr "Afficher les dates de modification de fichier en UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "Envoyer la sortie détaillée vers le FICHIER" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "Afficher le numéro du bloc de l'archive avec chaque message" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "Demander confirmation pour chaque action" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "Afficher les paramètres par défaut de tar" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "Afficher les noms des fichiers ou des archives après transformation" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STYLE" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" +"Définir le style de protection de caractères appliqués aux noms. Voir ci-" +"dessous pour les valeurs du STYLE" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "Protéger aussi les caractères faisant partie de la CHAÎNE" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "Enlever la protection des caractères faisant partie de la CHAÎNE" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Options de compatibilité :" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Autres options :" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "Désactiver certaines options potentiellement néfastes" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Options de compression non compatibles entre elles" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Type de signal inconnu : %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Fichier d'échantillon de date non trouvé" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Remplacement par %s du format de date inconnu %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Option %s : date « %s » traitée comme %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s : la liste de fichiers est déjà lue" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s : le nom de fichier lu contient un caractère nul" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Les arguments valables pour les options « --quoting-style » sont :" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Les valeurs par défaut de *ce* tar sont :\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Facteur de bloc non valable" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" +"AVERTISSEMENT : l'option « -I » n'est pas prise en charge. Vous vouliez peut-" +"être utiliser « -j » ou « -T » ?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Longueur de cartouche non valable" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Plus d'une date seuil" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Version de la dispersion non valable" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" +"--atime-preserve='system' n'est pas pris en charge sur cette plateforme" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "la valeur de « --checkpoint » n'est pas un entier" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s : groupe non valable" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Mode non valable donné en option" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Nombre non valable" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Propriétaire non valable" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Taille d'enregistrement non valable" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "La taille d'un enregistrement doit être un multiple de %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Nombre d'éléments incorrect" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Une seule option « --to-command » est permise" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Argument de densité incorrect : %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Densité inconnue : « %c »" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "Les options « -[0-7][lmh] » ne sont pas prises en charge par *ce* tar" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[FICHIER]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "L'ancienne option « %c » a besoin d'un argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence n'a pas de sens sans une liste de fichiers" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "« --occurrence » ne peut être utilisée dans le mode d'opération demandé" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Les fichiers d'archives multiples ont besoin de l'option « -M »" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Impossible de combiner « --listed-incremental » avec « --newer »" + +#: src/tar.c:2254 +#, 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'étiquette du volume est trop longue (la limite est %lu octet)" +msgstr[1] "" +"%s: l'étiquette du volume est trop longue (la limite est %lu octets)" + +#: src/tar.c:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Impossible de vérifier des archives multi-volumes" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Impossible de vérifier des archives compressées" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Impossible d'utiliser des archives multi-volumes compressées" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Impossible de concaténer des archives compressées" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option peut être utilisée uniquement avec des archives POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Je refuse de créer un fichier d'archive vide (oui je suis lâche)" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Les options « -Aru » sont incompatibles avec « -f - »" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Vous devez choisir une des options « -Acdtrux » " + +#: src/tar.c:2483 +#, c-format +msgid "Error exit delayed from previous errors" +msgstr "Des erreurs ont provoqué l'arrêt du programme" + +#: 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 +#, c-format +msgid "Keyword %s is unknown or not yet implemented" +msgstr "Le mot clé %s est inconnu ou n'est pas encore implémenté" + +#: src/xheader.c:184 +#, c-format +msgid "Pattern %s cannot be used" +msgstr "Le motif %s ne peut être utilisé" + +#: src/xheader.c:194 +#, c-format +msgid "Keyword %s cannot be overridden" +msgstr "Le mot clé %s ne peut pas être surdéfini" + +#: src/xheader.c:498 +msgid "Malformed extended header: missing length" +msgstr "En-tête étendu incorrect : longueur manquante" + +#: src/xheader.c:506 +msgid "Extended header length is out of allowed range" +msgstr "La longueur de l'en-tête étendu est hors plage" + +#: src/xheader.c:513 +#, c-format +msgid "Extended header length %*s is out of range" +msgstr "La longueur de l'en-tête étendu %*s est hors plage" + +#: src/xheader.c:525 +msgid "Malformed extended header: missing blank after length" +msgstr "En-tête étendu incorrect : espace blanche manquante après la longueur" + +#: src/xheader.c:533 +msgid "Malformed extended header: missing equal sign" +msgstr "En-tête étendu incorrect : signe d'égalité manquant" + +#: src/xheader.c:539 +msgid "Malformed extended header: missing newline" +msgstr "En-tête étendu incorrect : retour à la ligne manquant" + +#: src/xheader.c:576 +#, c-format +msgid "Ignoring unknown extended header keyword `%s'" +msgstr "Le mot clé inconnu « %s » pour l'en-tête étendu a été ignoré" + +#: src/xheader.c:780 +#, c-format +msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)" +msgstr "" +"La paire mot clé/valeur générée est trop longue (keyword=%s, length=%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 "L'en-tête étendu %s=%s est hors plage %s..%s" + +#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287 +#, c-format +msgid "Malformed extended header: invalid %s=%s" +msgstr "En-tête étendu incorrect : %s=%s non valable" + +#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315 +#, c-format +msgid "Malformed extended header: excess %s=%s" +msgstr "En-tête étendu incorrect : %s=%s en trop" + +#: src/xheader.c:1328 +#, c-format +msgid "Malformed extended header: invalid %s: unexpected delimiter %c" +msgstr "En-tête étendu incorrect : %s non valable : délimiteur %c non prévu" + +#: src/xheader.c:1338 +#, c-format +msgid "Malformed extended header: invalid %s: odd number of values" +msgstr "En-tête étendu incorrect : %s non valable : nombre impair de valeurs" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s : délai d'expiration non valable" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s : action de point de contrôle inconnue" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "écriture" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "lecture" + +#. 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/checkpoint.c:222 +#, c-format +msgid "Write checkpoint %u" +msgstr "Point de contrôle d'écriture %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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Point de contrôle de lecture %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile permet de manipuler des fichiers de données pour la suite de tests " +"GNU paxutils.\n" +"Les options sont :\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Options de création de fichier :" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "TAILLE" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Créer le fichier à la TAILLE donnée" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Écrire dans le fichier NOM, plutôt que sur la sortie standard" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Lire les noms de fichier depuis le FICHIER" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T permet de lire les noms terminés par un NULL" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"Remplir le fichier avec le MOTIF donné. MOTIF est « default » ou « zeros »" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Taille d'un bloc pour le fichier dispersé" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"Générer un fichier dispersé (avec des trous). Le reste de la ligne de " +"commande définit la carte du fichier." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "DÉCALAGE" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Se déplacer du DÉCALAGE donné avant d'écrire des données" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Options des statistiques de fichiers :" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" +"Afficher le contenu des structures « stat » pour chaque fichier donné. Le " +"FORMAT par défaut est :" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Options d'exécution synchrone :" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Exécuter la COMMANDE donnée. Utile avec « --checkpoint » et l'une des options " +"« --cut », « --append » ou « --touch »" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" +"Exécuter l'action donnée (voir plus bas) dès qu'un point de contrôle NOMBRE " +"est atteint" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Définir la date pour la prochaine option « --touch »" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" +"Afficher les points de contrôle exécutés et les codes de sortie de la " +"COMMANDE" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Actions d'exécution synchrone. Celles-ci sont exécutées lorsque le numéro du " +"point de contrôle donné par « --checkpoint » est atteint." + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Tronquer le FICHIER à la taille donnée par la précédente option « --length " +"» (ou 0 si elle n'est pas fournie)." + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" +"Ajouter TAILLE octets au FICHIER. La TAILLE est fournie par la précédente " +"option « --length »" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Mettre à jour les dates d'accès et de modification du FICHIER" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Exécuter la COMMANDE" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Taille non valable : %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Nombre en dehors de la plage permise : %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Taille négative : %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "La fonction stat(%s) a échoué" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Erreur à la lecture du nombre près de « %s »" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Format de date inconnu" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGS...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "Impossible d'ouvrir « %s »" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "Impossible à parcourir" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "Le nom de fichier contient un caractère nul" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"Un fichier dispersé ne peut pas être généré sur la sortie standard. Utilisez " +"l'option « --file »" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "Masque incorrect (près de « %s »)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Champ inconnu « %s »" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "Impossible de définir la date de « %s »" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "La commande s'est terminée correctement\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "La commande a échoué avec le code %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "La commande s'est terminée sur le signal %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "La commande s'est interrompue sur le signal %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "La commande a généré un core dump\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "La commande s'est terminée\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat nécessite un nom de fichier" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "trop d'arguments" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]NOMBRE" diff --git a/po/ga.gmo b/po/ga.gmo new file mode 100644 index 0000000..c7a0128 Binary files /dev/null and b/po/ga.gmo differ diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..88c2b49 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,2770 @@ +# Irish translations for tar. +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. +# Kevin Patrick Scannell , 2003, 2004, 2006, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2007-10-15 08:53-0600\n" +"Last-Translator: Kevin Scannell \n" +"Language-Team: Irish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argóint neamhbhailí %s chun %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argóint dhébhríoch %s chun %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Na hargóintí bailí:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Paraiméadar anaithnid ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Bruscar i ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Úsáid:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " nó: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [ROGHA...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Seol tuairiscí fabhtanna chuig %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Earráid anaithnid chórais" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "taispeáin an chabhair seo" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "taispeáin beagán eolais faoin úsáid" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "AINM" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "socraigh ainm an chláir" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SOIC" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "moill de SOIC soicind (réamhshocrú: 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "taispeáin leagan an chláir" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(EARRÁID RÍOMHCHLÁIR) Gan leagan!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: An iomarca argóintí\n" + +#: lib/argp-parse.c:754 +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/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Tá an rogha `%s' débhríoch\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, 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:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: rogha anaithnid `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: rogha anaithnid `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: rogha neamhcheadaithe -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: rogha neamhbhailí -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, 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:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Tá an rogha `-W %s' débhríoch\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "cuimhne ídithe" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Ní féidir an chomhadlann reatha a athrú" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Ní féidir an chomhadlann reatha a shábháil" + +#. 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: Theip ar fheidhm %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: Theip ar fheidhm %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 dhéanamh 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 bheart" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Gach `%s' tosaigh á bhaint amach as ainmneacha baill" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Gach `%s' tosaigh á bhaint amach as spriocanna na nasc crua" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Ag cur `.' in ionad ainm baill folamh" + +#: lib/paxnames.c:170 +msgid "Substituting `.' for empty hard link target" +msgstr "Ag cur `.' in ionad sprioc fholamh den nasc 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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yYiIsS]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Bearta scríofa go hiomlán" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Bearta léite go hiomlán" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Bearta scriosta go hiomlán: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(píopa)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Luach neamhbhailí do record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Ní thugtar ainm na cartlainne" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Ní féidir cartlann stdin/stdout a fhíorú" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Is cartlann chomhbhrúite í seo. Úsáid an rogha %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Ní féidir cartlanna comhbhrúite a nuashonrú" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Tosach na téipe, ag scor anois" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "An iomarca earráidí, ag scor" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "Níor stopadh rmtlseek ag teorainn taifid" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: tá uimhir imleabhair neamhbhailí ann" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Uimhir imleabhair thar maoil" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Fuarthas comhadchríoch in áit freagra ón úsáideoir" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "RABHADH: Tá an chartlann neamhiomlán" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Sceith fobhlaosc\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Priontáil an liosta seo\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Níl aon imleabhar nua; ag scor.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Ainm an chomhaid gan sonrú. Bain triail eile as.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Ionchur neamhbhailí. Iontráil ? chun cabhair a fháil.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Theip ar ordú %s" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "Ní leanann %s ar an imleabhar seo" + +#: src/buffer.c:1217 +#, 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:1227 +msgid "This volume is out of sequence" +msgstr "Tá an t-imleabhar seo as ord" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Lipéad ar chartlann nach comhoiriúnaithe le %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Níl an t-imleabhar %s comhoiriúnaithe le %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Bloc nialasach scoite ag %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: tá clib chomhadlainne taisce %s ann; %s" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "tá an luach %s as raon %s: %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Ceanntásca ochtnártha diúltacha á gcruthú" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: ainm comhaid rófhada (uasmhéid %d); gan dumpáil" + +#: src/create.c:634 +#, 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); gan dumpáil" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: ainm naisc rófhada; gan dumpáil" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: is ar chóras comhad eile é an comhad; gan dumpáil" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "ábhar gan dumpáil" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Cineál anaithnid comhaid; ag déanamh neamhshuim air" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Naisc le %s ar iarraidh.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: comhad gan athrú; gan dumpáil" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: is ionann é agus an chartlann féin; gan dumpáil" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Scriosadh an comhad sular léadh é" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "níor dumpáladh an chomhadlann" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: athraíodh an comhad agus á léamh" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: rinneadh neamhshuim ar an soicéad" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Athainmníodh an chomhadlann ó %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Athainmníodh an chomhadlann" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Comhadlann nua" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Stampa ama neamhbhailí" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Am neamhbhailí mionathraithe (soicindí)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Am neamhbhailí mionathraithe (nanashoicindí)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Uimhir neamhbhailí gléis" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Uimhir inode as raon" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Réimse rófhada agus an comhad roghbhlúire á léamh" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Earráid agus an comhad roghbhlúire á léamh" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Comhadchríoch gan choinne sa chomhad roghbhlúire" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Luach réimse gan choinne sa chomhad roghbhlúire" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Críochnaitheoir taifid ar iarraidh" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Drochfhormáid incriminteach" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" +"Ní thacaítear leis an leagan seo den fhormáid incriminteach: %" + +#: src/incremen.c:1369 +#, 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:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "dumpdir míchumtha: 'X' faoi dhó" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "dumpdir míchumtha: ainm folamh i 'R'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "dumpdir míchumtha: 'T' gan 'R' roimhe" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "dumpdir míchumtha: ainm folamh i 'T'" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "dumpdir míchumtha: níor úsáideadh 'X' riamh" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: ní féidir an chomhadlann a stat: gan ghlanadh" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: tá an chomhadlann ar ghléas eile ar fad; gan ghlanadh" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s á scriosadh\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Formáid neamhbhailí chartlainne" + +#: src/tar.c:180 +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:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Príomh-mhód oibre:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "taispeáin an t-ábhar i gcartlann" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "bain comhaid as cartlann" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "cruthaigh cartlann nua" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "taispeáin difríochtaí idir cartlann agus córas comhaid" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "iarcheangail le deireadh cartlainne" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "ná hiarcheangail ach comhaid mhionathraithe leis an gcartlann" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "iarcheangail comhaid tar le cartlann" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "scrios as an gcartlann (nach ar théipeanna maighnéadacha!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "tástáil lipéad imleabhair na cartlainne agus scoir" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Mionathraitheoirí oibríochta:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "caith le gannchomhaid go héifeachtach" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "PRÍOMH[.MION]" + +#: src/tar.c:401 +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:403 +msgid "handle old GNU-format incremental backup" +msgstr "déan cúltaca incriminteach de shean-nós GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "COMHAD" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "déan cúltaca incriminteach nua-aoise GNU" + +#: src/tar.c:407 +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:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "UIMHIR" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "tá an chartlann inchuardaithe" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Rialú forscríofa:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "fíoraigh an chartlann i ndiaidh ag scríobh" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "scrios comhaid i ndiaidh iad a chur leis an gcartlann" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "ná forscríobh comhaid atá ann le linn baint amach" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "forscríobh comhaid atá ann le linn baint amach" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "scrios gach comhaid sula scríobhtar air" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "folmhaigh géagchóras sula mbaintear comhadlann amach" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "ná forscríobh meiteashonraí comhadlainne" + +#: src/tar.c:445 +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:451 +msgid "Select output stream:" +msgstr "Roghnaigh sruth aschurtha:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "bain comhaid amach agus scríobh ar aschur caighdeánach" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "ORDÚ" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "píopaigh comhaid bhainte go ríomhchlár eile" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "ná bac le cóid scortha na macphróiseas" + +#: src/tar.c:460 +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:465 +msgid "Handling of file attributes:" +msgstr "Tréithe comhaid á láimhseáil:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "éiligh AINM mar úinéir de chomhaid bhreise" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "éiligh AINM mar ghrúpa de chomhaid bhreise" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DÁTA-NÓ-COMHAD" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "ATHRUITHE" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "déan ATHRUITHE ar mhód de chomhaid bhreise" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "MODH" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "ná bain am mionathraithe an chomhaid" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "bain triail as úinéireacht a choinneáil" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "bain comhaid amach mar thusa féin" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "bain úsáid as uimhreacha d'ainmneacha úsáideora/grúpa" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "bain eolas faoi cheadanna (réamhshocrú don fhorúsáideoir)" + +#: src/tar.c:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "sórtáil ainmneacha le cur in oiriúint" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "ar comhbhrí le -p agus -s araon" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "cealaigh an éifeacht de rogha --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Roghnú gléis agus malartú:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "CARTLANN" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "bain úsáid as cartlann chomhaid nó gléas CARTLANN" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "bain úsáid as ORDÚ in ionad rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "bain úsáid as ORDÚ cian in ionad rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "sonraigh tiomántán agus a dhlús" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "cruthaigh/liostaigh/bain amach cartlann le hiliomad imleabhair" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "athraigh téip i ndiaidh UIMHIR × 1024 beart" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "rith script i ndiaidh gach téip (-M intuigthe)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "úsáid/nuashonraigh an uimhir imleabhair i gCOMHAD" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blocáil ghléis:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOIC" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOIC × 512 beart sa taifead" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "UIMHIR beart sa taifead, iolraí de 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "déan neamhshuim ar bhloic nialasacha sa chartlann (is ionann le EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "athbhlocáil le linn léimh (le píopaí 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Roghnú formáide:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMÁID" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "cruthaigh cartlann san fhormáid seo" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "Is FORMÁID ceann de na rudaí seo:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "seanfhormáid V7 tar" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "formáid de réir GNU tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "formáid de réir GNU tar 1.13" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "formáid POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "formáid POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "ar comhbhrí le pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "is ionann le --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "is ionann le --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "lorgfhocal[[:]=luach][,lorgfhocal[[:]=luach]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "rialaigh lorgfhocail pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TÉACS" + +#: src/tar.c:587 +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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Roghanna contrártha comhbhrúite" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "scag an chartlann le bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "scag an chartlann le gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "scag an chartlann le compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "scag an chartlann le gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "CLÁR" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "scag le CLÁR (ní foláir -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Roghnú comhaid logánta:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "COMHADLANN" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "athraigh go dtí COMHADLANN" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "tóg ainmneacha le baint/cruthú as comhad COMHAD" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "léigh ainmneacha, foirceanta le NULanna; múch -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"bain comharthaí athfhriotail ó chomhadainmneacha a léadh le -T (réamhshocrú)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "ná bain comharthaí athfhriotail ó chomhadainmneacha a léadh le -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATRÚN" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "fág comhaid as an áireamh, tugtha mar PHATRÚN" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "fág as an áireamh aon phatrún atá i gCOMHAD" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"gabh thar ábhar na gcomhadlann ina bhfuil CACHEDIR.TAG, seachas an comhad " +"clibe féin" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "gabh thar gach rud faoi chomhadlanna ina bhfuil CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "gabh thar chomhadlanna ina bhfuil CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "gabh thar ábhar na gcomhadlann ina bhfuil COMHAD, seachas COMHAD féin" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "gabh thar gach rud faoi chomhadlanna ina bhfuil COMHAD" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "gabh thar chomhadlanna a bhfuil COMHAD iontu" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "gabh thar chomhadlanna a bhaineann le córas rialaithe foinsí" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "ná téigh isteach i bhfochomhadlanna go huathoibríoch" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "ná fág an córas comhaid seo agus cartlann á cruthú" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "téigh isteach i gcomhadlanna (réamhshocrú)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "ná struipeáil `/' tosaigh ó ainmneacha comhaid" + +#: src/tar.c:656 +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:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"lean naisc shiombalacha; cartlannaigh agus dumpáil na comhaid a nascann na " +"naisc leo" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "AINM-BAILL" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "tosaigh ag ball AINM-BAILL sa chartlann" + +#: src/tar.c:662 +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:664 +msgid "DATE" +msgstr "DÁTA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "déan comparáid le dáta/am modhnaithe" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "MODH" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "déan cúltaca sula scriostar, roghnaigh modh oibre maidir le leaganacha" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "TEAGHRÁN" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Trasfhoirmiú ainmneacha comhaid:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "struipeáil UIMHIR comhpháirt tosaigh ó ainmneacha comhaid" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "SLONN" + +#: src/tar.c:679 +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:684 +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:687 +msgid "ignore case" +msgstr "ná bí cásíogair" + +# subject is "exclude patterns" +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "meaitseálann patrúin le tosach d'ainmneacha comhaid" + +#: src/tar.c:691 +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:693 +msgid "case sensitive matching (default)" +msgstr "dealaigh idir litreacha beaga/móra (réamhshocrú)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "úsáid saoróga (réamhshocrú do phatrúin eisiata)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "meaitseáil teaghráin carachtar ar charachtar" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "ní ghlacann saoróga le `/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "meaitseálann saoróga le `/' (réamhshocrú le patrúin eisiata)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Aschur faisnéiseach:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "taispeáin gach comhad atá próiseáilte, go foclach" + +#: src/tar.c:711 +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:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "taispeáin eolas mura bhfuil gach nasc dumpáilte" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "COMHARTHA" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "taispeáin dátaí mionathraithe de réir UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "scríobh aschur foclach i gCOMHAD" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "taispeáin bloc sa chartlann le gach teachtaireacht" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "iarr deimhniú ar gach gníomh" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "taispeáin réamhshocruithe tar" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "taispeáin ainmneacha comhaid/cartlainne i ndiaidh trasfhoirmithe" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STÍL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "cuir carachtair athfhriotail timpeall na carachtair ó TEAGHRÁN" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "ná húsáid comharthaí athfhriotail timpeall carachtair ó TEAGHRÁN" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Roghanna Comhoiriúnachta:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Roghanna eile:" + +#: src/tar.c:761 +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:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Ná tabhair ach ceann de na roghanna `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Roghanna contrártha comhbhrúite" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Comhartha anaithnid: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Comhad samplach dáta gan aimsiú" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Rogha %s: Ag caitheamh le dáta `%s' mar %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: léadh an liosta comhad cheana" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: tá carachtar nialasach sa chomhadainm a léadh" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Argóintí bailí do roghanna --quoting-style:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Luachanna réamhshocraithe don tar *seo*:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Fachtóir bacainneach neamhbhailí" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Fad téipe neamhbhailí" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Níos mó ná spriocdháta amháin" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Leagan neamhbhailí ar fhormáid na ngannchomhad" + +#: src/tar.c:1552 +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:1577 +msgid "--checkpoint value is not an integer" +msgstr "ní mór do luach --checkpoint a bheith ina slánuimhir" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Grúpa neamhbhailí" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Mód neamhbhailí ar rogha" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Uimhir neamhbhailí" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Úinéir neamhbhailí" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Méid taifid neamhbhailí" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "Tá líon na mball neamhbhailí" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Ní cheadaítear ach aon rogha --to-command amháin" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Tá an argóint dlúis míchumtha: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Dlús anaithnid: `%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[COMHAD]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Tá gá le hargóint ar an seanrogha `%c'." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "tá an rogha --occurrence gan bhrí in éagmais liosta comhad" + +#: src/tar.c:2202 +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:2232 +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:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Ní féidir --listed-incremental a úsáid le --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Ní féidir cartlanna le hiliomad imleabhair a fhíorú" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Ní féidir cartlanna comhbhrúite a fhíorú" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Ní féidir úsáid a bhaint as cartlanna il-ranna comhbhrúite" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Ní féidir cartlanna comhbhrúite a iarcheangal" + +#: src/tar.c:2293 +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:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Ní chruthófar cartlann fholamh (go cladhartha)" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Níl na roghanna `-Aru' ar fáil in éineacht le `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Ní foláir rogha amháin de `-Acdtrux' ar a laghad" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Grúpa neamhbhailí" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Seicphointe léimh %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Roghanna - cruthú comhad:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "MÉID" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Cruthaigh comhad leis an MÉID seo" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Scríobh i gcomhad AINM, in ionad an aschuir chaighdeánaigh" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Léigh ainmneacha comhaid ó COMHAD" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "Léann -T ainmneacha, foirceanta le NULanna" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Méid bhloic sa gannchomhad" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "FRITHÁIREAMH" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Léim go dtí an FRITHÁIREAMH roimh scríobh na sonraí" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Roghanna - staitisticí comhaid" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Roghanna - feidhmiú sioncrónach:" + +#: tests/genfile.c:163 +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:166 +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:169 +msgid "Set date for next --touch option" +msgstr "Socraigh an dáta le haghaidh an chéad rogha --touch eile" + +#: tests/genfile.c:172 +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:177 +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:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "Nuashonraigh na hamanna rochtana/mionathraithe de CHOMHAD" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Rith ORDÚ" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Méid neamhbhailí: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Uimhir as raon: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Méid diúltach: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "theip ar stat(%s)" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Earráid agus uimhir á parsáil i ngar do `%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Formáid anaithnid ar an dáta" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGÓINTÍ...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "ní féidir `%s' a oscailt" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "ní féidir 'seek' a dhéanamh" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "tá carachtar nialasach sa chomhadainm" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "masc mícheart (i ngar do `%s')" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Réimse anaithnid `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "ní féidir an t-am a shocrú ar `%s'" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "D'éirigh leis an ordú\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Theip ar an ordú le stádas %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Stopadh an t-ordú le comhartha %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Stopadh an t-ordú ar chomhartha %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Rinne an t-ordú córdhumpa\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Ordú críochnaithe\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "Tá ainmneacha comhaid de dhíth ar --stat" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "an iomarca argóintí" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]UIMHIR" + +#~ msgid "block size" +#~ msgstr "méid bloc" + +#~ 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..6bed45d Binary files /dev/null and b/po/gl.gmo differ diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..2b1cbdc --- /dev/null +++ b/po/gl.po @@ -0,0 +1,3263 @@ +# Galician translation of GNU tar. +# Copyright (C) 2002 Free Software Foundation, Inc. +# Jacobo Tarrío Barreiro , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.13.25\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-03-26 19:17+0100\n" +"Last-Translator: Jacobo Tarrío Barreiro \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumento %s non válido para %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumento %s ambiguo para %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Os argumentos válidos son:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Emprego: %s [OPCIÓN]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Informe dos erros no programa a .\n" +"Informe dos erros na traducción a .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Erro do sistema descoñecido" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: a opción \"%s\" precisa dun argumento\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opción \"%s\" é ambigua\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opción \"%s\" precisa dun argumento\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción \"--%s\" non recoñecida\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción \"%c%s\" non recoñecida\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción non admitida -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción non válida -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opción precisa dun argumento -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opción \"-W %s\" é ambigua\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memoria esgotada" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Non se puido obte-lo directorio actual" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Non se pode armacena-lo directorio de traballo" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "\"" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "\"" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Escrito por François Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Escrito por François Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Escrito por François Pinard" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\n" +"Informe dos erros na traducción a .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Bytes totais escritos: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Bytes totais escritos: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(canalización)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valor non válido para record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Non se proporcionou o nome do arquivo" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Non se poden verifica-los arquivos da entrada/saída estándar" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Non se poden actualiza-los arquivos comprimidos" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "No comezo da cinta, saíndo agora" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Demasiados erros, saíndo" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: contén un número de volume non válido" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Desbordamento no número de volume" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Prepare o volume #%d para %s e prema enter: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Chegouse á fin de ficheiro onde se esperaba unha resposta do usuario" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "AVISO: O arquivo está incompleto" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Non hai novos volumes; saíndo.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "O comando \"%s\" fallou" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s non continúa neste volume" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s ten un tamaño incorrecto (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Este volume está fora da secuencia" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "O arquivo non está etiquetado para coincidir con %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "O volume %s non coincide con %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Xerando cabeceiras octais negativas" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: ficheiro sen cambios; non se envorca" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +#, fuzzy +msgid "contents not dumped" +msgstr " (memoria volcada)" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tipo de ficheiro descoñecido; ignórase este ficheiro" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " ligazón a %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: ficheiro sen cambios; non se envorca" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: o ficheiro é o arquivo; non se envorca" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Ficheiro eliminado antes da súa lectura" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: o ficheiro cambiou mentres se lía" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: ignórase o socket" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Renomeouse o directorio" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Renomeouse o directorio" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: O directorio é novo" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Marca de tempo non válida" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Proporcionouse na opción un modo non válido" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Número de dispositivo non válido" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Número de inode non válido" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "Erro de lectura en %s" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Fin de ficheiro (EOF) inesperado no arquivo" + +#: src/incremen.c:1006 src/incremen.c:1046 +#, fuzzy +msgid "Unexpected field value in snapshot file" +msgstr "Fin de ficheiro (EOF) inesperado no arquivo" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Borrando %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Grupo non válido" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Quérense as características de GNU no formato de arquivo incompatible" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Fin de ficheiro inesperado no arquivo" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +#, fuzzy +msgid "remove files after adding them to the archive" +msgstr "Borrando a especificación de unidade dos nomes do arquivo" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Erro ao gravar na saída estándar" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Non se pode verifica-los arquivos multi-volume" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Arquivar da entrada estándar" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opcións de compresión conflictivas" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "Non se puido escribir no programa de compresión" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: o ficheiro é o arquivo; non se envorca" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: o ficheiro é o arquivo; non se envorca" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: o ficheiro é o arquivo; non se envorca" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Non se pode cambia-lo directorio de traballo" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Eliminadndo o \"%.*s\" inicial dos nomes dos membros" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "O volume %s non coincide con %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +#, fuzzy +msgid "ask for confirmation for every action" +msgstr "Non se puido le-la confirmación do usuario" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Non pode especificar máis dunha das opcións \"-Acdtrux\"" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Opcións de compresión conflictivas" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " Tipo de ficheiro %s descoñecido\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Non se atopou o ficheiro de data" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: o ficheiro é o arquivo; non se envorca" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Factor de bloqueo non válido" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Lonxitude da fita non válida" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Máis dunha data de umbral" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Grupo non válido" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Proporcionouse na opción un modo non válido" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Número de inode non válido" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Propietario non válido" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Tamaño de rexistro non válido" + +#: src/tar.c:1797 +#, 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:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Lonxitude da fita non válida" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Patrón descoñecido `%s'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "A antiga opción \"%c\" precisa dun argumento." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Varios ficheiros de arquivo requiren a opción \"-M\"" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Non se pode combinar --listed-incremental con --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Non se pode verifica-los arquivos multi-volume" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Non se poden verifica-los arquivos comprimidos" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Non se poden empregar arquivos comprimidos multi-volume" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Non se poden actualiza-los arquivos comprimidos" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "De xeito cobarde rexéitase crear un ficheiro baleiro" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "As opcións \"-Aru\" son incompatibles con \"-f -\"" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Debe especificar unha das opcións \"-Acdtrux\"" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Grupo non válido" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Punto de control de lectura %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Opcións de compresión conflictivas" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Erro ao gravar na saída estándar" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, 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:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Marca de tempo non válida" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Número de inode fóra de rango" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Erro do sistema descoñecido" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "Non se puido abrir %s" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Non se pode pechar" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "Patrón descoñecido `%s'" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "Non se puido evalua-lo ficheiro %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "O fillo morreu co sinal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Nomes de ficheiro alterados--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "tamaño de bloque" + +#~ 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 "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 "Cannot exec %s" +#~ msgstr "Non se puido executar %s" + +#~ 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 "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: %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 .\n" +#~ msgstr "" +#~ "\n" +#~ "Escrito por François Pinard .\n" diff --git a/po/hr.gmo b/po/hr.gmo new file mode 100644 index 0000000..1c10d1a Binary files /dev/null and b/po/hr.gmo differ diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..2afad6a --- /dev/null +++ b/po/hr.po @@ -0,0 +1,3048 @@ +# GNU tar .po message translation file for hr_HR locale +# Copyright (C) 2002 Free Software Foundation, Inc. +# Mirsad Todorovac , 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: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-04-26 10:49+MET(DST)(UTC+2)\n" +"Last-Translator: Mirsad Todorovac \n" +"Language-Team: Croatian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "pogre¹an argument %s za %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "nejednoznaèan argument %s za %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Ispravni argumenti su:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Kori¹tenje: %s [OPCIJA]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Prijavi gre¹ke i bugove na .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Nepoznata pogre¹ka u sistemu" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: za opciju `%s' neophodan je argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcija `%s' nije jednoznaèna\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opcija `--%s' ne dozvoljava argument\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: za opciju `%s' neophodan je argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ne prepoznajem opciju `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ne prepoznajem opciju `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ilegalna opcija -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: pogre¹na opcija -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcija zahtijeva neophodan argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcija `-W %s' nije jednoznaèna\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opcija `-W %s' ne dozvoljava argument\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "iscrpljena memorija" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Ne mogu promijeniti radni direktorij" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Ne mogu pohraniti radni direktorij" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Napisao François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Napisao François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Napisao François Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\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" + +#: src/buffer.c:281 src/buffer.c:520 src/buffer.c:1106 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" + +# FIXME -- ovo neæe raditi ako je prevedeno -- Denis? +#: src/buffer.c:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Ukupno ispisano bajtova: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +# FIXME -- ovo neæe raditi ako je prevedeno -- Denis? +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Ukupno ispisano bajtova: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(cjevovod - pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Pogre¹na vrijednost za record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Nije dano ime arhive" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Ne mogu verificirati stdin/stdout arhive" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Ne mogu a¾urirati komprimirane arhive" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Poèetak trake, zavr¹avam" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Previ¹e pogre¹aka, zavr¹avam" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: sadr¾i pogre¹an broj dijela arhive" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Prekoraèenje u broju dijela arhive" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Pripremite dio arhive #%d za %s i pritisni :" + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Naðen EOF gdje sam oèekivao odgovor korisnika" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "UPOZORENJE: Arhiva nije kompletirana" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nema novog dijela arhive; zavr¹avam.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "Neuspjela `%s' naredba" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nije nastavljen za ovom dijelu arhive" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s je pogre¹ne velièine (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Ovaj dio arhive je izvan slijeda" + +# FIXME -- clean against source! (TM) +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arhiva nije oznaèena labelom da odgovara %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Dio arhive %s ne odgovara %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Generiram negativna oktalna zaglavlja" + +#: src/create.c:624 src/create.c:687 +#, fuzzy, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: datoteka nepromijenjena; ne arhiviram ju" + +#: src/create.c:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: datoteka nepromijenjena; ne arhiviram ju" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Nepoznat tip datoteke; datoteka ignorirana" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " link do %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: datoteka nepromijenjena; ne arhiviram ju" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: datoteka je arhiva; ne arhiviram ju" + +#: src/create.c:1573 +#, 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:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: datoteka se promijenila dok smo ju èitali" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket ignoriran" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Direktoriju promijenjeno ime" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Direktoriju promijenjeno ime" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Novi direktorij" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Pogre¹na oznaka vremena" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Pogre¹an mod dan opcijom" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Pogre¹an broj ureðaja" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Pogre¹an inode broj" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Neoèekivani EOF u arhivi" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +# FIXME -- blocking factor -- can't translate (ask others) -- TM +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Bri¹em %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Opcije `-%s' i `-%s' obje zahtijevaju standardni ulaz" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Pogre¹na grupa" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU specijalne pogodnosti zatra¾ene na nekompatibilnom formatu arhive" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Neoèekivani EOF u arhivi" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Pogre¹ka u pisanju na standardni izlaz" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +# FIXME -- volume -- find more suitable (ask others) -- TM +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Ne mogu verificirati vi¹edjelne arhive" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Konfliktne opcije formata arhive" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Konfliktne opcije za kompresiju" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: datoteka je arhiva; ne arhiviram ju" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: datoteka je arhiva; ne arhiviram ju" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: datoteka je arhiva; ne arhiviram ju" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Ne mogu promijeniti radni direktorij" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Uklanjam vodeæe `%.*s' iz imena èlanova" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Dio arhive %s ne odgovara %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Konfliktne opcije za kompresiju" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " nepoznat tip datoteke %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Datoteka s datumom nije pronaðena" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Substituiram %s za nepoznat format datuma %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: datoteka je arhiva; ne arhiviram ju" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +# FIXME -- clarify this against source and man -- TM +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Pogre¹an faktor pakiranja u blokove" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Pogre¹na duljina trake" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Vi¹e od jednog datuma s pragom (threshold)" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Pogre¹na grupa" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Pogre¹an mod dan opcijom" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Pogre¹an inode broj" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Pogre¹an vlasnik" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Pogre¹na velièina sloga (record)" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Velièina sloga (record) mora biti vi¹ekratnik %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Pogre¹na duljina trake" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Stara opcija `%c' zahtijeva obavezan argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Vi¹edjelne arhive zahtijevaju `-M' opciju" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Ne mogu kombinirati --listed-incremental s --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Ne mogu verificirati vi¹edjelne arhive" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Ne mogu verificirati komprimirane arhive" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Ne mogu koristiti vi¹edjelne komprimirane arhive" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Ne mogu a¾urirati komprimirane arhive" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +# LOL -- TM +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Kukavièki odbijam kreirati praznu arhivu!" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opcije `-Aru' nisu kompatibilne s `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Morate specificirati jednu od `-Acdtrux' opcija" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Pogre¹na grupa" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Toèka provjere èitanja %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Konfliktne opcije za kompresiju" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Pogre¹ka u pisanju na standardni izlaz" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Pogre¹na oznaka vremena" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Inode broj izvan opsega" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Nepoznata pogre¹ka u sistemu" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Ne mogu zatvoriti" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " nepoznat tip datoteke %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Neuspjeli seek na %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Potproces zavr¹io uz signal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +# FIXME -- 'mangled filenames'??? +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Manglirana imena datoteka--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "velièina bloka" + +#~ 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" diff --git a/po/hu.gmo b/po/hu.gmo new file mode 100644 index 0000000..d9e372d Binary files /dev/null and b/po/hu.gmo differ diff --git a/po/hu.po b/po/hu.po new file mode 100644 index 0000000..0d9dc56 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,2646 @@ +# Hungarian translation of the GNU tar. +# Copyright (C) 2002, 2006, 2007, 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the tar package. +# Gábor István , 2002. +# Gabor Kelemen , 2006, 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-04-06 17:41+0200\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "a(z) \"%s\" argumentum érvénytelen a következőhöz: %s" + +#: lib/argmatch.c:134 +#, 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:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Az érvényes argumentumok a következők:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Ismeretlen ARGP_HELP_FMT paraméter" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Szemét az ARGP_HELP_FMT-ben: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Használat:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " vagy: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [KAPCSOLÓ...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "A hibákat a(z) %s címen jelentsd.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Ismeretlen rendszerhiba" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "ezen súgószöveg megjelenítése" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "rövid használati utasítás megjelenítése" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NÉV" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "a program nevének beállítása" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "MP" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "szünet MP másodpercre (alapértelmezetten 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "a programverzió kiírása" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMHIBA) A verziószám ismeretlen???" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: túl sok argumentum\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMHIBA) A kapcsolót fel kellett volna ismerni???" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "íráshiba" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a(z) \"%s\" kapcsoló nem egyértelmű\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, 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:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: a(z) \"--%s\" kapcsoló ismeretlen\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: a(z) \"%c%s\" kapcsoló ismeretlen\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: illegális kapcsoló -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: érvénytelen kapcsoló -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a kapcsoló egy argumentumot igényel -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a \"-W %s\" kapcsoló nem egyértelmű\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "elfogyott a memória" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "A munkakönyvtár nem jegyezhető fel" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "a visszatérés meghiúsult a kiinduló munkakönyvtárba" + +#. 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 közvetlen 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:155 +#, 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:156 +#, 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:169 +msgid "Substituting `.' for empty member name" +msgstr "Egy . helyettesítése az üres tagnév helyett" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "\"" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "\"" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[iIyY]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "(C)" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Licenc: GPLv3+: A GNU GPL 3. vagy újabb változata \n" +"Ez egy szabad szoftver: terjesztheti és/vagy módosíthatja.\n" +"NINCS GARANCIA, a törvény által engedélyezett mértékig.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Írta: %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Írta: %s és %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Írta: %s, %s és %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Írta: %s, %s, %s\n" +"és %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, és %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, %s, és %s.\n" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, %s, %s, és %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"és %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, és %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Írta %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, és mások.\n" + +#: 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 adja ki 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Kiírt bájtok teljes száma" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Olvasott bájtok teljes száma" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Törölt bájtok teljes száma: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(cső)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "A record_size értéke érvénytelen" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Nem adott meg archívumnevet" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Nem ellenőrizhető az archívum, ha a szabványos be/kimenetet használja" + +#: src/buffer.c:517 +#, 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:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Tömörített archívumok nem frissíthetők" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "A szalag eleje, most kilépek" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Túl sok hiba, kilépek" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "az rmtlseek nem állt meg egy rekord határán" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: érvénytelen kötetszámot tartalmaz" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Kötetszám-túlcsordulás" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "EOF ahol a program felhasználói választ várt" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "FIGYELMEZTETÉS: Az archívum befejezetlen" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Új parancsértelmező hívása\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Ezen lista kiírása\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nincs új kötet, kilépés.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Nincs megadva fájlnév, próbálkozzon újra.\n" + +#: src/buffer.c:993 +#, 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:1044 +#, c-format +msgid "%s command failed" +msgstr "A(z) \"%s\" parancs meghiúsult" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nem folytatódik ezen a köteten" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s mérete hibás (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Ez a kötet túl van a sorozaton" + +#: src/buffer.c:1273 +#, 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:1276 +#, 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:1372 +#, 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:1329 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 link 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Egy magányos nulla blokk %s helyen" + +#: src/create.c:67 +#, 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 (%s); %s" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Negatív oktális fejlécek előállítása" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "a tartalom nem került kiírásra" + +#: src/create.c:1361 +#, 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:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Hiányzó linkek a következőre: \"%s\".\n" + +#: src/create.c:1535 +#, 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:1543 +#, 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:1573 +#, 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:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "a könyvtár nem került kiírásra" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: a fájl módosult olvasás közben" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: a foglalat figyelmen kívül hagyva" + +#: src/create.c:1744 +#, 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 linkek kibontására közvetlen linkké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:390 src/incremen.c:430 +#, 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:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: a könyvtár át lett nevezve" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: a könyvtár új" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Érvénytelen időbélyeg" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Érvénytelen módosítási idő (másodperc)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Érvénytelen módosítási idő (nanomásodperc)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Érvénytelen eszközszám" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Érvénytelen inode-szám" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Túl hosszú mező a pillanatképfájl olvasása közben" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Olvasási hiba a pillanatképfájlban" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Váratlan fájlvége a pillanatképfájlban" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Váratlan mezőérték a pillanatképfájlban" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Hiányzó rekordlezáró" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Hibás növekményes fájlformátum" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Nem támogatott növekményes formátumverzió: %" + +#: src/incremen.c:1369 +#, 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:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Rosszul formázott kiíratási könyvtár: az \"X\" többször szerepel" + +#: src/incremen.c:1392 +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:1405 +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:1411 +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:1431 +#, 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:1437 +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:1481 +#, 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:1543 +#, 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:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s törlése\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Érvénytelen archívumformátum" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU szolgáltatásokat kértél inkompatibilis az archívumformátumokon" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Fő működési mód:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "felsorolja egy archívum tartalmát" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "fájlok kibontása egy archívumból" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "új archívum létrehozása" + +#: src/tar.c:379 +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:382 +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:384 +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:386 +msgid "append tar files to an archive" +msgstr "tar fájlok hozzáfűzése egy archívumhoz" + +#: src/tar.c:389 +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:391 +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:396 +msgid "Operation modifiers:" +msgstr "Műveletmódosítók:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "ritka fájlok hatékony kezelése" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAGAS[.ALACSONY]" + +#: src/tar.c:401 +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:403 +msgid "handle old GNU-format incremental backup" +msgstr "régi GNU formátumú növekményes mentés kezelése" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FÁJL" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "új GNU formátumú növekményes mentés kezelése" + +#: src/tar.c:407 +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:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "SZÁM" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "az archívum kereshető" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Felülírás felügyelete:" + +#: src/tar.c:429 +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:431 +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:433 +msgid "don't replace existing files when extracting" +msgstr "ne cserélje a meglévő fájlokat kibontáskor" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "meglévő fájlok felülírása kibontáskor" + +#: src/tar.c:439 +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:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "hierarchiák kiürítése könyvtár kibontása előtt" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "meglévő könyvtárak metaadatainak megőrzése" + +#: src/tar.c:445 +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:451 +msgid "Select output stream:" +msgstr "Kimeneti adatfolyam kiválasztása:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "fájlok kibontása a szabványos kimenetre" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "PARANCS" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "kibontott fájlok továbbítása másik program számára" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "utódok kilépési kódjainak figyelmen kívül hagyása" + +#: src/tar.c:460 +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:465 +msgid "Handling of file attributes:" +msgstr "Fájlattribútumok kezelése:" + +#: src/tar.c:468 +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:470 +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:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DÁTUM-VAGY-FÁJL" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "MÓDOSÍTÁSOK" + +#: src/tar.c:474 +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:476 +msgid "METHOD" +msgstr "MÓDSZER" + +#: src/tar.c:477 +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:481 +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:483 +msgid "try extracting files with the same ownership" +msgstr "próbálja azonos tulajdonossal kibontani a fájlokat" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "fájlok kibontása az Ön nevében" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "mindig számok használata a felhasználó- vagy csoportnevekhez" + +#: src/tar.c:489 +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:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "kibontandó nevek rendezése, az archívumnak való megfelelés érdekében" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "azonos, mint a -p és -s egyszerre" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "a --delay-directory-restore kapcsoló hatásának megszüntetése" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Eszköz kiválasztása és váltása:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHÍVUM" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "az ARCHÍVUM archívumfájl vagy -eszköz használata" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "az adott rmt PARANCS használata az rmt helyett" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "a távoli PARANCS használata az rsh helyett" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "meghajtó és sűrűség megadása" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "többkötetes archívum létrehozása/listázása/kibontása" + +#: src/tar.c:537 +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:539 +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:542 +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:547 +msgid "Device blocking:" +msgstr "Eszközblokkolás:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKK" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "rekordonként BLOKK x 512 bájt" + +#: src/tar.c:552 +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:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "nullázott blokkok (EOF) mellőzése az archívumban" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "újrablokkolás olvasáskor (4.2BSD csövekhez)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Archívumformátum kiválasztása:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMÁTUM" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "az adott formátumú archívum létrehozása" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "A FORMÁTUM a következők egyike:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "régi V7 tar formátum" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "A tar <= 1.12 által használt GNU formátum" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x formátum" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) formátum" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) formátum" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "azonos a pax formátummal" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "azonos a --format=v7 formátummal" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "azonos a --format=posix formátummal" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "kulcsszó[[:]=érték][,kulcsszó[[:]=érték]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "a pax kulcsszavak irányítása" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "SZÖVEG" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "Tömörítési kapcsolók:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "archívum kiterjesztésének használata a tömörítőprogram meghatározására" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "az archívum tömörítése a bzip2 használatával" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "az archívum tömörítése a gzip használatával" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "az archívum tömörítése a compress használatával" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "az archívum tömörítése az lzma használatával" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +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:612 +msgid "Local file selection:" +msgstr "Helyi fájlválasztás:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "KÖNYVTÁR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "váltás a KÖNYVTÁR könyvtárba" + +#: src/tar.c:619 +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:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "a -T nullal lezárt neveket olvas, letiltja a -C kapcsolót" + +#: src/tar.c:623 +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:625 +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:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MINTA" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "a MINTAKÉNT megadott fájlok kihagyása" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "a FÁJLBAN megadott minták kihagyása" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"a CACHEDIR.TAG-et tartalmazó könyvtárak tartalmának kihagyása, a címkefájl " +"kivételével" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "a CACHEDIR.TAG-et tartalmazó könyvtárak alatt minden kihagyása" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "a CACHEDIR.TAG-et tartalmazó könyvtárak kihagyása" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"a FÁJLT tartalmazó könyvtárak tartalmának kihagyása, a FÁJL kivételével" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "a FÁJLT tartalmazó könyvtárak alatt minden kihagyása" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "a FÁJLT tartalmazó könyvtárak kihagyása" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "verziókezelő-könyvtárak kihagyása" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "ne lépjen be automatikusan a könyvtárakba" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "az archívum létrehozásakor maradjon a helyi fájlrendszeren" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "belépés a könyvtárakba rekurzívan (alapértelmezett)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "ne vágja le a kezdő \"/\" jelet a fájlnevekből" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" +"szimbolikus linkek követése; az általuk mutatott fájlok archiválása és " +"kiíratása" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"közvetlen linkek követése; az általuk mutatott fájlok archiválása és " +"kiíratása" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "TAGNÉV" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "kezdés a TAGNÉV tagnál az archívumban" + +#: src/tar.c:662 +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:664 +msgid "DATE" +msgstr "DÁTUM" + +#: src/tar.c:665 +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:666 +msgid "CONTROL" +msgstr "FELÜGYELET" + +#: src/tar.c:667 +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:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "KARAKTERLÁNC" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Fájlnév-átalakítások:" + +#: src/tar.c:676 +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:678 +msgid "EXPRESSION" +msgstr "KIFEJEZÉS" + +#: src/tar.c:679 +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:684 +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:687 +msgid "ignore case" +msgstr "kis- és nagybetűk figyelmen kívül hagyása" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "a minták illesztése a fájlnevek elejére" + +#: src/tar.c:691 +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:693 +msgid "case sensitive matching (default)" +msgstr "kis- és nagybetűkre érzékeny illesztés (alapértelmezett)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "helyettesítő karakterek használata (alapértelmezett kihagyáskor)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "szó szerinti karakterlánc-illesztés" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "a helyettesítő karakterek nem illeszkednek a perjelre" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" +"a helyettesítőkarakterek illeszkednek a \"/\" jelre (alapértelmezett " +"kihagyáskor)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informatív kimenet:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "feldolgozott fájlok bőbeszédű listázása" + +#: src/tar.c:711 +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:713 +msgid "ACTION" +msgstr "MÅ°VELET" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "a MÅ°VELET végrehajtása minden ellenőrzőponton" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "üzenet kiírása, ha nem minden link került kiíratásra" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SZIGNÁL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "a fájlmódosítási dátumok kiírása UTC szerint" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "bőbeszédű kimenet küldése a FÁJLBA" + +#: src/tar.c:728 +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:730 +msgid "ask for confirmation for every action" +msgstr "megerősítés kérése minden egyes művelethez" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "a tar alapértelmezéseinek megjelenítése" + +#: src/tar.c:735 +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:737 +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:740 +msgid "STYLE" +msgstr "STÍLUS" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "a KARAKTERLÁNCBÓL származó karakterek kiegészítő idézése" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "a KARAKTERLÁNCBÓL származó karakterek idézésének letiltása" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Kompatibilitási kapcsolók:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Egyéb kapcsolók:" + +#: src/tar.c:761 +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:899 +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:909 +msgid "Conflicting compression options" +msgstr "A tömörítési kapcsolók ütköznek" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Ismeretlen szignálnév: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "A dátummintafájl nem található" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "%s cseréje az ismeretlen %s dátumformátumhoz" + +#: src/tar.c:1022 +#, 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:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: a fájllista már be van olvasva" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: a beolvasott fájlnév null karaktert tartalmaz" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "A --quoting-style kapcsolók érvényes argumentumai:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Ezen* tar alapértelmezései:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Érvénytelen blokkolási tényező" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Érvénytelen szalagméret" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Egynél több küszöbdátum" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Érvénytelen ritka verzió érték" + +#: src/tar.c:1552 +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:1577 +msgid "--checkpoint value is not an integer" +msgstr "A --checkpoint értéke nem egy egész" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Érvénytelen csoport" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Érvénytelen mód került megadásra a kapcsolóban" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Érvénytelen szám" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Érvénytelen tulajdonos" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Érvénytelen rekordméret" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "Érvénytelen elemszám" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Csak egy --to-command kapcsoló engedélyezett" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Rosszul formázott sűrűségargumentum: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Ismeretlen sűrűség: \"%c\"" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FÁJL]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "A régi \"%c\" kapcsoló paramétert igényel." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "a --occurrence értelmetlen fájllista nélkül" + +#: src/tar.c:2202 +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:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Több archívumfájl esetén szükséges a \"-M\" kapcsoló" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "" +"A --listed-incremental és a --newer kapcsolók nem használhatók egyszerre" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "A többkötetes archívumok nem ellenőrizhetők" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "A tömörített archívumok nem ellenőrizhetők" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Nem használhatók többkötetes tömörített archívumok" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Tömörített archívumok nem fűzhetők össze" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "a --pax kapcsoló csak POSIX archívumokon használható" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Üres archívum létrehozása visszautasítva" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Az \"-Aru\" kapcsolók összeférhetetlenek a \"-f\" kapcsolóval" + +#: src/tar.c:2432 +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:2483 +#, 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" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: érvénytelen időtúllépés" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: ismeretlen ellenőrzőpont-művelet" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "írás" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "olvasás" + +#. 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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "%u. olvasási ellenőrzőpont" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Fájllétrehozási kapcsolók:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "MÉRET" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Az adott MÉRETÅ° fájl létrehozása" + +#: tests/genfile.c:130 +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:132 +msgid "Read file names from FILE" +msgstr "Fájlnevek beolvasása a FÁJLBÓL" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "a -T nullal lezárt neveket olvas" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Egy blokk mérete ritka fájlhoz" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "ELTOLÁS" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Az adott eltolásra pozicionálás az adatok kiírása előtt" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Fájlstatisztika kapcsolói:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Szinkron végrehajtási kapcsolók:" + +#: tests/genfile.c:163 +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:166 +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:169 +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:172 +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:177 +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:180 +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:184 +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:187 +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:190 +msgid "Execute COMMAND" +msgstr "A PARANCS végrehajtása" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Érvénytelen méret: %s" + +#: tests/genfile.c:245 +#, 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:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negatív méret: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "a stat(%s) meghiúsult" + +#: tests/genfile.c:355 +#, 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:361 +#, c-format +msgid "Unknown date format" +msgstr "Ismeretlen dátumformátum" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENTUMOK...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "a(z) \"%s\" nem nyitható meg" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "Nem lehet pozicionálni" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "a fájlnév null karaktert tartalmaz" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "helytelen maszk (a(z) \"%s\" közelében)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Ismeretlen mező: \"%s\"" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "nem állítható be az idő a következőn: \"%s\"" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "A parancs sikeresen befejeződött\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "A parancs meghiúsult a következő állapottal: %d\n" + +#: tests/genfile.c:813 +#, 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:815 +#, 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:818 +#, c-format +msgid "Command dumped core\n" +msgstr "A parancs hibakeresési kimenetet adott vissza\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "A parancs befejeződött\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "a --stat fájlneveket igényel" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "túl sok argumentum" diff --git a/po/id.gmo b/po/id.gmo new file mode 100644 index 0000000..8b76ff6 Binary files /dev/null and b/po/id.gmo differ diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..38fc3fe --- /dev/null +++ b/po/id.po @@ -0,0 +1,3004 @@ +# tar-1.13.25 (Indonesian) +# Copyright (C) 1999, 2002 Free Software Foundation, Inc. +# Tedi Heriyanto , 1999, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.13.25\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-07-24 22:02GMT+0700\n" +"Last-Translator: Tedi Heriyanto \n" +"Language-Team: Indonesian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumen tidak valid %s untuk %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumen rancu %s untuk %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumen yang valid adalah:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Gunakan: %s [OPTION]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Laporkan bug kepada .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Kesalahan sistem tidak dikenal" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: option `%s' membutuhkan sebuah argumen\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: option `%s' rancu\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: option `--%s' tidak membolehkan sebuah argumen\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: option `%s' membutuhkan sebuah argumen\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: option tidak dikenal `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: option tidak dikenal `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: option ilegal -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: option tidak valid -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: option membutuhkan sebuah argumen -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: option `-W %s' rancu\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: option `-W %s' tidak membolehkan sebuah argumen\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "Memory habis" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Tidak bisa pindah direktori kerja" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Tidak dapat menyimpan direktori kerja" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Menghilangkan awalan `%.*s' dari nama anggota" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Menghilangkan awalan `%.*s' dari nama anggota" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Menghilangkan awalan `%.*s' dari nama anggota" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Ditulis oleh F. Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Ditulis oleh F. Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Ditulis oleh F. Pinard" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Total byte ditulis: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Total byte ditulis: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Nilai record_size salah" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Tidak diberikan nama archive" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Tidak dapat verifikasi stdin/stdout archive" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Tidak dapat update compressed archives" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Berada pada awal tape, keluar" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Terlalu banyak kesalahan, keluar" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: berisi nomor volum yang tidak valid" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Nomor volum overflow" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Mempersiapkan volume #%d untuk %s dan tekan return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "EOF pada saat user reply diharapkan" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "PERINGATAN: Archive tidak lengkap" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Tidak ada new volume; keluar.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "Perintah `%s' gagal" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s tidak dilanjutkan pada volume ini" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s adalah ukuran yang salah (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Volume ini di luar urutan" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Label archive tidak cocok dengan '%s'" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volume %s tidak sesuai dengan %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "nilai %s dari %s di luar daerah %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Membuat header oktal negatif" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: file tidak berubah; tidak di-dump" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tipe file tidak dikenal; file diabaikan" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " link ke %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: file tidak berubah; tidak di-dump" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: file adalah archive; tidak di-dump" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: File dihapus sebelum kita membacanya" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: file berubah saat kita membacanya" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: soket diabaikan" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Direktori telah diganti nama" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Direktori telah diganti nama" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Direktori adalah baru" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Time stamp tidak valid" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Mode tidak tepat diberikan pada opsi" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Nomor device tidak valid" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Nomor inode tidak valid" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Unexpected EOF dalam archive" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Tidak dapat mengalokasi memori untuk faktor blocking %d" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Menghapus %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Opsi `-%s' dan `-%s' membutuhkan standard input" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: grup tidak valid" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Feature GNU dibutuhkan untuk format archive yang tidak kompatibel" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Unexpected EOF dalam archive" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Kesalahan dalam menulis ke output standar" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Tidak dapat verifikasi multi-volume archives" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Opsi format archive konflik" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opsi kompresi konflik" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: file adalah archive; tidak di-dump" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: file adalah archive; tidak di-dump" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: file adalah archive; tidak di-dump" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Tidak bisa pindah direktori kerja" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Menghilangkan awalan `%.*s' dari nama anggota" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Volume %s tidak sesuai dengan %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Anda tidak bisa menjalankan lebih dari satu opsi `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Opsi kompresi konflik" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " tipe file tidak dikenal %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Tanggal file tidak ditemukan" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Menggantikan %s untuk format tanggal tidak dikenal %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: file adalah archive; tidak di-dump" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Faktor bloking tidak valid" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Panjang tape tidak valid" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Lebih dari satu treshold date" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: grup tidak valid" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Mode tidak tepat diberikan pada opsi" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Nomor inode tidak valid" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Pemilik tidak valid" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Ukuran record tidak valid" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Jumlah record harus kelipatan dari %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Panjang tape tidak valid" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Opsi 'lama' `%c' membutuhkan argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "File multiple archive membutuhkan opsi '-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Tidak dapat menggabungkan --listed-incremental dengan --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Tidak dapat verifikasi multi-volume archives" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Tidak dapat verify compressed archives" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Tidak dapat menggunakan multi-volume compressed archives" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Tidak dapat update compressed archives" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Tidak bisa membuat archive yang kosong" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opsi '-Aru' tidak kompatibel dengan `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Anda harus menggunakan salah satu dari opsi `-Acdtrux'" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: grup tidak valid" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Membaca checkpoint %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Opsi kompresi konflik" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Kesalahan dalam menulis ke output standar" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Time stamp tidak valid" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Nomor inode di luar batasan" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Kesalahan sistem tidak dikenal" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Tidak dapat menutup" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " tipe file tidak dikenal %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Tidak dapat mencari ke %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Child berhenti dengan signal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Mangled file names--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "ukuran blok" + +#~ 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" 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..f548fef Binary files /dev/null and b/po/it.gmo differ diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000..6136091 --- /dev/null +++ b/po/it.po @@ -0,0 +1,3176 @@ +# Messaggi in Italiano per GNU tar. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Lele Gaifax , 1996. +# Marco d'Itri , 1998. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.14.91\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2004-12-23 11:32+0100\n" +"Last-Translator: Marco d'Itri \n" +"Language-Team: Italian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argomento %s non valido per %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argomento %s ambiguo per %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Gli argomenti validi sono:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: parametro ARGP_HELP_FMT sconosciuto" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Spazzatura in ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Uso:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " o: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPZIONE...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Segnalare i bug a %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Errore di sistema sconosciuto" + +#: lib/argp-parse.c:81 src/tar.c:763 +#, fuzzy +msgid "give this help list" +msgstr "Mostra questo aiuto" + +#: lib/argp-parse.c:82 src/tar.c:764 +#, fuzzy +msgid "give a short usage message" +msgstr "Mostra un breve messaggio sull'uso" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NOME" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +#, fuzzy +msgid "print program version" +msgstr "Stampa la versione del programma" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: l'opzione `%s' richiede un argomento\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: l'opzione `%s' è ambigua\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: l'opzione `--%s' non accetta argomenti\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: l'opzione `%s' richiede un argomento\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opzione `--%s' non riconosciuta\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opzione `%c%s' non riconosciuta\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opzione illecita -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opzione non valida -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'opzione richiede un argomento -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: l'opzione `-W %s' è ambigua\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: l'opzione `-W %s' non accetta argomenti\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memoria esaurita" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Impossibile cambiare la directory di lavoro" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Impossibile salvare la directory di lavoro" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Rimuovo il `%s' iniziale dai nomi dei membri" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "`%s' iniziale rimosso dagli obiettivi degli hard link" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Sostituisco `.' al nome vuoto di un membro" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "'" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Scritto da F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Scritto da F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Scritto da F. Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Byte totali scritti: %s (%s, %s/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Byte totali scritti: %s (%s, %s/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valore di record_size non valido" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Non è stato indicato il nome di un archivio" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Impossibile verificare archivi su stdin/stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "L'archivio è compresso. Usare l'opzione %s." + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Impossibile aggiornare archivi compressi" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "All'inizio del nastro, abbandono adesso" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Troppi errori, abbandono" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek non si è fermato al limite di un record" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: contiene un numero di volume non valido" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Overflow del numero di volume" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Preparare il volume #%d per %s e premere Invio: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Ricevuto EOF quando era attesa la risposta dell'utente" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ATTENZIONE: l'archivio non è completo" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nessun nuovo volume; esco.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "comando `%s' fallito" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s non continua su questo volume" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s è la dimensione sbagliata (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Questo volume è fuori sequenza" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "L'archivio non ha un'etichetta corrispondente a %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Il volume %s non corrisponde a %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Un singolo blocco di zeri a %s" + +#: 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:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "valore %s fuori dall'intervallo (%s) %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Generazione delle intestazioni ottali negative" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: il nome del link è troppo lungo; non archiviato" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: tipo di file sconosciuto; file ignorato" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "Mancano i link a '%s'.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: non modificato; non archiviato" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: il file è l'archivio; non archiviato" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: il file è stato cancellato prima che potessi leggerlo" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: è etichettata come cache; non archiviata" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: il file è cambiato mentre lo stavo leggendo" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket ignorato" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: la directory è stata rinominata" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: la directory è stata rinominata" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: la directory è nuova" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Orario non valido" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Modo dell'opzione non valido" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Numero di dispositivo non valido" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Numero dell'inode non valido" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "EOF inatteso nell'archivio" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Argomento della densità malformato: '%s'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Argomento della densità malformato: '%s'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Impossibile allocare memoria per il blocking factor %d" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: non elimino la directory: impossibile fare stat" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: cancello %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: formato dell'archivio non valido" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Richieste funzionalità GNU su un formato di archivio incompatibile" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "Modi operativi principali:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "elenca i contenuti dell'archivio" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "estrae file da un archivio" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "crea un nuovo archivio" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "cerca differenze tra l'archivio e il file system" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "accoda i file alla fine di un archivio" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "accoda solo i file più recenti della copia nell'archivio" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "aggiunge il contenuto di un altro archivio" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "cancella dall'archivio (non su nastri magnetici!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modificatori delle operazioni:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "gestisce efficientemente i file sparsi" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "gestisce i vecchi backup incrementali GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FILE" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "gestisce i nuovi backup incrementali GNU" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "non usce con non-zero quando ci sono file illeggibili" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NUMERO" + +#: src/tar.c:409 +#, 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:415 +#, fuzzy +msgid "archive is seekable" +msgstr "È possibile posizionarsi nell'archivio" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "prova a verificare l'archivio dopo averlo scritto" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "cancella i file dopo averli aggiunti all'archivio" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "durante l'estrazione non sovrascrive i file esistenti" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "sovrascrive i file esistenti durante l'estrazione" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "cancella ogni file prima di estrarre su di esso" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "svuota le directory prima di estrarle" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "preserva i metadati delle directory esistenti" + +#: src/tar.c:445 +#, fuzzy +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "sovrascrive i file esistenti durante l'estrazione" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "estrae i file su standard output" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "COMANDO" + +#: src/tar.c:456 +#, fuzzy +msgid "pipe extracted files to another program" +msgstr "estrae i file su standard output" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Gestione degli attributi dei file:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "forza il proprietario NOME per i file aggiunti" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "forza il gruppo NOME per i file aggiunti" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATA-O-FILE" + +#: src/tar.c:472 +#, 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:473 +msgid "CHANGES" +msgstr "CAMBI" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "forza il modo (simbolico) CAMBI per i file aggiunti" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "non estrae l'orario di ultima modifica del file" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "cerca di estrarre i file mantenendo lo stesso proprietario" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "estrae i file come te stesso" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "usa sempre i numeri per i nomi di utente/gruppo" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "ordina i nomi da estrarre come nell'archivio" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "come -p e -s insieme" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Selezione e cambio del dispositivo:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIVIO" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "usa come archivio il file o il dispositivo ARCHIVIO" + +#: src/tar.c:513 +#, fuzzy +msgid "archive file is local even if it has a colon" +msgstr "il file dell'archivio è locale anche se contiene `:'" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "usa il COMANDO rmt indicato invece di rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "usa il COMANDO remoto invece di rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "indica drive e densità" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "crea/elenca/estrae archivi multi-volume" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "cambia il nastro dopo avere scritto NUMERO x 1024 byte" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "esegue lo script alla fine di ogni nastro (implica -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "usa/aggiorna il numero del volume nel FILE" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blocking dei dispositivi:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOCCHI" + +#: src/tar.c:550 +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:552 +#, fuzzy +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "usa SIZE byte per record, multiplo di 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ignora i blocchi a zero nell'archivio (significa EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "rifà i blocchi in lettura (per le pipe di 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Selezione del formato di archiviazione:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMATO" + +#: src/tar.c:564 +#, fuzzy +msgid "create archive of the given format" +msgstr "crea gli archivi nel formato indicato." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "Il FORMATO è uno dei seguenti:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "vecchio formato di tar V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "formato GNU di tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "formato GNU di tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "Formato POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "Formato POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +#, fuzzy +msgid "same as pax" +msgstr "Come pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "come --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "come --format=posix" + +#: src/tar.c:584 +#, fuzzy +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "parolachiave[[:]=valore][,parolachiave[[:]=calore], ...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "controlla le parole chiavi di pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TESTO" + +#: src/tar.c:587 +#, 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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Conflitto tra le opzioni di compressione" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtra l'archivio attraverso bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtra l'archivio attraverso gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtra l'archivio attraverso compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "filtra l'archivio attraverso gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROGRAMMA" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtra usando PROGRAMMA (deve accettare -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Selezione dei file locali:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "DIR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "entra nella directory DIR" + +#: src/tar.c:619 +#, fuzzy +msgid "get names to extract or create from FILE" +msgstr "prende i nomi da estrarre o creare dal file NOME" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T legge nomi terminati da NULL, disabilita -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MODELLO" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "escludi i file i cui nomi corrispondono al MODELLO" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "escludi i modelli elencati in FILE" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "esclude le directory etichettate come cache" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "esclude le directory etichettate come cache" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "esclude le directory etichettate come cache" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "esclude le directory etichettate come cache" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "esclude le directory etichettate come cache" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "non entra automaticamente nelle directory" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "resta nel file system locale durante la creazione dell'archivio" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "entra ricorsivamente nelle directory (predefinito)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "non rimuove lo `/' iniziale dai nomi dei file" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NOME" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "comincia dal membro NOME nell'archivio" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "archivia solo i file più recenti di DATA-O-FILE" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "confronta data e ora solo quando il contenuto è cambiato" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTROLLO" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "fa un backup prima di rimuovere, scegliendo il CONTROLLO di versione" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "STRINGA" + +#: src/tar.c:669 +#, 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:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +#, fuzzy +msgid "strip NUMBER leading components from file names on extraction" +msgstr "toglie NUMERO componenti iniziali dai nomi dei file" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "le esclusioni ignorano maiuscole/minuscole" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "i modelli di esclusione corrispondono all'inizio del nome del file" + +#: src/tar.c:691 +#, fuzzy +msgid "patterns match after any `/' (default for exclusion)" +msgstr "i modelli di esclusione vengono confrontati dopo ogni / (predefinito)" + +#: src/tar.c:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "le esclusioni considerano maiuscole/minuscole (predefinito)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "" +"i metacaratteri dei modelli di esclusione non possono corrispondere a `/'" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "" +"i metacaratteri dei modelli di esclusione possono corrispondere a " +"`/' (predefinito)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Output informativo:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "elenca prolissamente i file processati" + +#: src/tar.c:711 +#, fuzzy +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "mostra i progressi ogni 10 record" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "stampa un messaggio se non tutti i link sono archiviati" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "stampa le date di modifica dei file in formato UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "manda l'output verboso al FILE" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "mostra il numero di blocco nell'archivio ad ogni messaggio" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "chiede conferma per ogni azione" + +#: src/tar.c:733 +#, fuzzy +msgid "show tar defaults" +msgstr "Mostra le opzioni predefinite di tar" + +#: src/tar.c:735 +#, 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:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Opzioni di compabilità:" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "Altre opzioni:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Impossibile indicare più di una delle opzioni `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Conflitto tra le opzioni di compressione" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " tipo di file sconosciuto %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "File della data non trovato" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Sostituisco %s al posto del formato di data sconosciuto %s" + +#: src/tar.c:1022 +#, fuzzy, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Tratto la data `%s' come %s + %ld nanosecondo" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: il file è l'archivio; non archiviato" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Questo* tar ha le seguenti opzioni predefinite:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Blocking factor non valido" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Lunghezza del nastro non valida" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Più di una data di soglia" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: gruppo non valido" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Modo dell'opzione non valido" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Numero non valido" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Proprietario non valido" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Dimensione del record non valida" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "Numero di elementi non valido" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, fuzzy, c-format +msgid "Malformed density argument: %s" +msgstr "Argomento della densità malformato: '%s'" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Densità sconosciuta: '%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FILE]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "La vecchia opzione `%c' richiede un argomento." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence non ha senso senza una lista di file" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence non può essere usata nel modo di operazioni richiesto" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Archivi multipli richiedono l'opzione `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Impossibile combinare --listed-incremental e --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Impossibile verificare archivi multivolume" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Impossibile verificare archivi compressi" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Impossibile usare archivi multivolume compressi" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Impossibile aggiornare archivi compressi" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option può essere usata solo su archivi POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Codardamente mi rifiuto di creare un archivio vuoto" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Le opzioni `-Aru' sono incompatibili con `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Bisogna indicare una delle opzioni `-Acdtrux'" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: gruppo non valido" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Checkpoint di lettura %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Altre opzioni:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "crea gli archivi nel formato indicato." + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "estrae i file su standard output" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "Letti %s byte da %s" + +#: tests/genfile.c:134 +#, fuzzy +msgid "-T reads null-terminated names" +msgstr "-T legge nomi terminati da NULL, disabilita -C" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "prova a verificare l'archivio dopo averlo scritto" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +#, fuzzy +msgid "Execute COMMAND" +msgstr "COMANDO" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Orario non valido" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Numero dell'inode fuori dai limiti" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Errore di sistema sconosciuto" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Impossibile chiudere" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " tipo di file sconosciuto %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: impossibile fare seek a %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Il figlio è morto con il segnale %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Nomi di file mutilati--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "dimensione dei blocchi" + +#~ 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 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" diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000..7ac2a38 Binary files /dev/null and b/po/ja.gmo differ diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..d4b0894 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2572 @@ +# Japanese messages for GNU tar 1.19.90 +# Copyright (C) 1999, 2000, 2001, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. +# Masahito Yamaga , 2008. +# derived from the version by +# Daisuke Yamashita , 1999-2001. +# Masahito Yamaga , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-09 09:10+0900\n" +"Last-Translator: Masahito Yamaga \n" +"Language-Team: Japanese \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "°ú¿ô %s ¤Ï %s ¤ËÂФ·¤Æ̵¸ú¤Ç¤¹" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "°ú¿ô %s ¤Ï %s ¤ËÂФ·¤Æ¤¢¤¤¤Þ¤¤¤Ç¤¹" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Àµ¤·¤¤°ú¿ô¤Ï:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: ARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿¤ÏÃͤ¬É¬Í×" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿¤ÏÀµ¤ÎÃͤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: ̤ÃΤΠARGP_HELP_FMT ¥Ñ¥é¥á¡¼¥¿" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "ARGP_HELP_FMT ¤Ë¥´¥ß: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Ť¤¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëɬ¿Ü¤Þ¤¿¤ÏǤ°Õ¤Î°ú¿ô¤ÏÂбþ¤¹¤ëû¤¤¥ª¥×¥·¥ç¥ó¤ËÂФ·¤Æ¤â" +"ɬ¿Ü¤Þ¤¿¤ÏǤ°Õ¤Ç¤¹." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "»ÈÍÑË¡:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " ¤Þ¤¿¤Ï: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [¥ª¥×¥·¥ç¥ó...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ï `%s --help' ¤Þ¤¿¤Ï `%s --usage' ¤Ç.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "¥Ð¥°¥ì¥Ý¡¼¥È¤Ï %s ¤Þ¤Ç.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "ÉÔÌÀ¤Ê¥·¥¹¥Æ¥à¥¨¥é¡¼" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "¤³¤Î¥Ø¥ë¥×°ìÍ÷¤òɽ¼¨" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "û¤¤»ÈÍÑË¡¥á¥Ã¥»¡¼¥¸¤òɽ¼¨" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NAME" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "¥×¥í¥°¥é¥à̾¤ò»ØÄê" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SECS" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "SECS ÉÃÄä»ß (ɸ½à 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "¥×¥í¥°¥é¥à¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(¥×¥í¥°¥é¥à¥¨¥é¡¼) ¥Ð¡¼¥¸¥ç¥óÉÔÌÀ!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: °ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(¥×¥í¥°¥é¥à¥¨¥é¡¼) ¥ª¥×¥·¥ç¥óǧ¼±ÉÔǽ!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "½ñ¤­¹þ¤ß¥¨¥é¡¼" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `--%s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%c%s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ̤ÃΤΥª¥×¥·¥ç¥ó `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ̤ÃΤΥª¥×¥·¥ç¥ó `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ̵¸ú¤Ê¥ª¥×¥·¥ç¥ó -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹ -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ï¤¢¤¤¤Þ¤¤¤Ç¤¹\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ë¤Ï°ú¿ô¤Ï¤¢¤ê¤Þ¤»¤ó\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "¥á¥â¥ê¤ò»È¤¤ÀÚ¤ê¤Þ¤·¤¿" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "¸½ºß¤Î¥ï¡¼¥¯¥Ç¥£¥ì¥¯¥È¥ê¤òµ­Ï¿¤Ç¤­¤Þ¤»¤ó" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "¥á¥ó¥Ð̾¤«¤éÀèƬ¤Î `%s' ¤ò¼è¤ê½ü¤­¤Þ¤¹" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "¥Ï¡¼¥É¥ê¥ó¥¯À褫¤éÀèƬ¤Î `%s' ¤ò¼è¤ê½ü¤­¤Þ¤¹" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "¶õ¤Î¥á¥ó¥Ð̾¤Ë `.' ¤òÂåÆþ¤·¤Þ¤¹" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yY]" + +#: lib/rpmatch.c:72 +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 "±ó³Ö¥·¥§¥ë¤¬¼Â¹Ô¤Ç¤­¤Þ¤»¤ó" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "(C)" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"»ÈÍѵöÂú GPLv3+: GNU GPL version 3 ¤Þ¤¿¤Ï¤½¤ì°Ê¹ß \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" +"[»²¹ÍÌõ]\n" +"¤³¤ì¤Ï¥Õ¥ê¡¼¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹: Êѹ¹¤ÈºÆÇÛÉۤϼ«Í³¤Ç¤¹.\n" +"ˡΧ¤Çǧ¤á¤é¤ì¤ëÈϰϤǡÖ̵ÊݾڡפǤ¹.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "ºî¼Ô: %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "ºî¼Ô: %s, %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "ºî¼Ô: %s, %s, %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"ºî¼Ô: by %s, %s, %s,\n" +"%s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s, %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s, %s, %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"ºî¼Ô: %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s ¾.\n" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Áí½ñ¤­½Ð¤·¥Ð¥¤¥È¿ô" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "ÁíÆɤ߹þ¤ß¥Ð¥¤¥È¿ô" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Áíºï½ü¥Ð¥¤¥È¿ô: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(¥Ñ¥¤¥×)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "record_size ¤¬Ìµ¸ú¤ÊÃͤǤ¹" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "¥¢¡¼¥«¥¤¥Ö̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "ɸ½àÆþ½ÐÎϤΥ¢¡¼¥«¥¤¥Ö¤Ï¸¡¾Ú¤Ç¤­¤Þ¤»¤ó" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï°µ½Ì¤µ¤ì¤Æ¤¤¤Þ¤¹. %s ¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï¥¢¥Ã¥×¥Ç¡¼¥È¤Ç¤­¤Þ¤»¤ó" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "¥Æ¡¼¥×¤ÎÀèƬ¤Ç¤¹. ½èÍý¤òÃæ»ß¤·¤Þ¤¹" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "¥¨¥é¡¼¤¬Â¿¤¹¤®¤Þ¤¹. ½èÍý¤òÃæ»ß¤·¤Þ¤¹" + +#: src/buffer.c:678 +#, 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:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "µ­Ï¿¥µ¥¤¥º = %lu ¥Ö¥í¥Ã¥¯" +msgstr[1] "µ­Ï¿¥µ¥¤¥º = %lu ¥Ö¥í¥Ã¥¯" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" +"¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤ò¸å¤íÊý¸þ¤ËÌ᤻¤Þ¤»¤ó. -i ¤Ê¤·¤Ç¤ÏÆɤá¤Ê¤¤¤«¤âÃΤì¤Þ¤»¤ó." + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek ¤òµ­Ï¿¤Î¶­³¦¤Ç»ß¤á¤Þ¤»¤ó" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: ̵¸ú¤Ê¥Ü¥ê¥å¡¼¥àÈÖ¹æ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "¥Ü¥ê¥å¡¼¥àÈֹ椬¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤·¤Þ¤·¤¿" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "¥Ü¥ê¥å¡¼¥à #%d (%s) ¤ò½àÈ÷¤·¤Þ¤¹. ¥ê¥¿¡¼¥ó¥­¡¼¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "¥æ¡¼¥¶¤¬±þÅú¤¹¤ë EOF ¤¬É¬ÍפȤʤê¤Þ¤¹" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "·Ù¹ð: ¥¢¡¼¥«¥¤¥Ö¤¬ÉÔ´°Á´¤Ç¤¹" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! ¥µ¥Ö¥·¥§¥ë¤òµ¯Æ°\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? ¤³¤Î¥ê¥¹¥È¤òɽ¼¨\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "¿·¤·¤¤¥Ü¥ê¥å¡¼¥à¤¬¤¢¤ê¤Þ¤»¤ó. ½ªÎ»¤·¤Þ¤¹.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "¥Õ¥¡¥¤¥ë̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó. ¤â¤¦°ìÅÙ.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "ÉÔÀµ¤ÊÆþÎÏ. ? ¤Ç¥Ø¥ë¥×¤òɽ¼¨\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "%s ¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤·¤Þ¤·¤¿" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" +"%s ¤Ï¤³¤Î¥Ü¥ê¥å¡¼¥à¾å¤Ç¤ª¤½¤é¤¯Ï¢Â³¤·¤Æ¤¤¤Þ¤¹: ¥Ø¥Ã¥À¤Ï¾Êά¤µ¤ì¤¿Ì¾Á°¤ò´Þ¤ó¤Ç" +"¤¤¤Þ¤¹" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s ¤Ï¤³¤Î¥Ü¥ê¥å¡¼¥à¾å¤ÇϢ³¤·¤Æ¤¤¤Þ¤»¤ó" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s ¤ÏÉÔÀµ¤Ê¥µ¥¤¥º¤Ç¤¹ (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "¤³¤Î¥Ü¥ê¥å¡¼¥à¤ÏϢ³¤·¤Æ¤¤¤Þ¤»¤ó" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï %s ¤Ë°ìÃפ¹¤ë¥é¥Ù¥ë¤¬ÉÕ¤¤¤Æ¤¤¤Þ¤»¤ó" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "¥Ü¥ê¥å¡¼¥à %s ¤Ï %s ¤Ë°ìÃפ·¤Þ¤»¤ó" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "%s ¤ËŤ¤¥¼¥í¥Ö¥í¥Ã¥¯" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: ¥­¥ã¥Ã¥·¥å ¥Ç¥£¥ì¥¯¥È¥ê ¥¿¥° %s ¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹; %s" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "ÃÍ %s ¤Ï %s ¤ÎÈÏ°Ï %s..%s ¤Ë¤¢¤ê¤Þ¤»¤ó -- %s ¤òÂåÍÑ" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "ÃÍ %s ¤Ï %s ¤ÎÈÏ°Ï %s..%s ¤Ë¤¢¤ê¤Þ¤»¤ó" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Éé¤Î 8 ¿Ê¥Ø¥Ã¥À¤òÀ¸À®¤·¤Þ¤¹" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: ¥Õ¥¡¥¤¥ë̾¤¬Ä¹²á¤®¤ë (ºÇÂç %d) ¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s: ¥Õ¥¡¥¤¥ë̾¤¬Ä¹²á¤®¤ë (ʬ³äÉÔǽ) ¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: ¥ê¥ó¥¯Ì¾¤¬Ä¹²á¤®¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: ¥Õ¥¡¥¤¥ë¤Ï°Û¤Ê¤ë¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¾å¤Ë¤¢¤ë¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "ÆâÍƤò¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: ̤ÃΤΥե¡¥¤¥ë·Á¼°; ¥Õ¥¡¥¤¥ë¤Ï̵»ë¤µ¤ì¤Þ¤¹" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "%s ¤Ø¤Î¥ê¥ó¥¯¤¬¤¢¤ê¤Þ¤»¤ó.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: Êѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: ¤Ï¥¢¡¼¥«¥¤¥Ö¤Ê¤Î¤Ç¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Æɤ߹þ¤ß°ÊÁ°¤Ëºï½ü¤µ¤ì¤Þ¤·¤¿" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò¥À¥ó¥×¤·¤Þ¤»¤ó" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: Æɤ߹þ¤ó¤À¥Õ¥¡¥¤¥ë¤¬Êѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: ¥½¥±¥Ã¥È¤Ï̵»ë¤·¤Þ¤¹" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê̾¤¬ %s ¤«¤éÊѹ¹¤µ¤ì¤Þ¤·¤¿" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê̾¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ï¿·¤·¤¯ºî¤é¤ì¤Þ¤·¤¿" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "̵¸ú¤Ê¥¿¥¤¥à¥¹¥¿¥ó¥×" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "ÉÔÀµ¤ÊºÇ½ª¹¹¿·»þ¹ï (ÉÃ)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "ÉÔÀµ¤ÊºÇ½ª¹¹¿·»þ¹ï (¥Ê¥ÎÉÃ)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "̵¸ú¤Ê¥Ç¥Ð¥¤¥¹ÈÖ¹æ¤Ç¤¹" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "̵¸ú¤Ê inode ÈÖ¹æ" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤ÎÆɤ߹þ¤ßÃæ¤Ë¥Õ¥£¡¼¥ë¥É¤¬Ä¹²á¤®¤Þ¤¹" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤ËÆɤ߹þ¤ß¥¨¥é¡¼" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤Ëͽ´ü¤»¤Ì EOF" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¥Õ¥¡¥¤¥ë¤Ëͽ´ü¤»¤Ì¥Õ¥£¡¼¥ë¥ÉÃÍ" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "½ªÃ¼µ­Ï¿¤Ê¤·" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "ÉÔÀµ¤ÊÁýʬ¥Õ¥¡¥¤¥ë·Á¼°" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "̤¼ÂÁõ¤ÎÁýʬ·Á¼°¥Ð¡¼¥¸¥ç¥ó: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: '%c' ¤¬¤¢¤ë¤Ù¤­¤È¤³¤í¤Ë %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'X' ¤¬½ÅÊ£" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'R' ¤Ë¶õ¤Î̾Á°" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'T' ¤¬ 'R' ¤ÎÁ°¤Ë¤Ê¤¤" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'T' ¤Ë¶õ¤Î̾Á°" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: '%c' ¤¬¤¢¤ë¤Ù¤­¤È¤³¤í¤Ë¥Ç¡¼¥¿¤Î½ªÃ¼" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "ÉÔÀµ·Á¼°¤Î dumpdir: 'X' ¤¬Ì¤»ÈÍÑ" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "¥Æ¥ó¥×¥ì¡¼¥È %s ¤ò»È¤Ã¤Æ°ì¼¡¥Ç¥£¥ì¥¯¥È¥ê¤òºî¤ì¤Þ¤»¤ó" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤òºï½ü¤·¤Þ¤»¤ó: ¾õÂÖ¤¬Ê¬¤«¤ê¤Þ¤»¤ó" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¤Ï°Û¤Ê¤ë¥Ç¥Ð¥¤¥¹¾å¤Ë¤¢¤ë¤Î¤Ç¾Ãµî¤·¤Þ¤»¤ó" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s ¤òºï½ü\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "¥ª¥×¥·¥ç¥ó `-%s' ¤È `-%s' ¤Ï¤É¤Á¤é¤âɸ½àÆþÎϤ¬É¬ÍפǤ¹" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: ̵¸ú¤Ê¥¢¡¼¥«¥¤¥Ö·Á¼°" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU ÆÃÍ­¤Îµ¡Ç½¤Ï¡¢Èó¸ß´¹¤Ê·Á¼°¤òɬÍפȤ·¤Þ¤¹" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "¼çÁàºî¥â¡¼¥É:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "¥¢¡¼¥«¥¤¥Ö¤ÎÆâÍƤò°ìÍ÷ɽ¼¨" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "¥¢¡¼¥«¥¤¥Ö¤«¤é¥Õ¥¡¥¤¥ë¤òÃê½Ð" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "¿·¤·¤¤¥¢¡¼¥«¥¤¥Ö¤òºîÀ®" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "¥¢¡¼¥«¥¤¥Ö¤È¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤È¤Î°ã¤¤¤ò¸«ÉÕ¤±¤ë" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "¥¢¡¼¥«¥¤¥Ö¤ÎËöÈø¤Ë¥Õ¥¡¥¤¥ë¤òÄɲÃ" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "¥¢¡¼¥«¥¤¥ÖÆâ¤Ë¤¢¤ë¥Õ¥¡¥¤¥ë¤è¤ê¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Î¤ß¤òÄɲÃ" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "¥¢¡¼¥«¥¤¥Ö¤Ë tar ¥Õ¥¡¥¤¥ë¤òÄɲÃ" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "¥¢¡¼¥«¥¤¥Ö¤«¤éºï½ü (¼§µ¤¥Æ¡¼¥×¾å¤Ç¤Ï¥À¥á!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "¥¢¡¼¥«¥¤¥Ö¤Î¥Ü¥ê¥å¡¼¥à¥é¥Ù¥ë¤ò¥Æ¥¹¥È¤·¤Æ½ªÎ»" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Áàºî¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëÉղõ¡Ç½:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "¤Þ¤Ð¤é¤Ë¸ºß¤¹¤ë¥Õ¥¡¥¤¥ë¤ò¸ú²ÌŪ¤Ë½èÍý" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAJOR[.MINOR]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "¤Þ¤Ð¤é (sparse) ·Á¼°¤Î¥Ð¡¼¥¸¥ç¥ó¤òÀßÄê (--sparse ¤Î°ÕÌ£¤ò´Þ¤à)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "¸Å¤¤ GNU ·Á¼°¤Î¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½èÍý" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FILE" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "¿·¤·¤¤ GNU ·Á¼°¤Î¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½èÍý" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "Æɤ߹þ¤á¤Ê¤¤¥Õ¥¡¥¤¥ë¾å¤ËÈó¥¼¥í¤Î¾õÂ֤Ǹºß¤·¤Þ¤»¤ó" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NUMBER" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "¥¢¡¼¥«¥¤¥Ö¤Ï¸¡º÷²Äǽ" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "À©¸æ¤ò¾å½ñ¤­:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "¥¢¡¼¥«¥¤¥Ö¤ò½ñ¤­½Ð¤·¤¿¸å¤Ë¸¡¾Ú" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "¥Õ¥¡¥¤¥ë¤ò¥¢¡¼¥«¥¤¥Ö¤Ë²Ã¤¨¤¿¸å¤Çºï½ü" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¤Î¥Õ¥¡¥¤¥ë¤òÃÖ¤­´¹¤¨¤Ê¤¤" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "¥¢¡¼¥«¥¤¥Ö¥³¥Ô¡¼¤è¤ê¿·¤·¤¤´û¸¥Õ¥¡¥¤¥ë¤òÃÖ¤­´¹¤¨¤Ê¤¤" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "³Æ¡¹¤Î¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æ¾å½ñ¤­¤¹¤ëÁ°¤Ëºï½ü" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò¼è¤ê½Ð¤¹Á°¤Ë³¬Áؤò¶õ¤Ë" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "´û¸¥Ç¥£¥ì¥¯¥È¥ê¤Î¥á¥¿¥Ç¡¼¥¿¤òÊݸ" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "¼è¤ê½Ð¤¹ºÝ¤Ë´û¸¥Ç¥£¥ì¥¯¥È¥ê¤Î¥á¥¿¥Ç¡¼¥¿¤ò¾å½ñ¤­ (ɸ½à)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "½ÐÎÏ¥¹¥È¥ê¡¼¥à¤òÁªÂò" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æɸ½à½ÐÎϤ˽ÐÎÏ" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "COMMAND" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤ÆÊÌ¤Î¥×¥í¥°¥é¥à¤Ë½ÐÎÏ" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "»Ò¥×¥í¥»¥¹¤Î½ªÎ»¥³¡¼¥É¤ò̵»ë" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "»Ò¥×¥í¥»¥¹¤ÎÈó¥¼¥í½ªÎ»¥³¡¼¥É¤ò¥¨¥é¡¼¤È¤·¤Æ½èÍý" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "¥Õ¥¡¥¤¥ë°À­¤Î½èÍý" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î½êÍ­¼Ô¤ò NAME ¤ËÊѹ¹" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î¥°¥ë¡¼¥×¤ò NAME ¤ËÊѹ¹" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATE-OR-FILE" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "DATE-OR-FILE ¤«¤éÄɲåե¡¥¤¥ë¤Î mtime ¤òÀßÄê" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "CHANGES" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "²Ã¤¨¤¿¥Õ¥¡¥¤¥ë¤Î (¥·¥ó¥Ü¥ê¥Ã¥¯) ¥â¡¼¥É¤ò CHANGES ¤ËÊѹ¹" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METHOD" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¼è¤ê½Ð¤µ¤Ê¤¤" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "Ʊ¤¸½êÍ­¼Ô¤Î¤Þ¤Þ¤Ç¥Õ¥¡¥¤¥ë¤ò¼è¤ê½Ð¤·¤Æ¤ß¤ë" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "¤¢¤Ê¤¿¼«¿È¤Î¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼è¤ê½Ð¤¹" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "¥æ¡¼¥¶Ì¾/¥°¥ë¡¼¥×̾¤È¤·¤Æ¾ï¤Ë¿ô»ú¤ò»È¤¦" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "¥Õ¥¡¥¤¥ë°À­¤Ë¤Ä¤¤¤Æ¤Î¾ðÊó¤òÃê½Ð (superuser ¤Ç¤Ïɸ½à)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"¥¢¡¼¥«¥¤¥Ö¤«¤é°À­¤òÃê½Ð¤¹¤ëºÝ¤Ë¥æ¡¼¥¶¤Î umask ¤òŬÍÑ (°ìÈ̥桼¥¶¤Ç¤Ïɸ½à)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "¥¢¡¼¥«¥¤¥Ö¤È¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë¼è¤ê½Ð¤¹Ì¾Á°¤òʤÓÂؤ¨" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "-p ¤È -s ¤ÎξÊý¤ò»ØÄꤷ¤¿¤â¤Î¤ÈƱ¤¸" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"Ãê½Ð¤¬½ªÎ»¤¹¤ë¤Þ¤ÇÃê½Ð¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤ÎºÇ½ª¹¹¿·»þ¹ï¤È°À­¤ÎÀßÄê¤òÃ٤餻¤ë" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "--delay-directory-restore ¥ª¥×¥·¥ç¥ó¤Î¸ú²Ì¤ò¼è¤ê¾Ã¤·" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "¥Ç¥Ð¥¤¥¹¤ÎÁªÂò¤ÈÀÚÂØ:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIVE" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥Ð¥¤¥¹ ARCHIVE ¤ò»ÈÍÑ" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Ï¥³¥í¥ó¤ò´Þ¤ó¤Ç¤¤¤Æ¤â¥í¡¼¥«¥ë" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "»ØÄꤵ¤ì¤¿ rmt COMMAND ¤ò rmt ¤ÎÂå¤ï¤ê¤Ë»ÈÍÑ" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "rsh ¤ÎÂå¤ï¤ê¤Ë COMMAND ¤ò»ÈÍÑ" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "¥É¥é¥¤¥Ö¤ÈÌ©ÅÙ¤ò»ØÄê" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¤Î¥¢¡¼¥«¥¤¥Ö¤òºîÀ®/°ìÍ÷/Ãê½Ð" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "NUMBER x 1024 ¥Ð¥¤¥È¤ò½ñ¤­½Ð¤·¤¿¸å¤Ç¥Æ¡¼¥×¤òÊѹ¹" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "³Æ¡¹¤Î¥Æ¡¼¥×¤ÎºÇ¸å¤Ç¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô (-M ɬ¿Ü)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "FILE Ãæ¤Î¥Ü¥ê¥å¡¼¥àÈÖ¹æ¤ò»ÈÍÑ/¹¹¿·" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "¥Ç¥Ð¥¤¥¹¥Ö¥í¥Ã¥­¥ó¥°:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOCKS" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "¥ì¥³¡¼¥É¤¢¤¿¤ê BLOCKS x 512 ¥Ð¥¤¥È" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "¥ì¥³¡¼¥É¤¢¤¿¤ê NUMBER ¥Ð¥¤¥È. 512 ¤ÎÇÜ¿ô" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤Î¥¼¥í¥Ö¥í¥Ã¥¯ (¤Ä¤Þ¤ê EOF) ¤ò̵»ë" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "Æɤ߽Ф·¤¿¤è¤¦¤ËºÆ¥Ö¥í¥Ã¥¯ (4.2BSD ¥Ñ¥¤¥×ÍÑ)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "¥¢¡¼¥«¥¤¥Ö·Á¼°¤ÎÁªÂò" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "»ØÄꤵ¤ì¤¿·Á¼°¤Î¥¢¡¼¥«¥¤¥Ö¤òºîÀ®" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT ¤Ï¼¡¤Î¤¦¤Á¤Î 1¤Ä:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "¸Å¤¤ V7 tar ·Á¼°" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU tar 1.12 °ÊÁ°¤Î·Á¼°" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x ·Á¼°" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) ·Á¼°" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) ·Á¼°" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "pax ¤ÈƱ¤¸" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "--format=v7 ¤ÈƱ¤¸" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "--format=posix ¤ÈƱ¤¸" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "keyword[[:]=value][,keyword[[:]=value]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "pax ¥­¡¼¥ï¡¼¥É¤òÀ©¸æ" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEXT" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "°µ½Ì¥ª¥×¥·¥ç¥ó:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "°µ½Ì¥×¥í¥°¥é¥à¤ò·è¤á¤ë¤Î¤Ë¥¢¡¼¥«¥¤¥ÖÀÜÈø¼­¤ò»ÈÍÑ" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "bzip2 ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "gzip ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "compress ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "lzma ·Ðͳ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò¥Õ¥£¥ë¥¿" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "PROG ·Ðͳ¤Ç¥Õ¥£¥ë¥¿ (-d ¤ò¼õ¤±ÉÕ¤±¤ëɬÍפ¢¤ê)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ëÁªÂò:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" +"»ØÄꤵ¤ì¤¿ FILE ¤ò¥¢¡¼¥«¥¤¥Ö¤ËÄɲà (¥À¥Ã¥·¥å ' ¤Ç»Ï¤Þ¤ë¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¤ËÊØ" +"Íø)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "DIR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê DIR ¤Ø°ÜÆ°" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "Ãê½Ð¤Þ¤¿¤ÏºîÀ®¤¹¤ë̾Á°¤ò¥Õ¥¡¥¤¥ë FILE ¤«¤é¼èÆÀ" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T ¤¬ null ¤Ç½ª¤ï¤ë̾Á°¤òÆɤ߹þ¤ß, -C ¤ò̵¸ú¤Ë" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "-T ¤ÇÆɤ߹þ¤ó¤À¥Õ¥¡¥¤¥ë̾¤ò°úÍѽªÎ»¤¹¤ë (ɸ½à)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "-T ¤ÇÆɤ߹þ¤ó¤¿¥Õ¥¡¥¤¥ë̾¤ò°úÍѽªÎ»¤·¤Ê¤¤" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATTERN" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "PATTERN ¤Ë°ìÃפ¹¤ë¥Õ¥¡¥¤¥ë¤ò½ü³°" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "FILE ¤ËÎóµó¤µ¤ì¤¿¥Ñ¥¿¡¼¥ó¤ò½ü³°" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "¥¿¥°¥Õ¥¡¥¤¥ë¼«¿È¤ò½ü¤¯ CACHEDIR.TAG ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÆâÍƤò½ü³°" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê°Ê²¼¤ÎÁ´¤Æ¤ò½ü³°" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "FILE ¼«¿È¤ò½ü¤¯ FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÆâÍƤò½ü³°" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê°Ê²¼¤ÎÁ´¤Æ¤ò½ü³°" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "FILE ¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "¥Ð¡¼¥¸¥ç¥ó´ÉÍý¥·¥¹¥Æ¥à¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ò½ü³°" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò¼«Æ°Åª¤Ë²¼¤Ã¤Æ¤¤¤«¤Ê¤¤" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "¥¢¡¼¥«¥¤¥ÖºîÀ®»þ¤Ë¥í¡¼¥«¥ë¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥à¤Ë¸ÂÄê" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ò½ç·«¤ê¤Ë²¼¤Ã¤Æ¤¤¤¯ (default)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "¥Õ¥¡¥¤¥ë̾¤«¤éÀèƬ¤Î `/' ¤ò¼è¤ê½ü¤«¤Ê¤¤" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "¥·¥ó¥Ü¥ê¥Ã¥¯¥ê¥ó¥¯¤ò¤¿¤É¤ë; ¤½¤ì¤é¤¬»Ø¤¹¥Õ¥¡¥¤¥ë¤ò¥¢¡¼¥«¥¤¥Ö¤·¤Æ¥À¥ó¥×" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "¥Ï¡¼¥É¥ê¥ó¥¯¤ò¤¿¤É¤ë; ¤½¤ì¤é¤¬»Ø¤¹¥Õ¥¡¥¤¥ë¤ò¥¢¡¼¥«¥¤¥Ö¤·¤Æ¥À¥ó¥×" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "MEMBER-NAME" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "¥¢¡¼¥«¥¤¥ÖÃæ¤Î¥á¥ó¥Ð¡¼ MEMBER-NAME ¤Ç³«»Ï" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "DATE-OR-FILE ¤è¤ë¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Î¤ß¤ò³ÊǼ" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATE" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "¥Ç¡¼¥¿¤¬Êѹ¹¤µ¤ì¤¿»þ¤À¤±ÆüÉÕ¤ª¤è¤Ó»þ¹ï¤òÈæ³Ó" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTROL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "ºï½üÁ°¤Ë¥Ð¡¼¥¸¥ç¥ó´ÉÍý¤ò CONTROL ¤Ë¤·¤Æ¥Ð¥Ã¥¯¥¢¥Ã¥×" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "STRING" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"ºï½üÁ°¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×, Ä̾ï¤ÎÀÜÈø¼­ (´Ä¶­ÊÑ¿ô SIMPLE_BACKUP_SUFFIX ¤¬Ì¤ÀßÄê¤Ê" +"¤é '~') ¤ò¾å½ñ¤­" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "¥Õ¥¡¥¤¥ë̾ÊÑ´¹:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "Ãê½Ð»þ¤Ë¥Õ¥¡¥¤¥ë̾¤«¤éÀèƬ¤Î NUMER ¸Ä¤Î¥³¥ó¥Ý¥Í¥ó¥È¤ò½üµî" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "EXPRESSION" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "¥Õ¥¡¥¤¥ë̾¤ÎÊÑ´¹¤Ë sed ¤ÎÃÖ´¹ EXPRESSION ¤ò»ÈÍÑ" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "¥Õ¥¡¥¤¥ë̾°ìÃ×¥ª¥×¥·¥ç¥ó (½ü³°/Êñ´Þ¤Îξ¥Ñ¥¿¡¼¥ó¤ËºîÍÑ):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "Âçʸ»ú¾®Ê¸»ú¤ò̵»ë" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤È¥Ñ¥¿¡¼¥ó¤¬°ìÃ×" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "Ǥ°Õ¤Î `/' °Ê¹ß¤Ë¥Ñ¥¿¡¼¥ó¤¬°ìÃ× (ɸ½à¤Ç½ü³°)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "Âçʸ»ú¾®Ê¸»ú¤ò¹Íθ¤·¤Æ°ìÃ× (ɸ½à)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍÑ (ɸ½à¤Ç½ü³°)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "Ãà¸ìŪʸ»úÎó°ìÃ×" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤¬ `/' ¤Ë°ìÃפ·¤Ê¤¤" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "¥ï¥¤¥ë¥É¥«¡¼¥É¤¬ `/' ¤Ë°ìÃ× (ɸ½à¤Ç½ü³°)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "¾ðÊó:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "½èÍý¤µ¤ì¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤Î°ìÍ÷¤ò¾éŤËɽ¼¨" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "NUMBER (ɸ½à 10) ÈÖÌܤε­Ï¿¤´¤È¤Ë¿ÊĽ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "ACTION" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "³Æ¸¡Ìä¤Ç ACTION ¤ò¼Â¹Ô" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "Á´¤Æ¤Î¥ê¥ó¥¯¤¬¥À¥ó¥×¤µ¤ì¤Ê¤¤¾ì¹ç¥á¥Ã¥»¡¼¥¸¤òɽ¼¨" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "¥Õ¥¡¥¤¥ë¤Î¹¹¿·ÆüÉÕ¤ò UTC ¤Çɽ¼¨" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "¾éĹ½ÐÎϤò FILE ¤ËÁ÷¿®" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "¥¢¡¼¥«¥¤¥ÖÆâ¤Î¥Ö¥í¥Ã¥¯¿ô¤ò³Æ¡¹¥á¥Ã¥»¡¼¥¸ÉÕ¤­¤Çɽ¼¨" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "Á´¤Æ¤ÎÆ°ºî¤ò³Îǧ" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "tar ¤Îµ¬ÄêÃͤòɽ¼¨" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "°ìÍ÷¤äÃê½Ð»þ¤Ë, ¸¡º÷´ð½à¤Ë°ìÃפ·¤Ê¤¤¥Ç¥£¥ì¥¯¥È¥ê¤ò³Æ¡¹°ìÍ÷ɽ¼¨" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "ÊÖ´Ô¸å¤Ë¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤Ï¥¢¡¼¥«¥¤¥Ö̾¤òɽ¼¨" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STYLE" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "̾Á°°úÍÑ·Á¼°¤òÀßÄê. Í­¸ú¤Ê STYLE Ãͤϲ¼µ­»²¾È." + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "¹¹¤Ë STRING ¤«¤éʸ»ú¤ò°úÍÑ" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "STRING ¤«¤é¤Îʸ»ú°úÍѤò̵¸ú¤Ë" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "¸ß´¹¥ª¥×¥·¥ç¥ó:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "ºîÀ®»þ¤Ï --old-archive ¤ÈƱ¤¸. Ãê½Ð»þ¤Ï --no-same-owner ¤ÈƱ¤¸" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "¤½¤Î¾¥ª¥×¥·¥ç¥ó:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "ÀøºßŪ¤Ë³²¤Ë¤Ê¤ë¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤò̵¸ú¤Ë" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "`-Acdtrux' ¥ª¥×¥·¥ç¥ó¤Î¤¦¤Á 2¤Ä°Ê¾å»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó." + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "°µ½Ì¥ª¥×¥·¥ç¥ó¤¬¿©¤¤°ã¤Ã¤Æ¤¤¤Þ¤¹" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "̤ÃΤΥ·¥°¥Ê¥ë̾: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "ÆüÉÕ¥µ¥ó¥×¥ë¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "̤ÃΤÎÆüÉÕ¥Õ¥©¡¼¥Þ¥Ã¥È¤Î %2$s Âå¤ï¤ê¤Ë %1$s ¤È¤·¤Þ¤¹" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "¥ª¥×¥·¥ç¥ó %s: `%s' ¤ò %s ¤È¤·¤Æ°·¤¦" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: ¥Õ¥¡¥¤¥ë°ìÍ÷¤Ï´û¤ËÆɤ߹þ¤ßºÑ¤ß" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: Æɤ߹þ¤Þ¤ì¤¿¥Õ¥¡¥¤¥ë̾¤Ë¥Ì¥ëʸ»ú" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "--quoting-style ¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ëÍ­¸ú¤Ê°ú¿ô¤Ï:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"¡Ö¤³¤Î¡×tar ¤Îµ¬ÄêÃÍ:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "̵¸ú¤Ê¥Ö¥í¥Ã¥­¥ó¥°°ø»Ò" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "·Ù¹ð: -I ¥ª¥×¥·¥ç¥ó¤Ï¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó -- ¿ʬ -j ¤« -T ¤Ê¤Î¤Ç¤Ï?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "̵¸ú¤Ê¥Æ¡¼¥×¤ÎŤµ" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "1¤Ä°Ê¾å¤ÎÉßµï¤È¤Ê¤ëÆüÉÕ" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "̵¸ú¤Ê¤Þ¤Ð¤é (sparse) ¥Ð¡¼¥¸¥ç¥óÃÍ" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' ¤Ï¤³¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint ÃͤÏÀ°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: ̵¸ú¤Ê¥°¥ë¡¼¥×" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥â¡¼¥É¤Ï̵¸ú¤Ç¤¹" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "̵¸ú¤Ê¿ô" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "̵¸ú¤Ê½êÍ­¼Ô" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "̵¸ú¤Êµ­Ï¿¥µ¥¤¥º" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "µ­Ï¿¥µ¥¤¥º¤Ï %d ¤ÎÇÜ¿ô¤Ç¤Ê¤±¤ì¤Ð¤¤¤±¤Þ¤»¤ó" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "̵¸ú¤Ê¥¨¥ì¥á¥ó¥È¿ô" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "--to-command ¥ª¥×¥·¥ç¥ó¤Ï 1¤Ä¤À¤±µö²Ä" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "ÉÔÀµ·Á¼°¤ÎÌ©ÅÙ°ú¿ô: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "̤ÃΤÎÌ©ÅÙ: `%c'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "¥ª¥×¥·¥ç¥ó `-[0-7][lmh]' ¤Ï¡Ö¤³¤Î¡×tar ¤Ç¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[¥Õ¥¡¥¤¥ë]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "¸Å¤¤¥ª¥×¥·¥ç¥ó `%c' ¤Ï°ú¿ô¤òɬÍפȤ·¤Þ¤¹" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence ¤Ï¥Õ¥¡¥¤¥ë°ìÍ÷¤¬¤Ê¤±¤ì¤Ð̵°ÕÌ£" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence ¤ÏÍ׵ᤵ¤ì¤¿Áàºî¥â¡¼¥É¤Ç¤Ï»È¤¨¤Þ¤»¤ó" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "ʬ³ä·¿¤Î¥¢¡¼¥«¥¤¥Ö¥Õ¥¡¥¤¥ë¤Ë¤Ï `-M' ¥ª¥×¥·¥ç¥ó¤¬É¬ÍפǤ¹" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental ¤È --newer ¤È¤ò·ë¹ç¤Ç¤­¤Þ¤»¤ó" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¥¢¡¼¥«¥¤¥Ö¤ò³Îǧ¤Ç¤­¤Þ¤»¤ó" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï³Îǧ¤Ç¤­¤Þ¤»¤ó" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "¥Þ¥ë¥Á¥Ü¥ê¥å¡¼¥à¤Ë°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤Ï»È¤¨¤Þ¤»¤ó" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "°µ½Ì¤µ¤ì¤¿¥¢¡¼¥«¥¤¥Ö¤ÏÏ¢·ë¤Ç¤­¤Þ¤»¤ó" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option ¤Ï POSIX ¥¢¡¼¥«¥¤¥Ö¤Ç¤Î¤ß»È¤¨¤Þ¤¹" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "¶õ¤Î¥¢¡¼¥«¥¤¥ÖºîÀ®¤Ï¤´ÍƼϴꤤ¤Þ¤¹" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "¥ª¥×¥·¥ç¥ó `-Aru' ¤È `-f -' ¤È¤ÏÁêÍƤì¤Þ¤»¤ó" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "¥ª¥×¥·¥ç¥ó `-Acdtrux' ¤Î¤¦¤Á¡¢¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó" + +#: src/tar.c:2483 +#, 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 ¤Ï̵¸ú: ´ñ¿ôÃÍ" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: ̵¸ú¤Ê¥¿¥¤¥à¥¢¥¦¥È" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: ̤ÃΤθ¡Ìä½èÍý" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "½ñ¤­¹þ¤ß" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È %u ¤òÆɤ߹þ¤ß¤Þ¤¹" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile ¤Ï GNU paxutils ¥Æ¥¹¥È¥»¥Ã¥È¤ËÂФ·¤Æ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤òÁàºî¤·¤Þ¤¹.\n" +"¥ª¥×¥·¥ç¥ó¤Ï:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "¥Õ¥¡¥¤¥ëºîÀ®¥ª¥×¥·¥ç¥ó:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "SIZE" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "»ØÄꤵ¤ì¤¿ SIZE ¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "ɸ½à½ÐÎϤÎÂå¤ï¤ê¤Ë¥Õ¥¡¥¤¥ë NAME ¤Ë½ÐÎÏ" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "FILE ¤«¤é¥Õ¥¡¥¤¥ë̾¤òÆɤ߹þ¤ß" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T ¤Ï null ¤Ç½ª¤ï¤ë̾Á°¤òÆɤ߹þ¤ß¤Þ¤¹" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"»ØÄꤵ¤ì¤¿ PATTERN ¤Ç¥Õ¥¡¥¤¥ë¤òËä¤á¤Þ¤¹. PATTERN ¤Ï 'default' ¤Þ¤¿¤Ï 'zeros'" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤Î¥Ö¥í¥Ã¥¯¥µ¥¤¥º" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤òÀ¸À®. »Ä¤ê¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Õ¥¡¥¤¥ë¥Þ¥Ã¥×¤ò»ØÄê." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "¥ª¥Õ¥»¥Ã¥È" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "¥Ç¡¼¥¿¤ò½ñ¤­½Ð¤¹Á°¤Ë»ØÄꤵ¤ì¤¿¥ª¥Õ¥»¥Ã¥È¤Þ¤Ç¸¡º÷" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "¥Õ¥¡¥¤¥ëÅý·×¥ª¥×¥·¥ç¥ó:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "³Æ¡¹¤Î»ØÄê¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ struct stat ¤ÎÆâÍƤòɽ¼¨. ɸ½à FORMAT ¤Ï: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Ʊ»þ¼Â¹Ô¥ª¥×¥·¥ç¥ó:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"»ØÄꤵ¤ì¤¿ COMMAND ¤ò¼Â¹Ô. --checkpoint ¤ª¤è¤Ó --cut, --append, --touch ¤ÎÃæ" +"¤Î 1¤Ä¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤È¤è¤¤" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È NUMBER Åþã»þ¤Ë»ØÄꤵ¤ì¤¿¥¢¥¯¥·¥ç¥ó (²¼µ­»²¾È) ¤ò¼Â¹Ô" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "¼¡¤Î --touch ¥ª¥×¥·¥ç¥ó¤ÇÆüÉÕ¤òÀßÄê" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "¼Â¹Ô¤µ¤ì¤¿¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È¤È COMMAND ¤Î½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤òɽ¼¨" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Ʊ»þ¼Â¹Ô¥¢¥¯¥·¥ç¥ó. ¤³¤ì¤é¤Ï --checkpoint option ¤Ç»ØÄꤵ¤ì¤¿¥Á¥§¥Ã¥¯¥Ý¥¤¥ó¥È" +"ÈÖ¹æ¤ËÅþ㤷¤¿¤È¤­¤Ë¼Â¹Ô¤µ¤ì¤ë." + +#: tests/genfile.c:180 +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:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "FILE ¤Ë SIZE ¥Ð¥¤¥ÈÄɵ­. SIZE ¤ÏÁ°¤Î --length ¥ª¥×¥·¥ç¥ó¤Ç»ØÄê." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "FILE ¤ÎºÇ½ª¥¢¥¯¥»¥¹»þ¹ï¤ÈºÇ½ª¹¹¿·»þ¹ï¤ò¹¹¿·" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "COMMAND ¤ò¼Â¹Ô" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "̵¸ú¤Ê¥µ¥¤¥º: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Èֹ椬µö²Ä¤µ¤ì¤¿Èϰϳ°: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Éé¤Î¥µ¥¤¥º: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) ¼ºÇÔ" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "`%s' ¤Î¶á¤¯¤Ç¿ô»ú¤ò¹½Ê¸Ê¬ÀÏ»þ¤Ë¥¨¥é¡¼" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "̤ÃΤÎÆüÉÕ·Á¼°" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGS...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "`%s' ¤ò³«¤±¤Þ¤»¤ó" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "Áܤ·½Ð¤»¤Þ¤»¤ó" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "¥Õ¥¡¥¤¥ë̾¤¬¥Ì¥ëʸ»ú¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"¤Þ¤Ð¤é¤Ê (sparse) ¥Õ¥¡¥¤¥ë¤òɸ½à½ÐÎϤ˽ñ¤­½Ð¤»¤Þ¤»¤ó. --file ¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "ÉÔÀµ¤Ê¥Þ¥¹¥¯ (`%s' ¤Ë¶á¤¤)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "̤ÃΤΥե£¡¼¥ë¥É `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "`%s' ¤Ë»þ¹ï¤òÀßÄê¤Ç¤­¤Þ¤»¤ó" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "¥³¥Þ¥ó¥É¤¬Àµ¾ï½ªÎ»\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "¥³¥Þ¥ó¥É¤¬¥¹¥Æ¡¼¥¿¥¹ %d ¤Ç¼ºÇÔ\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "¥³¥Þ¥ó¥É¤¬¥·¥°¥Ê¥ë %d ¤Ç½ªÎ»\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "¥³¥Þ¥ó¥É¤¬¥·¥°¥Ê¥ë %d ¤ÇÄä»ß\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "¥³¥Þ¥ó¥É¤¬¥³¥¢¤ò¥À¥ó¥×\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "¥³¥Þ¥ó¥É¤¬½ªÎ»\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat ¤Ë¤Ï¥Õ¥¡¥¤¥ë̾¤¬É¬Í×" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "°ú¿ô¤¬Â¿¤¹¤®¤Þ¤¹" diff --git a/po/ko.gmo b/po/ko.gmo new file mode 100644 index 0000000..9735173 Binary files /dev/null and b/po/ko.gmo differ diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..870b392 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,3178 @@ +# Korean messages for GNU tar +# Copyright (C) 1996 Free Software Foundation, Inc. +# Bang Jun-Young , 1996-1997. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.12\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 1997-05-30 22:55+0900\n" +"Last-Translator: Bang Jun-Young \n" +"Language-Team: Korean \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-KR\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/argmatch.c:133 +#, fuzzy, c-format +msgid "invalid argument %s for %s" +msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'" + +#: lib/argmatch.c:134 +#, fuzzy, c-format +msgid "ambiguous argument %s for %s" +msgstr "¸ðÈ£ÇÑ ÆÐÅÏ `%s'" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"»ç¿ë¹ý: %s [¿É¼Ç]...\n" +"\n" + +# +#: lib/argp-help.c:1682 +#, fuzzy, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é `%s --help' ÇϽʽÿÀ.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, fuzzy, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: lib/getopt.c:588 lib/getopt.c:593 +#, fuzzy, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, fuzzy, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, fuzzy, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, fuzzy, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +#, fuzzy +msgid "memory exhausted" +msgstr "¸Þ¸ð¸®°¡ ¹Ù´Ú³²" + +# +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "ÇöÀç µð·ºÅ丮¸¦ ¾Ë ¼ö ¾ø½À´Ï´Ù" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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¸¦ ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ" + +# +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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 "¿ø°Ý ¼ÐÀ» ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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" +"·Î ¹ö±×¸¦ º¸°íÇØ ÁֽʽÿÀ.\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: " + +# +#: src/buffer.c:340 src/buffer.c:354 +#, fuzzy +msgid "Total bytes read" +msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: " + +# +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "ÃÑ ¾²¿©Áø ¹ÙÀÌÆ®: " + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "record_size·Î ºÎÀûÀýÇÑ °ª" + +# +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "¾ÆÄ«À̺ê À̸§ÀÌ ÁÖ¾îÁöÁö ¾Ê¾Ò½À´Ï´Ù" + +# +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Ç¥ÁØÀÔ/Ãâ·Â ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +# +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù" + +# +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Å×ÀÌÇÁÀÇ ½ÃÀÛ ºÎºÐ¿¡¼­ Áö±Ý Á¾·áÇÔ" + +# +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "¿À·ù°¡ ³Ê¹« ¸¹¾Æ¼­ Á¾·áÇÕ´Ï´Ù" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "" +msgstr[1] "" + +#: src/buffer.c:698 +#, fuzzy, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "·¹ÄÚµå Å©±â = %d ºí·°" +msgstr[1] "·¹ÄÚµå Å©±â = %d ºí·°" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "" + +# +#: src/buffer.c:909 +#, fuzzy, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "º¼·ý #%d(%s¸¦ À§ÇÑ)¸¦ ÁغñÇÏ°í ¸®ÅÏÀ» Ä¡¼¼¿ä: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "»ç¿ëÀÚÀÇ ÀÀ´äÀÌ ÇÊ¿äÇÑ °÷¿¡ EOF°¡ ÀÖÀ½" + +# +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "°æ°í: ¾ÆÄ«À̺갡 ºÒ¿ÏÀüÇÕ´Ï´Ù" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +# +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "»õ º¼·ýÀÌ ¾Æ´Ô; Á¾·á.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "" + +# +#: src/buffer.c:1199 +#, fuzzy, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s´Â ÀÌ º¼·ý¿¡ ¿¬¼ÓµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù" + +# +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s´Â ÀÌ º¼·ý¿¡ ¿¬¼ÓµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù" + +# +#: src/buffer.c:1217 +#, fuzzy, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s´Â À߸øµÈ Å©±âÀÔ´Ï´Ù (%ld != %ld + %ld)" + +# +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "ÀÌ º¼·ýÀº ¼ø¼­¸¦ ¹þ¾î³µ½À´Ï´Ù" + +#: src/buffer.c:1273 +#, fuzzy, c-format +msgid "Archive not labeled to match %s" +msgstr "`%s'¿Í ÀÏÄ¡Çϵµ·Ï ¶óº§ÀÌ ºÙÁö ¾ÊÀº ¾ÆÄ«À̺ê" + +#: src/buffer.c:1276 +#, fuzzy, c-format +msgid "Volume %s does not match %s" +msgstr "º¼·ý `%s'°¡ `%s'¿Í ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "" + +# +#: src/create.c:624 src/create.c:687 +#, fuzzy, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "" + +# +#: src/create.c:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½" + +# +#: src/create.c:1076 +#, 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:1177 +#, fuzzy, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: ´Ù¸¥ ÆÄÀϽýºÅÛ »ó¿¡ ÀÖÀ½; ´ýÇÁµÇÁö ¾ÊÀ½" + +# +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +#, fuzzy +msgid "contents not dumped" +msgstr " (ÄÚ¾î Ãâ·ÂµÊ)" + +# +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: ¾Ë ¼ö ¾ø´Â ÆÄÀÏ Å¸ÀÔ; ÆÄÀÏÀÌ ¹«½ÃµÊ" + +# +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " %s·Î ¸µÅ©\n" + +# +#: src/create.c:1535 +#, fuzzy, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: º¯°æµÇÁö ¾Ê¾Ò½À´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½" + +# +#: src/create.c:1543 +#, fuzzy, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s´Â ¾ÆÄ«À̺êÀÔ´Ï´Ù; ´ýÇÁµÇÁö ¾ÊÀ½" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s µð·ºÅ丮´Â À̸§ÀÌ ¹Ù²î¾ú½À´Ï´Ù" + +# +#: src/incremen.c:400 +#, fuzzy, c-format +msgid "%s: Directory has been renamed" +msgstr "%s µð·ºÅ丮´Â À̸§ÀÌ ¹Ù²î¾ú½À´Ï´Ù" + +# +#: src/incremen.c:441 +#, fuzzy, c-format +msgid "%s: Directory is new" +msgstr "%s´Â »õ µð·ºÅ丮ÀÔ´Ï´Ù" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¸ðµå°¡ ÁÖ¾îÁü" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +# +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "%s¿¡¼­ Àб⠿À·ù" + +# +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ ¿¹±âÄ¡ ¾ÊÀº EOF" + +# +#: src/incremen.c:1006 src/incremen.c:1046 +#, fuzzy +msgid "Unexpected field value in snapshot file" +msgstr "¾ÆÄ«À̺ê ÆÄÀÏ¿¡ ¿¹±âÄ¡ ¾ÊÀº EOF" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +# +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "" + +# +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s¸¦ Áö¿ò\n" + +# +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "`-%s'°ú `-%s' ¿É¼ÇÀº ¸ðµÎ Ç¥ÁØ ÀÔ·ÂÀÌ ÇÊ¿äÇÕ´Ï´Ù" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +# +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "¾ÆÄ«À̺꿡 ¿¹±âÄ¡ ¾ÊÀº EOF" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +# +#: src/tar.c:431 +#, fuzzy +msgid "remove files after adding them to the archive" +msgstr "¾ÆÄ«À̺꿡 ÀÖ´Â À̸§µé¿¡¼­ µå¶óÀ̺ê ÁöÁ¤¹®À» Á¦°ÅÇÔ" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +# +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +# +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Ç¥ÁØÀԷ¿¡ ´ëÇÑ ¾ÆÄ«À̺ê" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Çò°¥¸®´Â ¾ÐÃà ¿É¼Ç" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "¾ÐÃà ÇÁ·Î±×·¥¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +# +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "%s·Î µð·ºÅ丮¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +# +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Àý´ë ¸µÅ©µé¿¡¼­ ¾Õ¿¡ ºÙÀº `/'¸¦ Á¦°ÅÇÔ" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "º¼·ý `%s'°¡ `%s'¿Í ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +# +#: src/tar.c:730 +#, fuzzy +msgid "ask for confirmation for every action" +msgstr "»ç¿ëÀÚÀÇ È®ÀÎÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "`-Acdtrux' ¿É¼Ç Áß Çϳª ÀÌ»óÀ» ÁöÁ¤ÇÏ¸é ¾È µË´Ï´Ù" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Çò°¥¸®´Â ¾ÐÃà ¿É¼Ç" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¸ðµå°¡ ÁÖ¾îÁü" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "" + +#: src/tar.c:1760 +#, fuzzy +msgid "Invalid owner" +msgstr "¿É¼Ç¿¡ ºÎÀûÀýÇÑ ¼ÒÀ¯ÀÚ°¡ ÁÖ¾îÁü" + +#: src/tar.c:1794 +#, fuzzy +msgid "Invalid record size" +msgstr "record_size·Î ºÎÀûÀýÇÑ °ª" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "·¹ÄÚµå Å©±â´Â %dÀÇ ¹è¼ö°¡ µÇ¾î¾ß ÇÕ´Ï´Ù." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "`-[0-7][lmh]' ¿É¼ÇÀº ÀÌ tar¿¡¼± Áö¿øµÇÁö ¾Ê½À´Ï´Ù" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "¿À·¡µÈ ¿É¼Ç `%c'´Â Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "´ÙÁß ¾ÆÄ«À̺ê ÆÄÀÏÀº `-M' ¿É¼ÇÀÌ ÇÊ¿äÇÕ´Ï´Ù" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù" + +# +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °ËÁõÇÒ ¼ö ¾ø½À´Ï´Ù" + +# +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "¾ÐÃàµÈ ´ÙÁß-º¼·ý ¾ÆÄ«À̺긦 »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù" + +# +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "¾ÐÃàµÈ ¾ÆÄ«À̺긦 °»½ÅÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "`-Aru' ¿É¼ÇÀº `-f -'°ú µ¿½Ã¿¡ ¾µ ¼ö ¾ø½À´Ï´Ù" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "`-Acdtrux' ¿É¼Çµé Áß Çϳª¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "°Ë»çÁöÁ¡ %d¸¦ ÀÐÀ½" + +#: tests/genfile.c:111 +#, fuzzy +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "GNU tar ½ÃÇè µµ±¸¿ë µ¥ÀÌÅÍ ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù.\n" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "Çò°¥¸®´Â ¾ÐÃà ¿É¼Ç" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, fuzzy +msgid "Update the access and modification times of FILE" +msgstr "%s: Á¢±Ù ½Ã°¢°ú ¼öÁ¤ ½Ã°¢À» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "ºÎÀûÀýÇÑ ³¯Â¥ Çü½Ä `%s'" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +# +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "%s¸¦ ¿­ ¼ö ¾ø½À´Ï´Ù" + +# +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s¸¦ ½ÇÇàÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "¾Ë ¼ö ¾ø´Â ÆÐÅÏ `%s'" + +# +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s¸¦ statÇÒ ¼ö ¾ø½À´Ï´Ù" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "" + +#: tests/genfile.c:866 +#, 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 "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: %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 .\n" +#~ msgstr "" +#~ "\n" +#~ "Fran,cois Pinard °¡ ¸¸µé¾ú½À´Ï´Ù.\n" diff --git a/po/ky.gmo b/po/ky.gmo new file mode 100644 index 0000000..8405ae3 Binary files /dev/null and b/po/ky.gmo differ diff --git a/po/ky.po b/po/ky.po new file mode 100644 index 0000000..863412f --- /dev/null +++ b/po/ky.po @@ -0,0 +1,2611 @@ +# Translation of tar-1.18 messages to Kirghiz/Kyrgyz +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# Azilet Beishenaliev , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.18\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2007-09-01 01:06+0100\n" +"Last-Translator: Azilet Beishenaliev \n" +"Language-Team: Kirghiz \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" +"X-Poedit-SourceCharset: utf-8\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "%2$s үчүн %1$s аргументи жарабайт" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "%2$s үчүн %1$s аргументи так эмес" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Жарактуу аргументтер мындай:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: ARGP_HELP_FMT параметринин мааниси болуш керек" + +# положительный кыргызча кандайле? +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT параметринин мааниси оң болуш керек" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: ARGP_HELP_FMT параметри белгисиз" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "ARGP_HELP_FMT параметри бузук: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Толук жазылган опцияларда колдонулган аргументтер сөзсүз түрдө же тилекке " +"жараша жазылса, кыска жазылган опциялар менен да сөзсүз түрдө же тилекке " +"жараша жазылат." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "Колдонулушу:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " же: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [ОПЦИЯ...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "Толук маалымат үчүн `%s --help' же `%s --usage' деп жазгыла.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Каталарды бул жерге билдиргиле %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Белгисиз система катасы" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "Бул жардам тизмесин көрсөтөт" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "Колдонуу жөнүндө кыска маалымат көрсөтөт" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "АТЫ" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "Программага ат кой" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "СЕК" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "СЕК секунда күтүңүз (алдынала - 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "программанын версиясын көрсөтөт" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(ПРОГРАММАДА КАТА) Версиясы белгисиз!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Аргументтердин саны көп\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(ПРОГРАММАДА КАТА) Опция билиниш керек болчу!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' опциясы так эмес\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' опциясы менен аргумент колдонулбайт\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: `%c%s' опциясы менен аргумент колдонулбайт\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: `%s' опциясы менен аргумент болуш керек\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: бул опция түшүнүксүз `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: бул опция түшүнүксүз `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: мындай опция колдонулбайт -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: жараксыз опция -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: бул опциянын аргументи болуш керек -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' опциясы так эмес\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' опциясы менен аргумент колдонулбайт\n" + +# Памятты эмне дейбиз яя? ;) +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "Память жетпей калды" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Учурдагы папка алмаштырылбайтат" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Мүчө аттарынын башындагы `%s' алынып салды" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Түз шилтемелер көрсөтүп турган файлдардын башындагы `%s' алынып салды" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Бош болгон мүчө аттын ордуна `.' коюлду" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "„" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "“" + +# Ооба/ооба +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[оО]" + +# жок/Жок +#: lib/rpmatch.c:72 +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 "Алыстагы команда процессору иштетилген жок" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Жазылган жалпы байт" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Алынган жалпы байт" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Өчүрүлгөн жалпы байт: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(канал)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "record_size мааниси жарабайт" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Архивдин аты берилген жок" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Архивдин stdin/stdout текшерүүсү болбой жатат" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Архив кысыштырылган абалда. %s опциясын колдонгула" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Кысыштырылган архивдерди жаңырталбай калды" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Лентанын башына келди, иш бүттү" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Өтө көп ката бар, иш бүттү" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "Архивде түз жайлашпаган блок бар (%lu байт)" + +#: src/buffer.c:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "Маалыматтын көлөмү = %lu блок" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "Архивдеги файл өчпөй калды; архив ачылбаса -i деп колдонгула" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek маалыматтын чегинде токтогон жок" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: жараксыз том номери бар" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Томдун номери батпай калды" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "%2$s үчүн %1$d-томду даярдап Enter'ди басыңыз: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Колдонуучудан жооп күтүбатканда файлдын соңу келип калды" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ЭСКЕРТҮҮ: Архив толук эмес" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Команда строкасын ач\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Бул тизмени жаз\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Жаңы том жок; иш бүттү.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Файлдын аты берилген жок. Кайра жазып көргүлө.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Туура эмес ввод. Жардам үчүн ? жазгыла.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "%s командасы аткарылбай калды" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s бул томдо уланса керек: башкы-маалыматта аты кыскартылыптыр" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s мунун бул томдо уландысы жок" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s көлөмү туура эмес (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Бул том иретте эмес" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Архивдин тамгасы %s менен келишпей жатат" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "%s тому %s менен келишпей жатат" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "%s болгон жерде нөлдүк блок бар" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: мунун ичинде %s деген кэш-папка белгиси бар; %s" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "%s мааниси %s диапазонунун тышында %s..%s; ордуна %s коюлат" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "%s мааниси %s диапазонунун тышында %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Терс сегиздик системасында башкы маалыматтар даярдалууда" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: файлдын аты өтө узун (эң көп %d болот); кошулбайт" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s: файлдын аты өтө узун (бөлүнбөйт); кошулбайт" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: шилтеменин аты өтө узун; кошулбайт" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: файл башка файл-системасында; кошулбайт" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "астындагылар кошулган жок" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Файлдын түрү белгисиз; файл каралбайт" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "%s жака шилтемелер жок.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: файл алмашкан жок; кошулбайт" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: файл архив экен; кошулбайт" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Файл окулганча өчүрүлүп кетти" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "папка кошулган жок" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: файлды окуу учурунда файл алмашты" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: сокет каралбайт" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Папканын эски аты %s эле" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Папка алмаштырылды" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Папка жаңы" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Жараксыз убакыт тамгасы" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Алмашуу убагы туура эмес (секундалары)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Алмашуу убагы туура эмес (нано-секундалары)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Аспаптын номери жараксыз " + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Inode номери жараксыз" + +# фиелд, снэпшот дегендер кандай болот? +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Снэпшот файлды окубатканда ото узун поле чыкты" + +# snapshot? +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Снэпшот файлды окубатканда ката болду" + +# snapshot? +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Снэпшот файлда күтүлбөгөн жерде файлдын соңу (EOF) бар" + +# фиелд кандай болот? snapshot? +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Снэпшот файлда күтүлбөгөн поле(фиелд) бар" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Записьтерди бөлүүчү символ жок" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Файлдын форматы туура эмес" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Форматтын бул версиясы иштетиле албайт: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Кошулуучу папка бузук: '%c' күтүлгөн бирок %#3o келди" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Кошулуучу папка бузук: 'X' копиялары бар" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Кошулуучу папка бузук: 'R' менен берилген ат бош" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Кошулуучу папка бузук: 'T'дан мурун 'R' жок" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Кошулуучу папка бузук: 'T' менен берилген ат бош" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "Кошулуучу папка бузук: '%c' күтүлгөн бирок датанын соңу келди" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Кошулуучу папка бузук: 'X' эч колдонулган жок" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "%s шаблонун колдонуп убактылуу жаңы папка ачылган жок" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Папка өчүрүлгөн жок: stat иштебей койду" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: бул папка башка аспапта жайгашкан: өчүрүлбөйт" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s өчүрүлүп жатат\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "`-%s' жана `-%s' опцияларына стандарт кирүү(input) керек" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Архивдин форматы жарабайт" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Бул форматтагы архив үчүн жарабаган GNU өзгөчөлүктөрү суралууда" + +#: src/tar.c:241 +#, 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:334 +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" + +#: src/tar.c:343 +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" +" none, off резерв копиялар эч качан сакталбайт\n" +" t, numbered резерв копиялар номердүү болуп сакталат\n" +" nil, existing номердүү резерв копиялар бар болсо номердүү, болбосо " +"жөнөкөй вариант\n" +" never, simple ар дайым жөнөкөй резерв копиялар сакталат\n" + +#: src/tar.c:369 +msgid "Main operation mode:" +msgstr "Негизги иштөө абалы:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "архивдин ичиндеги файлдарды тизмелейт" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "архивден файлдарды чыгарат" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "жаңы архив жаратат" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "архив менен файл система айырмаларын табат" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "файлдарды архивдин аягына кошот" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "архивдин ичиндегилерден жаңы болгон файлдарды гана кошот" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "tar файлын архивге кошот" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "архивден өчүрөт (магниттик ленталарда жарабайт!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "архивдик томдун атын текшерет анан бүтүрөт" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Иштөөнүн модификаторлору:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "кеңири жайлашкан файлдарды эфектүү түрдө колго ал" + +# major, minor +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "БАШКЫ[.КИЙИНКИ]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" +"кеңири жайлаштыруу форматынын версиясын тандайт (--sparce опциясы кошулган " +"болот)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "эски GNU форматындагы резервдөө методун колго ал" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "ФАЙЛ" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "жаңы GNU форматындагы резервдөө методун колго ал" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "окулбаган файлдар келгенде нөл болбогон статус менен ишти бүтүрбө" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "N" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "Архивдин ичиндегилерди издесе болот" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "үстүнө көчүрүү контролу:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "архивди сактагандан кийин текшерүүгө аракет кылат" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "файлдарды архивге кошулгандан кийин өчүрөт" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "файлдарды чыгаруу учурунда мурун бар болгон файлдардын ордуна көчүрбө" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "мурун бар болгон файл архивдеги копиясындан жаңы болсо аны алмаштырба" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "чыгаруу учурунда мурун бар болгон файлдардын ордуна көчүрөт" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "бар болгон файлдын ордуна көчүрүүдөн мурун ал файлды өчүрөт" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "папканы чыгарардан мурун баардык иерархияларды өчүрөт" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "мурун бар болгон папкалардын мета-касиеттерин корго" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"чыгаруу учурунда бар болгон папкалардын мета-даталардын үстүнө жазылат " +"(алдынала тандалат)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Чыгаруу() жолун танда:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "файлдарды стандарт чыгарууга (output) жөнөт" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" +"архивден чыккан файлдарды канал(pipe) жолу менен башка программага жөнөтөт" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "туулган процесстердин бүтүрүү кодторуна караба" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "туулган процесстердин нөл болбогон бүтүрүү кодторун ката деп ишке ал" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Файлдын өзгөчөлүктөрүн колго алууда:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "кошулган файлдардын ээсин АТЫ деп кой" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "кошулган файлдардын группасын АТЫ деп кой" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "ДАТА-ЖЕ-ФАЙЛ" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "кошулган файлдардын алмашуу убактысын ДАТА-ЖЕ-ФАЙЛ дан ал" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "УКУК" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "кошулган файлдардын укук абалын УКУК деп кой" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "МЕТОД" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "файлдын алмаштыруу убактын чыгарбайт" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "ээсин ошол бойдон калтырып файлдарды чыгарууга аракет кылат" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "файлдарды өзүңдүкү катары чыгарат" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "ээси/группа аттарын ардайым номерлер менен көрсөтөт" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"файлдын уруксат маалыматын да чыгар (суперколдонуучуга алдынала тандалат)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"архивден уруксат маалыматын чыгарыбатканда колдонуучунун umask'ын колдон " +"(жөн колдонуучуларга алдынала тандлат)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "чыгатурган файлдарды архивдегидей кылып сортто" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "-p жана -s менен бирдей" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"чыгарылган папкалардын колдонуу убакыттарын жана уруксаттарын чыгаруу иши " +"бүткөндөн кийин коёт" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "--delay-directory-restore опциясынын эффектин токтотот" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Аспапты тандоо жана ага өтүү:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "АРХИВ" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "АРХИВ деген архивдик файлды же аспапты колдонот" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "архивдик файлда эки точка болушуна карабастан ал локалдуу" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "rmt'нин ордуна КОМАНДА колдонулат" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "rsh'тын ордуна КОМАНДА колдонулат" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "драйв жана анын тыгыздыгын белгиле" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "көп томдуу архивди жарат/тизмеле/чыгар" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "N x 1024 байт жазгандан кийин лентаны алмаштыр" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "ар лентанын аягында скриптти иштет (-M опциясы колдонулат)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "ФАЙЛ файлынын ичиндеги том номерин колдон/жаңырт" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Аспаптын блоктолушу:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "БЛОК" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "ар маалыматка БЛОК x 512 байт түшөт" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "Ар маалыматка N байт түшөт, 512 көбөйтүндүсү" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "архивдеги нөлдүү блокторду өтүп кетет (EOF жөнүндө)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "окубатканда кайрадан блокторго бөлүп чык (4.2BSD каналдары үчүн)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Архивдин форматын тандоо:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "ФОРМАТ" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "тандалган форматта архив жаратат" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "ФОРМАТ булардан бирөө болот:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "эски V7 tar форматы" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "tar <= 1.12 версиясында болгондой GNU форматы" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x форматы" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) форматы" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) форматы" + +# pax деген gid,atime сияктуу нерселер +#: src/tar.c:577 +msgid "same as pax" +msgstr "pax менен бирдей" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "--format=v7 менен бирдей" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "--format=posix менен бирдей" + +# keyword эмне болот? +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "ачкыч-сөз[[:]=мааниси][,ачкыч-сөз[[:]=мааниси]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "контролдоо үчүн pax ачкыч сөздөрү" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "ТЕКСТ" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" +"том аты ТЕКСТ болгон архив жарат; тизмелөө/чыгаруу учурунда, ТЕКСТ дегенди " +"том атынын глоб шаблону катары колдон" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Бирбирине келишпеген кысыштыруу опциялары берилди" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "архивди bzip2 менен ишке ал" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "архивди gzip менен ишке ал" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "архивди compress менен ишке ал" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "архивди gzip менен ишке ал" + +#: src/tar.c:606 +msgid "PROG" +msgstr "ПРОГ" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "ПРОГ менен ишке ал (-d опциясы болушу керек)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Локалдуу файлдарды тандоо:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "ФАЙЛды архивге кош (файлдын аты тире менен баштаган учурда пайдалуу)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "ПАПКА" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "ПАПКА папкасына өт" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "чыгарылатурган же жаңы ачылатурган файлдарды АТЫ деген файлдан кара" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T опциясы нөл менен бүткөн аттарды окуйт, -C опциясы өчүрүлөт" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"-T менен алынган файлдардын аттарындагы ковычкалар өчүрүлөт (алдынала " +"тандалат)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "-T менен алынган файлдардын аттарындагы ковычкалар калаберет" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "ШАБЛОН" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "ШАБЛОН менен уйкаш файлдар ишке алынбайт" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "ФАЙЛда тизмеленген шаблондор менен уйкаш файлдар ишке алынбайт" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"CACHEDIR.TAG файлы болгон папкалардын астындагылары тэг файлдан тышкарысы " +"кошулбайт" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG файлы болгон папкалардын астындагыларынын баары кошулбайт" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG файлы болгон папкалар кошулбайт" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"ФАЙЛ файлы болгон папкалардын астындагылары ФАЙЛ файлындан тышкарысы " +"кошулбайт" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "ФАЙЛ файлы болгон папкалардын астындагыларынын баары кошулбайт" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "ФАЙЛ файлы болгон папкалар кошулбайт" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "папкалардын тереңине кирип кетүүнү токтот" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "архивди жасабатканда локалдуу файл системасында кал" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "папкалардын тереңине кирет (алдынала тандалган)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "файл аттарынын башындагы '/'терди өчүрбө" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" +"символикалык шилтемелерге барат; алар көрсөткөн файлдарды архивге кошот" + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"символикалык шилтемелерге барат; алар көрсөткөн файлдарды архивге кошот" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "МҮЧӨНҮН-АТЫ" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "архивдеги МҮЧӨНҮН-АТЫ мүчөсүнөн башта" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "ДАТА-ЖЕ-ФАЙЛ'дан жаңы болгон файлдарды гана сакта" + +#: src/tar.c:664 +msgid "DATE" +msgstr "ДАТА" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "датасы алмашканда гана дата жана убактысын салыштыр" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTROL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "өчүрөрдөн мурун копиясын сактап кал, CONTROL версиясын танда" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "STRING" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"өчүрөрдөн мурун копиясын сактап калат, жалпы колдонулган суфикс кошулат (бул " +"суфикс SIMPLE_BACKUP_SUFFIX жолу менен алмаштырылбаган болсо '~' болот)" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Файлдын атынын алмашуулары:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "чыгаруу учурунда файл аттарынын башындагы N компонентти алып салат" + +# выражение кыргызча кандай? СҮЙЛӨМ башка жерде да бар +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "СҮЙЛӨМ" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "файлдардын аттарын алмаштыруу үчүн sed replace EXPRESSION колдонгула" + +# inclusion, exclusion - Kyrgyz equiv? +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "Файлдын атына уйкаштыруу опциялары (бардык шаблондорго тиешелүү):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "тамгалардын чоң-кичинесине каралбайт" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "шаблондор файлдын атынын башталышы менен уйкаштырылат" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" +"шаблондор `/' символунан кийин келген ар жерде уйкашына каралат (алдынала " +"тандалган)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "уйкаштырууда тамгалардын чоң-кичинесине каралат (алдынала тандалган)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "шаблондор колдонулат (иштен алынбаган файлдарга алдынала тандалат)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "кандай жазылса ошондой колдонулат" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "шаблондор `/' символун издебейт" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "шаблондор `/' символун издейт (алдынала тандалган)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Маалыматтандыруу:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "ишке алынган файлдарды кеңири маалыматы менен тизмеле" + +# Ушу 'record' сөзүнө жакшы котормо табалбай койдум +# 'маалымат' деп жазыбаттым эле, бул жерде келишпей калаткен +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "ар N записьтен кийин маалымат берип турат (алдынала 10 болот)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "баардык шилтемелер кошулбай калса билдирүү жазып чыгар" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "СИГНАЛ" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "файлды алмаштыруу датасын UTC түрүндө көрсөт" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "чыккан кеңири маалыматты ФАЙЛ файлына жибер" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "ар билдирүүдө архивдин ичиндеги блок номерин көрсөт" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "ар ишти аткарууга макулдук сурап тур" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "tar'да алдынала коюлган опцияларды көрсөтөт" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" +"тизмелөө же чыгаруу учурунда издөө критериясына жатпаган папкаларды да " +"тизмелейт" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "алмаштыруудан кийин файлдын же архивдин аттарын көрсөтөт" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "СТИЛЬ" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" +"аттарга ковычка кошуу стилин тандаңыз; жарактуу СТИЛЬ түрдөрү төмөндө " +"көрсөтүлөт." + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "STRING ичинде болгон тамгаларга кошумча ковычка кошот" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "STRING ичинде болгон тамгаларга ковычка кошпойт" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Келишүү опциялары:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" +"жаңы архив жасабатканда --old-archive менен бирдей; чыгарыбатканда --no-same-" +"owner менен бирдей" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Башка опциялар:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "зыяндуу көрүнгөн опцияларды колдонууга тыюуу салат" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "`-Acdtrux' опцияларынан бирөөнү гана колдоно аласыңар" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Бирбирине келишпеген кысыштыруу опциялары берилди" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Сигналдын аты белгисиз: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Датанын шаблон файлы табылган жок" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Белгисиз %1$s дата форматынын ордуна %2$s коюлат" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "%s опциясы: `%s' датасын %s деп алды" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: файл тизмеси окулган" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: алынган файлдын атында бош тамгалар бар" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "--quoting-style опциясы үчүн мындай аргументтер бар:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Бул* tar алдынала мындай иштетилет:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Блок көлөмү жараксыз" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "Эскертүү: -I опциясы иштетилбейт; балким -j же -T дегиңиз келди эле?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Лентанын узундугу жараксыз" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Бирден көп ченемдөөчү дата бар" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "кеңири жайлаштыруу форматынын версиясы жарактуу эмес" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "Бул платформада --atime-preserve='system' опциясы иштебейт" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint опциясына жазылган аргумент сан эмес" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Жараксыз группа" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Опцияда жарабаган укук абалы берилди" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Жарабаган номер" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Ээси жарабайт" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Маалымат көлөмү жарабайт" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Маалыматтын көлөмү %d көбөйтүндүсү болушу керек." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Элементтердин саны жарабайт" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "--to-command опциясы бир эле жолу жазылыш керек" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Тыгыздык аргументи туура эмес: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Түшүнүксүз тыгыздык: `%c'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "*Бул* tar `-[0-7][lmh]' опцияларын иштетпейт" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[ФАЙЛ]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Эски болгон `%c' опциясына параметр керек." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "Файл тизмеси болбосо --occurrence дегендин мааниси болбойт" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "Колдонулган иштетүү абалда --occurrence колдонулбайт" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Бир нече архив файлы болсо `-M' опциясы колдонулушу керек" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental менен --newer чогу колдонулбайт" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Көп-томдуу архивдерди текшералбай калды" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Кысыштырылган архивдерди текшералбай калды" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Көп-томдуу кысыштырылган архивдерди колдоналбай калды" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Кысыштырылган архивдер кошулалбайт" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option POSIX архивдеринде гана колдонула алат" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Бош архив жаратуудан уялып баш тартып жатат" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "`-Aru' опциялары `-f -' менен келишпейт" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "`-Acdtrux' опцияларынан бирөөнү тандап колдонуңуз" + +#: src/tar.c:2483 +#, 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 +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 "Кеңейтилген башкы-маалымат бузук: барабар символу жок" + +# 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 "Чыккан ачкыч-сөз/маани экилиги ото узун (ачкыч-сөз=%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: так санда маани бар" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Жараксыз группа" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Окуунун текшерүү жери: %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile, GNU paxutils пакетинин дата файлдарын ишке алат.\n" +"ОПЦИЯЛАР мындай:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Жаңы файл ачуу опциялары:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "КӨЛӨМ" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Көсөтүлгөн КӨЛӨМдө жаңы файл ач" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Стандарт чыгарууга жазбай, АТЫ деген файлга жаз" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Файлдын аттарын ФАЙЛдан ал" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T опциясы бош/нөл (null) менен бүткөн аттарды окуйт" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"Файлды тандалган ШАБЛОН менен толтурат. ШАБЛОН 'default' же 'zeros' болот" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Кеңири жайлашкан файлдын блок көлөмү" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"Файлды кеңири жайлаштыр. Кийинки команда строкаларында файлдын картасы бар." + +#: tests/genfile.c:143 +#, fuzzy +msgid "OFFSET" +msgstr "ОРУН" + +# seek the given offset - orunga jyl +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "данный(data) жазаардан мурун айтылган орунга жыл" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Файлдын статистикасынын опциялары:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" +"Алынган ар бир файл үчүн struct stat курамын көрсөтөт. Алдынала тандалган " +"ФОРМАТ мындай: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Синхрондуу иштетүүнүн опциялары:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Жазылган КОМАНДАны иштет. Бул --checkpoint жана --cut, --append, --touch " +"бирөөсү менен колдонулганда пайдалуу" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "N текшерүү жерине жеткенде буларды (төмөндү карагыла) аткар" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Эмики --touch опциясы үчүн дата жазгыла" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Өтүлгөн текшерүү жердерди жана КОМАНДАнын бүтүрүү статусун көрсөтөт" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Синхрондуу аткаруу иштери. Булар --checkpoint опциясы менен берилгенн " +"текшерүү жерине жеткенде аткарылат." + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"ФАЙЛды --length опциясы менен берилген көлөмгө кыскартат (берилбеген болсо 0 " +"болот)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "ФАЙЛга КӨЛӨМ байт кошот. КӨЛӨМ --length опциясы менен берилет." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "ФАЙЛдын колдонуу жана алмашуу убакыттарын жаңылайт." + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Бул команданы иштеткиле - КОМАНДА" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Жараксыз көлөм: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Сан жарактуу маанилердин тышында: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Көлөмү терс сан: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) аткарылбай калды" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "`%s' жанындагы санды окубатканда ката чыкты" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Датанын форматы түшүнүксүз" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[АРГУМЕНТТЕР...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "`%s' ачылбай жатат" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "издөө болбой калды" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "файлдын атында бош тамга бар" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"кеңири(чоң) файлдарды стандарт чыгарууга жибералбайт, --file опциясын " +"колдонуңуз" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "туура эмес маска (`%s' жанында)" + +# фиелд деген кандай болот? +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Белгисиз поле `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "`%s'ке убакыт аталган жок" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Команда толук аткарылды\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Команда %d статусу менен аткарылбай калды\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Команда %d сигналы менен жабылды\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Команда %d сигналы менен токтотулду\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Команда core dump менен бүттү\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Команда жабылды\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat опциясы менен файл аттары жазылыш керек" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "аргументтердин саны көп" + +#~ msgid "block size" +#~ msgstr "бир блоктун көлөмү" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]N" diff --git a/po/ms.gmo b/po/ms.gmo new file mode 100644 index 0000000..96df7b5 Binary files /dev/null and b/po/ms.gmo differ diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..fc1842e --- /dev/null +++ b/po/ms.po @@ -0,0 +1,2726 @@ +# tar : Perisian membina arkib fail +# Copyright (C) 2002 Free Software Foundation, Inc. +# Hasbullah Bin Pit , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.13.25\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-11-23 02:38+0800\n" +"Last-Translator: Hasbullah Bin Pit \n" +"Language-Team: Malay \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "hujah tidak sah %s bagi %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "hujah kabur %s bagi %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Hujah sah adalah:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Pengunaan : %s [OPSYEN]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Lapor pepijat ke .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Ralat sistem tidak diketahui" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: opsyen `%s' memerlukan hujah\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opsyen `%s' adalah kabur\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opsyen `--%s' tidak mengizinkan hujah\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opsyen `%s' memerlukan hujah\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opsyen tidak dikenali `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opsyen tidak dikenali '%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opsyen salah -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opsyen tidak sah -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opsyen memerlukan hujah -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opsyen `-W %s' adalah kabur\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opsyen `-W %s' tidak mengizinkan hujah\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memori keletihan" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Tak dapat tukar direktori kerja" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Tak dapat simpan direktori kerja" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Membuang awalan `%.*s' drpd nama ahli" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Membuang awalan `%.*s' drpd nama ahli" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Membuang awalan `%.*s' drpd nama ahli" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +# ui/galeon.glade.h:3 +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Ditulis oleh F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Ditulis oleh F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Ditulis oleh F. Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Jumlah byte ditulis: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Jumlah byte ditulis: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(paip)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Nilai tidak sah bagi record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Tiada nama arkib diberi" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Tak dapat menentusahkan arkib stdin/stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Tak dapat mengemaskini arkib termampat" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Pada permulaan pita, keluar sekarang" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Terlalu banyak ralat, keluar" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: mengandungi nombor volum yg tidak sah" + +#: src/buffer.c:894 +#, fuzzy +msgid "Volume number overflow" +msgstr "Nombor volum melimpah" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "EOF dimana maklumbalas pengguna dijangka" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "AMARAN: Arkib tidak lengkap" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Tiada volum baru; keluar.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "Arahan '%s' gagal" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s tidak bersambung pada volum ini" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s adalah salah saiz (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Volum ini tidak dalam turutan" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arkib tidak dilabelkan supaya memadan %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volum %s tidak sepadan %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "nilai %s diluar julat %s %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Menjana pengepala oktal negatif" + +#: src/create.c:624 src/create.c:687 +#, fuzzy, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: fail tidak berubah; tidak dilonggokkan" + +#: src/create.c:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: fail tidak berubah; tidak dilonggokkan" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: fail adalah pada sistemfail lain; tidak dilonggokkan" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Jenis fail tak dikenali; fail diabaikan" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "Pautan ke %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: fail tidak berubah; tidak dilonggokkan" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: fail adalah arkib; tidak dilonggokkan" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fail dibuang sebelum kami membacanya" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: fail berubah bila kami membacanya" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: soket diabaikan" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Direktori telah ditukarnama" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Direktori telah ditukarnama" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Direktori adalah baru" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Setem masa tidak sah" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Mod tidak sah diberi pada opsyen" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Nombor peranti tidak sah" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Nombot inod tidak sah" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "EOF tanpa diduga pada arkib" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Tak dapat memperuntukkan memori bagi faktor pemblokan %d" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Memadam %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Opsyen `-%s' dan `-%s' kedua-duanya memerlukan input piawai" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Kumpulan tidak sah" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "EOF tanpa diduga pada arkib" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Ralat ketika menulis ke output piawai" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Tak dapat menentusah arkib multi-volume" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "opsyen format arkib konflik" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opsyen mampatan konflik" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: fail adalah arkib; tidak dilonggokkan" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: fail adalah arkib; tidak dilonggokkan" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: fail adalah arkib; tidak dilonggokkan" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Tak dapat tukar direktori kerja" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Membuang awalan `%.*s' drpd nama ahli" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Volum %s tidak sepadan %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Anda tak boleh nyatakan lebih drpd satu opsyen `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Opsyen mampatan konflik" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr "jenis fail tak diketahui %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Fail tarikh tidak dijumpai" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Mengganti %s bagi format tarikh tak diketahui %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: fail adalah arkib; tidak dilonggokkan" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Faktor pemblokan tidak sah" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "panjang pita tidak sah" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Kumpulan tidak sah" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Mod tidak sah diberi pada opsyen" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Nombot inod tidak sah" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Pemilik tidak sah" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Saiz rekod tidak sah" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Saiz rekod mesti dalam gandaan %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "panjang pita tidak sah" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "OPsyen lama `%c' memerlukan hujah." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Fail akrib beraneka memerlukan opsyen `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Tak boleh gabung --listed-incremental dengan --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Tak dapat menentusah arkib multi-volume" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Tak dapat menentusahkan arkib termampat" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Tak dapat menggunakan arkib multi-volume termampat" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Tak dapat mengemaskini arkib termampat" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Secara dayus enggan mencipta arkib kosong" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opsyen `-Aru' tak serasi dengan `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Anda mesti nyatakan satu drpd opsyen `-Acdtrux'" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Kumpulan tidak sah" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Membaca titiksemak %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Opsyen mampatan konflik" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Ralat ketika menulis ke output piawai" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Setem masa tidak sah" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Nombor inod diluar julat" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Ralat sistem tidak diketahui" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Tak dapat tutup" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "jenis fail tak diketahui %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Tak dapat rayau ke %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Anak mati dengan isyarat %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "Nama fail modul" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "saiz blok" + +#~ 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" diff --git a/po/nb.gmo b/po/nb.gmo new file mode 100644 index 0000000..fc9ab2c Binary files /dev/null and b/po/nb.gmo differ diff --git a/po/nb.po b/po/nb.po new file mode 100644 index 0000000..b20c991 --- /dev/null +++ b/po/nb.po @@ -0,0 +1,3174 @@ +# Norwegian messages for GNU tar. (bokmål dialect) +# Copyright (C) 1996 Free Software Foundation, Inc. +# Karl Anders Øygard , 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU tar 1.12\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 1997-06-05 19:39 MET DST\n" +"Last-Translator: Espen Skjelnes Johnsen \n" +"Language-Team: Norwegian-bokmål \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/argmatch.c:133 +#, fuzzy, c-format +msgid "invalid argument %s for %s" +msgstr "Ugyldig datoformat «%s»" + +#: lib/argmatch.c:134 +#, fuzzy, c-format +msgid "ambiguous argument %s for %s" +msgstr "Tvetydig mønster «%s»" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Bruk: %s [FLAGG]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Unkjent systemfeil" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, fuzzy, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "Gammelt flagg «%c» behøver et argument." + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, fuzzy, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "Gammelt flagg «%c» behøver et argument." + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, fuzzy, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "Gammelt flagg «%c» behøver et argument." + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, fuzzy, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "Gammelt flagg «%c» behøver et argument." + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +#, fuzzy +msgid "memory exhausted" +msgstr "Minne oppbrukt" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Kunne ikke finne navnet på aktiv filkatalog" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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 "Kan ikke eksekvere %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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Tar bort ledende «/» fra absolutte linker" + +# +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Tar bort ledende «/» fra absolutte linker" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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\"" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Totalt antall bytes skrevet: " + +# +#: src/buffer.c:340 src/buffer.c:354 +#, fuzzy +msgid "Total bytes read" +msgstr "Totalt antall bytes skrevet: " + +# +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Totalt antall bytes skrevet: " + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Ugyldig verdi for record_size" + +# +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arkivnavn er ikke oppgitt" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Kan ikke verifisere stdin/stdout-arkiv" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +# +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Kan ikke oppdatere komprimerte arkiver" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "På begynnelsen av båndet, avslutter nå" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "For mange feil, avslutter" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "" +msgstr[1] "" + +#: src/buffer.c:698 +#, 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:771 +#, 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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "EOF der svar fra bruker var forventet" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ADVARSEL: Arkivet er ufullstendig" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Ikke nytt volum; avslutter.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s fortsetter ikke i dette volumet" + +#: src/buffer.c:1217 +#, fuzzy, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s har feil størrelse (%ld != %ld + %ld)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Dette volumet kommer ute av rekkefølge" + +#: src/buffer.c:1273 +#, fuzzy, c-format +msgid "Archive not labeled to match %s" +msgstr "Arkivet er ikke navngitt for å passe med «%s»" + +#: src/buffer.c:1276 +#, fuzzy, c-format +msgid "Volume %s does not match %s" +msgstr "Volumet «%s» stemmer ikke overens med «%s»" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "" + +#: src/create.c:624 src/create.c:687 +#, fuzzy, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: er uendret; ikke lagret" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "" + +#: src/create.c:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: er uendret; ikke lagret" + +#: src/create.c:1076 +#, 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:1177 +#, fuzzy, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: På et annet filesystem. Ikke lagret" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +#, fuzzy +msgid "contents not dumped" +msgstr " (minnet lagret)" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Ukjent filtype; filen ble ignorert" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " link til %s\n" + +#: src/create.c:1535 +#, fuzzy, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: er uendret; ikke lagret" + +#: src/create.c:1543 +#, fuzzy, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s er arkivet; ikke lagret" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "Filkatalogen %s har endret navn" + +#: src/incremen.c:400 +#, fuzzy, c-format +msgid "%s: Directory has been renamed" +msgstr "Filkatalogen %s har endret navn" + +#: src/incremen.c:441 +#, fuzzy, c-format +msgid "%s: Directory is new" +msgstr "Filkatalogen %s er ny" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Ugyldig modus gitt i flagg" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "Lesefeil på %s" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Uventet filslutt i arkivfilen" + +#: src/incremen.c:1006 src/incremen.c:1046 +#, fuzzy +msgid "Unexpected field value in snapshot file" +msgstr "Uventet filslutt i arkivfilen" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Kan ikke gå til filkatalogen %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Sletter %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Flaggene «-%s» and «-%s» vil begge ta standard inn" + +#: src/tar.c:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "Ugyldig datoformat «%s»" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU-funksjoner forsøkt på inkompatibelt arkiv-format" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Uventet filslutt i arkivet" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +#, fuzzy +msgid "remove files after adding them to the archive" +msgstr "Tar bort enhetsnavn fra navn i arkivet" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Kan ikke verifisere arkiv som går over flere volum" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Arkivér til stdin" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Konflikt i kompresjonsflagg" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "Kan ikke skrive til komprimeringsprogrammet" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Kan ikke gå til filkatalogen %s" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +# +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Tar bort ledende «/» fra absolutte linker" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Volumet «%s» stemmer ikke overens med «%s»" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +#, fuzzy +msgid "ask for confirmation for every action" +msgstr "Kan ikke lese bekreftelse fra brukeren" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Du kan ikke angi mer enn ett av «-Acdtrux»-flaggene" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Konflikt i kompresjonsflagg" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr "Ukjent mønster «%s»" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mer enn én grense-dato" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Ugyldig modus gitt i flagg" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "" + +#: src/tar.c:1760 +#, fuzzy +msgid "Invalid owner" +msgstr "Ugyldig eier gitt i flagg" + +#: src/tar.c:1794 +#, fuzzy +msgid "Invalid record size" +msgstr "Ugyldig verdi for record_size" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Blokkstørrelse må være delbart på %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Ukjent mønster «%s»" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Gammelt flagg «%c» behøver et argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Ved flere arkivfiler behøves «-M»-flagget" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Kan ikke verifisere arkiv som går over flere volum" + +# +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Kan ikke verifisere komprimerte arkiver" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Kan ikke bruke komprimerte arkiv som går over flere volum" + +# +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Kan ikke oppdatere komprimerte arkiver" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "For feig til å lage et tomt arkiv" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Flaggene «-Aru» er inkompatible med «-f -»" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Du må angi ett av «-Acdtrux»-flaggene" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Leser kontrollpunkt %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Konflikt i kompresjonsflagg" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, fuzzy +msgid "Update the access and modification times of FILE" +msgstr "%s: Kunne ikke endre aksess- og modifiseringstider" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Ugyldig datoformat «%s»" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Unkjent systemfeil" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "Kan ikke åpne %s" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Kan ikke eksekvere %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "Ukjent mønster «%s»" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "Kan ikke gjøre «stat» på %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Ødelagte filnavn--\n" + +#: tests/genfile.c:866 +#, 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 "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 "Cannot stat %s" +#~ msgstr "Kan ikke utføre «stat» på filen %s" + +#~ 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 .\n" +#~ msgstr "" +#~ "\n" +#~ "Skrevet av François Pinard \n" diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000..bd943ab Binary files /dev/null and b/po/nl.gmo differ diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..4150275 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2620 @@ +# Translation of tar-1.19.90 to Dutch. +# Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the tar package. +# +# Elros Cyriatan , 2004. +# Benno Schulenberg , 2005, 2006, 2007, 2008. +msgid "" +msgstr "" +"Project-Id-Version: tar-1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-09 22:27+0100\n" +"Last-Translator: Benno Schulenberg \n" +"Language-Team: Dutch \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ongeldig argument %s van %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument %s van %s is niet eenduidig" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Geldige argumenten zijn:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "ARGP_HELP_FMT: waarde voor '%s' is kleiner of gelijk aan %s" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: Parameter in ARGP_HELP_FMT vereist een waarde" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: Parameter in ARGP_HELP_FMT moet positief zijn" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Onbekende parameter in ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Rommel in ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Gebruik: " + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " of: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPTIE...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "Typ '%s --help' of '%s --usage' voor meer informatie.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"Rapporteer gebreken in het programma aan %s;\n" +"meld fouten in de vertaling aan .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Onbekende systeemfout" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "deze hulptekst tonen" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "een kort gebruiksbericht tonen" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NAAM" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "de programmanaam instellen" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SECONDEN" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "dit aantal seconden pauzeren (standaard 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "programmaversie tonen" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "**Interne programmafout**: geen versie bekend!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Te veel argumenten\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "**Interne programmafout**: optie had herkend moeten worden!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "schrijffout" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: optie '%s' is niet eenduidig\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: optie '--%s' staat geen argument toe\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: optie '%s' vereist een argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: onbekende optie '--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: onbekende optie '%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: optie vereist een argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: optie '-W %s' is niet eenduidig\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: optie '-W %s' staat geen argument toe\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "onvoldoende geheugen beschikbaar" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "kan de huidige werkmap niet vastleggen" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "kan niet terugkeren naar de initiële werkmap" + +#. 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 eigenaar niet wijzigen naar UID %lu, GID %lu" + +#: lib/paxerror.c:127 +#, c-format +msgid "%s: Cannot hard link to %s" +msgstr "Kan geen harde koppeling maken van %s 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 "Kan geen symbolische koppeling maken van %s 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Leidende '%s' wordt uit lidnamen weggelaten" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Leidende '%s' wordt uit doelen van harde koppelingen weggelaten" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Lege lidnaam wordt vervangen door '.'" + +#: lib/paxnames.c:170 +msgid "Substituting `.' for empty hard link target" +msgstr "Lege doelnaam van harde koppeling wordt vervangen door '.'" + +#. 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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "‘" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "’" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[jJ]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Dit is vrije software: u mag het vrijelijk wijzigen en verder verspreiden.\n" +"De precieze licentie is GPLv3+: GNU GPL versie 3 of later.\n" +"Zie http://gnu.org/licenses/gpl.html voor de volledige tekst.\n" +"Er is GEEN GARANTIE, voor zover de wet dit toestaat.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Geschreven door %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Geschreven door %s en %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Geschreven door %s, %s en %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s\n" +"en %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s en %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s, %s en %s.\n" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s, %s, %s en %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s, %s, %s, %s\n" +"en %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s en %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Geschreven door %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s en anderen.\n" + +#: 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 "Typ '%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 gebreken in het programma aan <%s>;\n" +"meld fouten in de vertaling aan .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Totaal aantal geschreven bytes" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Totaal aantal gelezen bytes" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Totaal aantal verwijderde bytes: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pijp)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Ongeldige waarde voor recordgrootte" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Geen archiefnaam opgegeven" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Kan archieven op standaardinvoer of -uitvoer niet verifiëren" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Archief is gecomprimeerd. Gebruik optie '%s'." + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Kan ingepakte archieven niet bijwerken" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Aan het begin van de band -- tar sluit nu af." + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Te veel fouten -- tar sluit nu af." + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek() is niet gestopt op een recordgrens" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: bevat een ongeldig deelnummer" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Deelnummer-overloop" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "een lege tekst, terwijl gebruikersinvoer werd verwacht" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "WAARSCHUWING: Archief is onvolledig" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! een subshell starten\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? dit lijstje tonen\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Geen nieuw deel -- tar sluit af.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Geen bestandsnaam opgegeven. Probeer het nog eens.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Ongeldige invoer. Typ ? voor hulp.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Opdracht %s is mislukt" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s gaat niet verder in dit deel" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s heeft een verkeerde grootte (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Dit deel valt buiten de reeks" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Archief is niet gemerkt als overeenkomend met %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Deel %s komt niet overeen met %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Een los blok met nullen op %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: map bevat cache-markering %s; %s" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "waarde %s valt buiten bereik voor %s (%s..%s)" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Er worden negatieve octale koppen gemaakt" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: koppelingsnaam is te lang; niet gearchiveerd" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "inhoud niet gearchiveerd" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Onbekende bestandssoort; bestand genegeerd" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Ontbrekende koppelingen naar %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: bestand is ongewijzigd; niet gearchiveerd" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: bestand is het archief zelf; niet gearchiveerd" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Bestand werd verwijderd voordat het gelezen kon worden" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "map niet gearchiveerd" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: bestand is gewijzigd tijdens het lezen" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket genegeerd" + +#: src/create.c:1744 +#, 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 tijdens aanmaken 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Map is hernoemd van %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Map is hernoemd" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Map is nieuw" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Ongeldig tijdsstempel" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Ongeldige wijzigingstijd (seconden)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Ongeldige wijzigingstijd (nanoseconden)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Ongeldig apparaatnummer" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Ongeldig inode-nummer" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Veld is te lang, tijdens lezen van snapshot-bestand" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Leesfout tijdens lezen van snapshot-bestand" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Onverwacht einde-van-bestand in snapshot-bestand" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Onverwachte veldwaarde in snapshot-bestand" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Ontbrekende record-afsluiting" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Onjuiste incrementele bestandsindeling" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" +"Niet-ondersteunde versie (%) van incrementele bestandsindeling" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Onjuiste archiveringsmap: '%c' werd verwacht maar %#3o gevonden" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Onjuiste archiveringsmap: 'X' staat er dubbel" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Onjuiste archiveringsmap: lege naam in 'R'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Onjuiste archiveringsmap: 'T' werd niet voorafgegaan door 'R'" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Onjuiste archiveringsmap: lege naam in 'T'" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Onjuiste archiveringsmap: 'X' is nergens gebruikt" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Kan met sjabloon %s geen tijdelijke map aanmaken" + +#: src/incremen.c:1543 +#, 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:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Verwijderen van %s...\n" + +#: src/incremen.c:1569 +#, 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: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 "dochterproces" + +#: 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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Opties '-%s' en '-%s' willen beide standaardinvoer gebruiken" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Ongeldige archiefindeling" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU-functies gevraagd bij een incompatibele archiefindeling" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Hoofdbewerkingen:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "de inhoud van een archief opsommen" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "bestanden uit een archief uitpakken" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "een nieuw archief aanmaken" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "verschillen tussen archief en bestandssyteem vinden" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "bestanden aan het eind van een archief toevoegen" + +#: src/tar.c:384 +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:386 +msgid "append tar files to an archive" +msgstr "tar-bestanden aan een archief toevoegen" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "uit het archief verwijderen (niet gebruiken bij magneetbanden!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "label van archiefdeel controleren en stoppen" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Werkingsaanpassers:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "luchtige bestanden efficiënt verwerken" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "HOOFD[.SUB]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "versie van te gebruiken luchtige indeling (impliceert '--sparse')" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "oude GNU-indeling van incrementele reservekopie verwerken" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "BESTAND" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "nieuwe GNU-indeling van incrementele reservekopie verwerken" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "niet afsluiten met een foutcode bij onleesbare bestanden" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "AANTAL" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "archief is doorzoekbaar" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Overschrijvingsopties:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "het archief na het schrijven proberen te verifiëren" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "bestanden na hun toevoeging aan het archief verwijderen" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "bij het uitpakken bestaande bestanden niet vervangen" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "bestaande bestanden bij het uitpakken overschrijven" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "elk bestand verwijderen alvorens eroverheen uit te pakken" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "bestaande mappen leegmaken alvorens eroverheen uit te pakken" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "metagegevens van bestaande mappen behouden" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"de metagegevens van bestaande mappen bij het uitpakken overschrijven " +"(standaard)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Selecteren van uitvoerkanaal:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "bestanden uitpakken naar standaarduitvoer" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "OPDRACHT" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "uitgepakte bestanden via pijp naar gegeven programma sluizen" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "afsluitwaardes van dochterprocessen negeren" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" +"afsluitwaardes van dochterprocessen die niet nul zijn als fout behandelen" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Behandeling van bestandskenmerken:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "toegevoegde bestanden krijgen NAAM als eigenaar" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "toegevoegde bestanden krijgen NAAM als groep" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATUM-OF-BESTAND" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "WIJZIGINGEN" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "toegevoegde bestanden krijgen (symbolische) WIJZIGINGEN in hun modus" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "MANIER" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "bestandswijzigingstijden niet uitpakken" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "bestanden proberen uit te pakken met gelijkblijvende eigenaar" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "bestanden uitpakken als uzelf" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "altijd getallen gebruiken voor gebruikers- en groepsnamen" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "bestandspermissies ook uitpakken (standaard voor root)" + +#: src/tar.c:493 +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:495 +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:498 +msgid "same as both -p and -s" +msgstr "hetzelfde als -p en -s samen" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "het effect van de optie --delay-directory-restore ongedaan maken" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Apparaatselectie en -wisseling:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIEF" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "archiefbestand of apparaat ARCHIEF gebruiken" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "deze OPDRACHT gebruiken in plaats van rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "deze OPDRACHT gebruiken in plaats van rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "schijf en dichtheid opgeven" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "meerdelig archief aanmaken/opsommen/uitpakken" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "band wisselen na schrijven van AANTAL x 1024 bytes" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "script uitvoeren aan einde van elke band (impliceert -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "het nummer van het deel in BESTAND gebruiken/bijwerken" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blokverwerking:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKKEN" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOKKEN x 512 bytes per record" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "AANTAL bytes per record (een veelvoud van 512)" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "blokken met nullen in archief negeren (betekenen einde-van-bestand)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "doorgaan met lezen tot blok compleet is (voor 4.2BSD-pijpen)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Archiefindelingskeuze:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "INDELING" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "een archief maken in de gekozen indeling" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "INDELING is een van de volgende:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "oude V7 tar-indeling" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU-indeling van tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU-indeling van tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar-indeling)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax-indeling)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "hetzelfde als pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "hetzelfde als --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "hetzelfde als --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "sleutelwoord[[:]=waarde][,sleutelwoord[[:]=waarde]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "het aangeven van pax-sleutelwoorden" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEKST" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "Compressie-opties:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "compressieprogramma afleiden uit bestandsachtervoegsel" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "het archief door 'bzip2' filteren" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "het archief door 'gzip' filteren" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "het archief door 'compress' filteren" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "het archief door 'lzma' filteren" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROGRAMMA" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "het archief door dit programma filteren (moet -d accepteren)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Lokale bestandskeuze:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "MAP" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "naar MAP gaan" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "namen van in of uit te pakken bestanden uit BESTAND halen" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T leest met NUL afgesloten namen, -C uitzetten" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"aanhalingstekens verwijderen rond bestandsnamen gelezen met -T (standaard)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "aanhalingstekens niet verwijderen rond bestandsnamen gelezen met -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATROON" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "bestanden uitsluiten, gegeven als een PATROON" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "uitsluitingspatronen staan opgesomd in BESTAND" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"inhoud van mappen die CACHEDIR.TAG bevatten uitsluiten, behalve CACHEDIR.TAG " +"zelf" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "alles onder mappen die CACHEDIR.TAG bevatten uitsluiten" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "mappen die CACHEDIR.TAG bevatten uitsluiten" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"inhoud van mappen die BESTAND bevatten uitsluiten, behalve BESTAND zelf" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "alles onder mappen die BESTAND bevatten uitsluiten" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "mappen die BESTAND bevatten uitsluiten" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "systeemmappen van versiebeheer uitsluiten" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "niet automatisch afdalen in mappen" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "in het lokale bestandssysteem blijven bij maken van archief" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "recursief in mappen afdalen (standaard)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "leidende '/' niet uit bestandsnamen verwijderen" + +#: src/tar.c:656 +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:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"harde koppelingen volgen; de bestanden waar ze naar verwijzen archiveren" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "LIDNAAM" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "beginnen bij lid LIDNAAM in het archief" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "alleen bestanden opslaan die nieuwer zijn dan DATUM-OF-BESTAND" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATUM" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "datum en tijd alleen vergelijken wanneer gegevens veranderd zijn" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "MANIER" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "voor verwijdering een reservekopie maken, op de aangegeven MANIER" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "TEKENREEKS" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Bestandsnaam-transformaties:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "dit AANTAL leidende componenten uit bestandsnamen verwijderen" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "EXPRESSIE" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" +"deze vervangings-EXPRESSIE gebruiken om bestandsnamen met 'sed' te " +"transformeren" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "Bestandsnaamselectie-opties (voor zowel in- als uitsluitingspatronen)" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "verschil tussen hoofd- en kleine letters negeren" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "patronen komen overeen met begin van bestandsnaam" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" +"patronen komen overeen met alles na een '/' (is standaard bij uitsluiting)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "hoofdlettergevoelige vergelijking (standaard)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "jokertekens gebruiken (is standaard bij uitsluiting)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "exacte tekenreeksvergelijking" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "jokertekens komen niet overeen met '/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "jokertekens komen overeen met '/' (is standaard bij uitsluiting)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informatieve uitvoer:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "de verwerkte bestanden opsommen" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "voortgangsberichten tonen voor elk AANTALste record (standaard 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "ACTIE" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "bij elk controlepunt deze ACTIE uitvoeren" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "een bericht tonen als niet alle links gearchiveerd werden" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "bestandswijzigingstijden in UTC tonen" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "breedsprakige uitvoer naar BESTAND sturen" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "blokgetal binnen archief tonen bij elk bericht" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "bij elke actie om toestemming vragen" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "standaardinstellingen van tar tonen" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "bestands- of archiefnamen na transformatie tonen" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STIJL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "ook de tekens in TEKENREEKS aanhalen" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "de tekens in TEKENREEKS niet aanhalen" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Compatibiliteitsopties:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Andere opties:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "gebruik van mogelijk gevaarlijke opties of opdrachten uitschakelen" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Slechts één van de opties 'Acdtrux' is mogelijk" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Conflicterende compressie-opties" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Onbekende signaalnaam: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Voorbeeldbestand voor tijdsstempel niet gevonden" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Onbekende datumopmaak %2$s wordt vervangen door %1$s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Optie %s: datum '%s' wordt begrepen als %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: bestandenlijst is al gelezen" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: gelezen bestandsnaam bevat een NUL-teken" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Geldige argumenten van --quoting-style zijn:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Deze* tar gebruikt de volgende standaardwaarden:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Ongeldige blokindeling" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Ongeldige bandlengte" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Meerdere drempeldata" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Ongeldig versienummer voor luchtige indeling" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' is op dit platform niet mogelijk" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "waarde van --checkpoint is geen geheel getal" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Ongeldige groep" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Ongeldige modus gegeven bij optie" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Ongeldig nummer" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Ongeldige eigenaar" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Ongeldige recordgrootte" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Recordgrootte moet een veelvoud zijn van %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Ongeldig aantal elementen" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Slechts één optie --to-command is toegestaan" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Ongeldig dichtheidsargument: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Onbekende dichtheid: '%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[BESTAND]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Oude optie '%c' vereist een argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "'--occurrence' betekent niets zonder een bestandenlijst" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "'--occurrence' kan niet worden gebruikt in de gevraagde werkingsmodus" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Voor meerdere archiefbestanden is de optie '-M' vereist" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Kan '--listed-incremental' niet met '--newer' combineren" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Kan meerdelige archieven niet verifiëren" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Kan ingepakte archieven niet verifiëren" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Kan geen meerdelige ingepakte archieven gebruiken" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Kan ingepakte archieven niet samenvoegen" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "optie '--pax' kan alleen worden gebruikt bij POSIX-archieven" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Een geheel leeg archief wordt niet aangemaakt" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opties '-Aru' gaan niet samen met '-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "U dient een van de opties '-Acdtrux' op te geven" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: ongeldige tijdswaarde" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: onbekende actie voor controlepunt" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "schrijven" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "lezen" + +#. 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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Leescontrolepunt %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Bestandsaanmaak-opties:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "GROOTTE" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "een bestand van de gegeven GROOTTE aanmaken" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "naar het bestand NAAM schrijven i.p.v. naar standaarduitvoer" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "bestandsnamen uit BESTAND lezen" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T leest met NUL afgesloten namen" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "blokgrootte voor luchtig bestand" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "POSITIE" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "naar deze positie springen alvorens met schrijven te beginnen" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Bestandsstatistieken-opties:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Synchrone-uitvoer-opties:" + +#: tests/genfile.c:163 +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:166 +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:169 +msgid "Set date for next --touch option" +msgstr "de datum voor de volgende '--touch'" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "de uitgevoerde controlepunten en de afsluitwaarde van OPDRACHT tonen" + +#: tests/genfile.c:177 +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:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "de toegangs- en wijzigingstijdsstempels van BESTAND bijwerken" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "OPDRACHT uitvoeren" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Ongeldige grootte: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Getal valt buiten toegestaan bereik: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negatieve grootte: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "Kan status van %s niet bepalen" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Fout tijdens getalsontleding, nabij '%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Onbekende datumopmaak" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENTEN]..." + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "Kan '%s' niet openen" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "kan niet springen" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "Bestandsnaam bevat een NUL-teken" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "Onjuist masker (nabij '%s')" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Onbekend veld '%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "Kan tijdsstempel van '%s' niet zetten" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Opdracht is succesvol afgesloten\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Opdracht is mislukt met afsluitwaarde %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Opdracht is afgebroken door signaal %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Opdracht is gestopt door signaal %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Opdracht resulteerde in een core-dump\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Opdracht is afgebroken\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "'--stat' vereist bestandsnamen" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "te veel argumenten" diff --git a/po/pl.gmo b/po/pl.gmo new file mode 100644 index 0000000..637185b Binary files /dev/null and b/po/pl.gmo differ diff --git a/po/pl.po b/po/pl.po new file mode 100644 index 0000000..d653d96 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,2619 @@ +# Polish translation of GNU tar +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the tar package. +# Rafa³ Maszkowski , 1996, 1997, 2000, 2001, 2003, 2004, 2006, 2007, 2008. +# Thanks to Jakub Bogusz for remarks and corrections, 2003, 2004, 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-08 21:30+0200\n" +"Last-Translator: Rafa³ Maszkowski \n" +"Language-Team: Polish \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "b³êdny argument %s opcji %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "niejednoznaczny argument %s opcji %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Prawid³owe argumenty to:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: Parametr ARGP_HELP_FMT musi byæ dodatni" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Nieznany parametr ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "¦mieci w ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Sk³adnia:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " albo: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr "[OPCJE...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Raporty o b³êdach nale¿y wysy³aæ do %s .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Nieznany b³±d systemu" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "wy¶wietlenie tego opisu" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "krótka informacja o opcjach" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NAZWA" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "ustawienie nazwy programu" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEK" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "poczekaj SEK sekund (domy¶lnie 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "informacja o wersji programu" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(B£¡D PROGRAMU) Nieznana wersja!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Za du¿o argumentów\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(B£¡D PROGRAMU) Opcja powinna by³a byæ rozpoznana!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "b³±d zapisu" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcja ~%s' jest niejednoznaczna\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opcja `%s' wymaga argumentu\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: nierozpoznana opcja `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: nierozpoznana opcja `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nielegalna opcja -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: b³êdna opcja -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcja wymaga argumentu -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcja `-W %s' jest niejednoznaczna\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "brak pamiêci" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "nie uda³o siê zapisaæ bie¿acego katalogu" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "nie uda³o siê powróciæ do pocz±tkowego katalogu bie¿±cego" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Usuniêcie pocz±tkowego `%s' z nazw plików" + +#: lib/paxnames.c:156 +#, 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:169 +msgid "Substituting `.' for empty member name" +msgstr "Podstawienie `.' zamiast pustej nazwy" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yYtT]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "(C)" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Licencja GPLv3+: GNU GPL wersja 3 albo pó¼niejsza \n" +"To jest wolne oprogramowanie: mo¿esz je modyfikowaæ i rozpowszechniaæ.\n" +"Autorzy NIE DAJ¡ GWARANCJI w granicach dozwolonych prawem.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Napisany przez %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Napisany przez %s i %s\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Napisany przez %s, %s i %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s i\n" +"%s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s i %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s, %s i %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s, %s, %s i %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s, %s, %s, %s i\n" +"%s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s i %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Napisany przez %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s i innych.\n" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Licza zapisanych bajtów" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Liczba przeczytanych bajtów" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Liczba skasowanych bajtów: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "B³êdna warto¶æ record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Nie podana nazwa archiwum" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Nie mo¿na zweryfikowaæ archiwum z/do stdin/stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Archiwum jest skompresowane. Nale¿y u¿yæ opcji %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Nie mo¿na uaktualniæ archiwum skompresowanego" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Na pocz±tku ta¶my, teraz koñczê" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Za du¿o b³êdów, koñczê" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek nie zatrzyma³ siê na granicy rekordów" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: zawiera b³êdny numer czê¶ci" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Przepe³nienie numeru czê¶ci" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "EOF kiedy by³a oczekiwana odpowied¼ u¿ytkownika" + +#: src/buffer.c:920 src/buffer.c:952 +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:934 +#, 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 nazwy dla nastêpnej (i kolejnych) czê¶ci\n" +" q Zakoñczenie programu tar\n" +" y albo Enter Kontynuacja\n" + +#: src/buffer.c:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Uruchomienie pow³oki\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Wypisanie tej listy\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Brak nowej czê¶ci; zakoñczenie pracy.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Brak nazwy pliku. Spróbuj jeszcze raz.\n" + +#: src/buffer.c:993 +#, 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:1044 +#, c-format +msgid "%s command failed" +msgstr "%s polecenie zwróci³o b³±d" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nie jest kontynuowany w tej czê¶ci" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s to z³y rozmiar (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Ta czê¶æ nie jest kolejn±" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Etykieta archiwum nie pasuje do %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Czê¶æ %s nie pasuje do %s" + +#: src/buffer.c:1372 +#, 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:1329 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" + +#: src/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Samotny blok zerowy przy %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: zawiera znacznik katalogu pamiêci podrêcznej %s; %s" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Tworzenie ujemnych nag³ówków ósemkowych" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: nazwa pliku jest za d³uga (powy¿ej %d); nie zosta³a zapisana" + +#: src/create.c:634 +#, 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 zosta³a zapisana" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: nazwa ³±cza jest za d³uga; nie zosta³a zapisana" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: plik w innym systemie plików; nie zosta³ zapisany" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "zawarto¶æ nie zosta³a zapisana" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Nieznany typ pliku; plik zignorowany" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Brakuj±ce ³±cza do %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: plik jest niezmieniony; nie zosta³ zapisany" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: plik jest w tym archiwum; nie zosta³ zapisany" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Plik usuniêty zanim zosta³ przeczytany" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "katalog nie zosta³ zapisany" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: plik zmieni³ siê w trakcie czytania" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: zignorowane gniazdo z nazw±" + +#: src/create.c:1744 +#, 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" + +#: 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Nazwa katalogu zosta³a zmieniona z %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Nazwa katalogu zosta³a zmieniona" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Katalog jest nowy" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "B³êdny czas pliku" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "B³êdny czas modyfikacji (sekundy)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "B³êdny czas modyfikacji (nanosekundy)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "B³êdny numer urz±dzenia" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "B³êdny numer inodu" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Za d³ugie pole w pliku migawkowym" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "B³±d czytania pliku migawkowego" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Nieoczekiwany EOF w pliku migawkowym" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Nieoczekiwana warto¶æ pola w pliku migawkowym" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Brakuj±ce zakoñczenie rekordu" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Z³y format pliku przyrostowego" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Nie obs³ugiwana wersja formatu przyrostowego: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Z³y format katalogu zrzutów: oczekiwano '%c', znaleziono %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Z³y format katalogu zrzutów: powtórzone 'X'" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Z³y format katalogu zrzutów: pusta nazwa w 'R'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Z³y format katalogu zrzutów: 'T' nie jest poprzedzone przez 'R'" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Z³y format katalogu zrzutów: pusta nazwa w 'T'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "Z³y format katalogu zrzutów: oczekiwano '%c', znaleziono koniec danych" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Z³y format katalogu zrzutów: nigdy nie u¿yte 'X'" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Nie mo¿na utworzyæ katalogu tymczasowego przy u¿yciu wzorca %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Bez skasowania katalogu: nie mo¿na odczytaæ stanu" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: katalog na innym urz±dzeniu: bez skasowania" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Usuniêcie %s\n" + +#: src/incremen.c:1569 +#, 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: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 "W nazwach plików u¿yto znaków dopasowania wzorcó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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: B³êdny format archiwum" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Próba u¿ycia rozszerzeñ GNU z niekompatybilnym formatem archiwum" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" +"Nieznany styl cytowania `%s'. U¿yj `%s --quoting-style=help' ¿eby zobaczyæ " +"listê." + +#: src/tar.c:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Podstawowe tryby dzia³ania:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "wypisanie zawarto¶ci archiwum" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "rozpakowanie plików z archiwum" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "utworzenie nowego archiwum" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "sprawdzenie ró¿nic miêdzy archiwum i plikami na dysku" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "do³±czenie plików na koñcu archiwum" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "do³±czenie tylko plików nowszych ni¿ kopie w archiwum" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "do³±czenie plików tar do archiwum" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "skasowanie plików z archiwum (nie na ta¶mie!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "przetestowanie etykiety archiwum i wyj¶cie" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modyfikatory dzia³ania:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "efektywne przetwarzanie plików rzadkich" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAJOR[.MINOR]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "ustawienie wersji u¿ywanego formatu plików rzadkich (w³±cza --sparse)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "backup przyrostowy w starym formacie GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "PLIK" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "backup przyrostowy w nowym formacie GNU" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "bez zakoñczenia b³êdem je¿eli niedostêpne pliki" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "LICZBA" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "archiwum o swobodnym dostêpie" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Sterowanie zamazywaniem" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "próba weryfikacji archiwum po zapisaniu" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "usuniêcie plików po dodaniu do archiwum" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "bez zamazania istniej±cych plików rozpakowanymi" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "nadpisywanie istniej±cych plików" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "usuniêcie ka¿dego pliku przed zamazaniem go rozpakowanym plikiem" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "opró¿nianie starych katalogów przed rozpakowaniem kopii z archiwum" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "zachowanie metadanych istniej±cych katalogów" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"nadpisywanie metadanych istniej±cych katalogów przy rozpakowywaniu " +"(domyslnie)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Wybór strumienia wyj¶ciowego" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "rozpakowanie plików na standardowe wyj¶cie" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "POLECENIE" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "przekazanie rozpakowywanych plików do innego programu" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "zignorowanie kodów wyj¶cia procesów potomnych" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" +"traktowanie niezerowych kodów wyj¶ciowych procesów potomnych jako b³êdu" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Przetwarzanie atrybutów plików:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "nadanie w³a¶ciciela NAZWA dodanym plikom" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "nadanie grupy NAZWA dodanym plikom" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATA_ALBO_PLIK" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "ustawianie czasu modyfikacji dodanych plików z DATA_ALBO_PLIK" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "ZMIANY" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "ZMIANA uprawnieñ dodanych plików (podanych symbolicznie)" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METODA" + +#: src/tar.c:477 +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 "" +"zachowanie czasów dostêpu archiwizowanych plików przez ich odtworzenie po " +"czytaniu (METODA='replace'; domy¶lnie) albo przez nieustawianie czasu " +"(METODA='system')" + +#: src/tar.c:481 +msgid "don't extract file modified time" +msgstr "bez odtworzenia czasu modyfikacji rozpakowanego pliku" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "staranie siê o odtworzenie w³a¶cicieli plików" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "rozpakowanie plików jako w³asno¶ci rozpakowuj±cego" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "u¿ywanie numerów, nie nazw u¿ytkowników/grup" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"odtworzenie informacji o uprawnieniach plików (domy¶lnie dla superusera)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"u¿ycie umask u¿ytkownika przy odtwarzaniu uprawnieñ z archiwum (domy¶lnie " +"dla zwyk³ych u¿ytkowników)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "pliki do rozpakowania posortowane jak w archiwum" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "to samo co równocze¶nie -p i -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"ustawianie czasów zmian i uprawnieñ odtworzonych katalogów opó¼nione do " +"koñca rozpakowywania" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "wy³±czenie efektu opcji --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Wybór i prze³±czanie urz±dzeñ:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARCHIWUM" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "u¿ycie pliku lub urz±dzenia ARCHIWUM" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "plik archiwum lokalny, nawet je¿eli ma dwukropek" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "u¿yj POLECENIA zamiast /etc/rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "u¿yj POLECENIA zamiast rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "podanie napêdu i gêsto¶ci" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "tworzenie/wypisanie/rozpakowanie archiwum wieloczê¶ciowego" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "zmiana ta¶my po zapisaniu LICZBA x 1024 bajtów" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "uruchomienie skryptu na koñcu ta¶my (w³±cza -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "u¿ycie/uaktualnienie numeru czê¶ci w PLIKU" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Parametry bloków:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKI" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOKI x 512 bajtów na rekord" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "LICZBA bajtów w rekordzie, wielokrotno¶æ 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ignorowanie wyzerowanych bloków w archiwum (oznacza EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "podzielenie na bloki przy odczycie (dla pipe 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Wybór formatu archiwum:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "utworzenie archiwum w danym formacie." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT mo¿e byæ jednym z nastêpuj±cych:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "stary format tara z V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "format GNU dla tara <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "format tara GNU 1.13" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "format POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "format POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "to samo co pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "to samo co --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "to samo co --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "s³owo_kluczowe[[:]=warto¶æ][,s³owo_kluczowe[[:]=warto¶æ]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "ustawianie s³ów kluczowych formatu pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEKST" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "Opcje kompresji" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" +"u¿ycie przyrostka nazwy archiwum dla wyznaczenie programu kompresuj±cego" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtrowanie archiwum przez bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtrowanie archiwum przez gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtrowanie archiwum przez compress" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "filtrowanie archiwum przez lzma" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROGRAM" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtrowanie przez PROGRAM (akceptuj±cy -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Wybór plików lokalnych:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" +"dodanie podanego PLIKU do archiwum (przydatne je¿eli jego nazwa startuje od " +"my¶lnika)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "KATALOG" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "przej¶cie do KATALOGU" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "nazwy plików do rozpakowania lub spakowania z PLIKU" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T czyta nazwy zakoñczone zerem, wy³±cz -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" +"usuniêcie znaków cytowania z nazw plików czytanych poprzez opcjê -T " +"(domy¶lnie)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "bez usuwania znaków cytowania z nazw plików czytanych poprzez opcjê -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "WZORZEC" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "wykluczenie nazw pasuj±cych do WZORCA" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "wykluczenie nazw pasuj±cych do wzorców w PLIKU" + +#: src/tar.c:631 +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 CACHEDIR." +"TAG, oprócz samych plików znacznika" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "wykluczenie katalogów zawieraj±cych CACHEDIR.TAG i ich podkatalogów" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "wykluczenie katalogów zawieraj±cych CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "wykluczenie katalogów zawieraj±cych PLIK, ale nie samego PLIKU" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "wykluczenie katalogów zawieraj±cych PLIK i ich podkatalogów" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "wykluczenie katalogów zawieraj±cych PLIK" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "wykluczenie katalogów systemu administrowania wersjami" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "bez automatycznego zag³êbiania siê w katalogi" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "pozostanie w jednym systemie plików" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "zag³êbianie siê w podkatalogi (domy¶lnie)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "bez usuwania pocz±tkowego `/' z nazw plików" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "archiwizacja plików, na które wskazuj± ³±cza symboliczne" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "archiwizacja plików, na które wskazuj± ³±cza zwyk³e" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NAZWA-PLIKU" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "zaczêcie od pliku NAZWA-PLIKU w archiwum" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "zapisanie tylko plików nowszych ni¿ DATA albo data PLIKU" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "porównywanie daty i czasu tylko dla zmienionych danych" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "TRYB" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "kopia zapasowa przed usuniêciem, wybranie TRYBU zarz±dzania wersjami" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "NAPIS" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Zmiany nazwy plików:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" +"uciêcie przed rozpakowaniem LICZBY pocz±tkowych elementów ¶cie¿ki z nazw " +"plików" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "WYRA¯ENIE" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "u¿ycie WYRA¯ENIA zamiany sed-a do przekszta³cenia nazw plików" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Opcje filtracji nazw plików (dotycz± zarówno wzorców wykluczania jak " +"w³±czania):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "traktowanie tak samo ma³ych i wielkich liter" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "nazwy porównywane od pocz±tków nazw plików" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "wzorce odnosz± siê do nazw po ka¿dym / (domy¶lnie)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "odró¿nianie ma³ych i wielkich liter (domy¶lnie)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "u¿ywanie wildcards (domy¶lnie dla wykluczania)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "dos³owne porównywanie napisów" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "wildcards nie s± porównywane z `/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "wildcards s± porównywane z '/' (domy¶lnie dla wykluczania)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informacje:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "wypisywanie szczegó³ów o przetwarzanych plikach" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" +"wypisywanie co ILE rekordów informacji o przetwarzaniu (domyslnie co 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "AKCJA" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "wykonanie AKCJI przy ka¿dym punkcie kontrolnym" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "wypisanie komunikatu je¿eli nie wszytkie ³±cza zosta³y zapisane" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SYGNA£" + +#: src/tar.c:719 +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 "" +"wypisanie ca³kowitej liczby bajtów po przetworzeniu archiwum; z argumentem - " +"wypisanie ca³kowitej liczby bajtów kiedy zostanie wys³any SYGNA£; Dozwolone " +"sygna³y: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 i SIGUSR2; nazwy bez prefiksu SIG " +"s± te¿ akceptowane" + +#: src/tar.c:724 +msgid "print file modification dates in UTC" +msgstr "wypisanie dat modyfikacji plików w UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "zapisanie dok³adnych informacji w PLIKU" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "pokazanie przy ka¿dym komunikacie numeru bloku w archiwum" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "proszenie o potwierdzenie ka¿dego dzia³ania" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "wypisanie domy¶lnych ustawieñ tar-a" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "pokazanie nazw plików albo archiwów po przeszkta³ceniu" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STYL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "dodatkowe ujmowanie w znaki cytowania znaków z £AÑCUCHA" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "wy³±czenie ujmowania w znaki cytowania znaków z £AÑCUCHA" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Opcje kompatybilno¶ci:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Inne opcje:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "wy³±czenie u¿ywania potencjalnie szkodliwych opcji" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Niezgodne opcje kompresji" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Nieznana nazwa sygna³u: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Nie znaleziono pliku z dat±" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Postawienie %s w miejscu nieznanego formatu daty %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Opcja %s: Potraktowanie daty `%s' jako %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: lista plików ju¿ przeczytana" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: przeczytana nazwa pliku zawiera znak NUL" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Argumenty opcji --quoting-style:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Ten* tar ma domy¶lne parametry:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "B³êdny wspó³czynnik ³±czenia w bloki" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "B³êdna d³ugo¶æ ta¶my" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Wiêcej ni¿ jedna data graniczna" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "B³êdna warto¶æ wersji plików rzadkich" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "ten system nie pozwala na u¿ycie --atime-preserve='system'" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "warto¶æ --checkpoint nie jest liczb± ca³kowit±" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: b³êdna grupa" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "B³êdne uprawnienia podane w opcji" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "B³êdny numer" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "B³êdny w³a¶ciciel" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "B³êdna wielko¶æ rekordu" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Rozmiar rekordu musi byæ wielokrotno¶ci± %d" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "B³êdna ilo¶æ elementów" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Wolno u¿yæ tylko jednej opcji polecenia --to-command" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "B³êdna specyfikacja gêsto¶ci: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Nieznana gêsto¶æ: `%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[PLIK]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Stara opcja `%c' wymaga argumentu." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence nie ma znaczenia bez listy plików" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence nie mo¿e byæ u¿yte w tym trybie" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Archiwum sk³adaj±ce siê z wielu plików wymaga opcji `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Nie mo¿na po³±czyæ --listed-incremental z --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Nie mo¿na zweryfikowaæ archiwum wieloczê¶ciowego" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Nie mo¿na zweryfikowaæ archiwum skompresowanego" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Nie mo¿na u¿ywaæ wieloczê¶ciowego archiwum skompresowanego" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Nie mo¿na po³±czyæ skompresowanych archiwów" + +#: src/tar.c:2293 +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:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Tchórzliwie odmawiam utworzenia pustego archiwum" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opcje `-Aru' s± niekompatybilne z `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Musisz podaæ jedn± z opcji `-Acdtrux'" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: b³êdna specyfikacja ograniczenia czasu" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: nieznana akcja przy punkcie kontrolnym" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "zapis" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "odczyt" + +#. 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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Punkt kontrolny czytania %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile s³u¿y do operacji na plikach w ramach zestawu testów GNU paxutils.\n" +"OPCJE:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Opcje tworzenia plików:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "ROZMIAR" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Utworzenie pliku o podanym ROZMIARZE" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Pisanie na pliku NAZWA zamiast na standardowe wyj¶cie" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Czytanie nazw plików z PLIKU" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T czyta nazwy zakoñczone zerem" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Rozmiar bloku pliku rzadkiego" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "POZYCJA" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Ustawienie pozycji zapisu przez zapisem danych" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Opcje statystyki plików" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" +"Wypisanie zawarto¶ci struct stat dla ka¿dego podanego pliku. Domy¶lny " +"FORMAT: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Opcje równoczesnego wykonywania:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Wykonanie podanego POLECENIA. Przydatne z --checkpoint i jednym z --cut, --" +"append albo --touch" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" +"Wykonanie podanej akcji (zobacz ni¿ej) po napotkaniu punktu kontrolnego NUMER" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Ustaw datê nastêpnej opcji --touch" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Wypisanie wykonanych punktów kontrolnych i kodu wyj¶cia POLECENIA" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Akcje równoczesnego wykonania. S± podejmowane po osi±gniêciu punktu " +"kontrolnego o numerze podanym przez opcjê --checkpoint" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Obciêcie PLIKU do rozmiaru podanego przez poprzednia opcjê --length (albo 0, " +"je¿eli nie zosta³ podany)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" +"Dodanie ROZMIAR bajtów do PLIKU. ROZMIAR jak podany przez poprzedni± opcjê --" +"length." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Uaktualnienie czasów dostepu i modyfikacji PLIKU" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Wykonanie POLECENIA" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "B³êdny rozmiar: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Liczba spoza dozwolonego zakresu: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Ujemny rozmiar: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "b³±d stat(%s)" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "B³±d przetwarzania liczby blisko `%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Nieznany format daty" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENTY...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "nie mo¿na otworzyæ `%s'" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "nie mo¿na ustawiæ pozycji" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "nazwa pliku zawiera znak NUL" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "nieprawid³owa maska (ko³o `%s')" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr " Nieznane pole `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "nie mo¿na ustawiæ czasu na `%s'" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Polecenie zakoñczy³o siê poprawnie\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Polecenie zakoñczy³o siê niepoprawnie z kodem %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Polecenie zosta³o zakoñczone sygna³em %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Polecenie zosta³o zatrzymane sygna³em %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Zosta³ zapisany obraz pamiêci (core dump) polecenia\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Polecenie zakoñczone\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat wymaga podania nazwy pliku" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "za du¿o argumentów" diff --git a/po/pt.gmo b/po/pt.gmo new file mode 100644 index 0000000..1d841f1 Binary files /dev/null and b/po/pt.gmo differ diff --git a/po/pt.po b/po/pt.po new file mode 100644 index 0000000..dee574a --- /dev/null +++ b/po/pt.po @@ -0,0 +1,3331 @@ +# Portuguese translation of the "tar" messages +# Copyright (1995) Free Software Foundation, Inc. +# António José Coutinho +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.11.9\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 1996-04-20 21:50\n" +"Last-Translator: António José Coutinho \n" +"Language-Team: Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/argmatch.c:133 +#, fuzzy, c-format +msgid "invalid argument %s for %s" +msgstr "Formato de data inválido \"%s\"" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +#, 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:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Forma de usar: %s [OPÇÃO]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Erro desconhecido, do sistema" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +#, fuzzy +msgid "write error" +msgstr "Escreve-se registo\n" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, fuzzy, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "A antiga opção `%c' exige um argumento." + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, fuzzy, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "A antiga opção `%c' exige um argumento." + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, fuzzy, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "A antiga opção `%c' exige um argumento." + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Não se conseguiu determinar a directoria corrente" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Retira-se \"/\" das ligações (\"links\") absolutas " + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Retira-se \"/\" das ligações (\"links\") absolutas " + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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ã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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Número total de de \"bytes\" escritos: %d\n" + +#: src/buffer.c:340 src/buffer.c:354 +#, fuzzy +msgid "Total bytes read" +msgstr "Número total de de \"bytes\" escritos: %d\n" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Número total de de \"bytes\" escritos: %d\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valor inválido para tamanho de registo (record_size)" + +#: src/buffer.c:459 +#, fuzzy +msgid "No archive name given" +msgstr "Não deram nome de arquivo, que fazer?" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Não se pode de verificar arquivos stdin ou stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +#, fuzzy +msgid "Cannot update compressed archives" +msgstr "Não se pode actualizar o verificar um arquivo comprimido" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "No princípio da fita, pára-se imediatamente" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Erros de mais: termina-se" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "" +msgstr[1] "" + +#: src/buffer.c:698 +#, 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:771 +#, 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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ATENÇÃO: O arquivo está incompleto" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Não há novo volume; termina-se. \n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s não tem continuidade neste volume" + +#: src/buffer.c:1217 +#, 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:1227 +msgid "This volume is out of sequence" +msgstr "Este volume está fora da sequência" + +#: src/buffer.c:1273 +#, 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:1276 +#, fuzzy, c-format +msgid "Volume %s does not match %s" +msgstr "O volume não condiz! %s!=%s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "" + +#: src/create.c:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +#, fuzzy +msgid "contents not dumped" +msgstr " (imagem da memória despejada \"core dumped\")" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tipo de ficheiro desconhecido; ficheiro ignorado" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " ligação para %s\n" + +#: src/create.c:1535 +#, fuzzy, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: não foi modificado; não será arquivado" + +#: src/create.c:1543 +#, fuzzy, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s é o arquivo; não será arquivado" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "Mudou-se o nome do directoria %s" + +#: src/incremen.c:400 +#, fuzzy, c-format +msgid "%s: Directory has been renamed" +msgstr "Mudou-se o nome do directoria %s" + +#: src/incremen.c:441 +#, fuzzy, c-format +msgid "%s: Directory is new" +msgstr "O directoria %s é novo" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +#, fuzzy +msgid "Read error in snapshot file" +msgstr "Erro de leitura sobre %s" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Fim de ficheiro inesperado no ficheiro de arquivo" + +#: src/incremen.c:1006 src/incremen.c:1046 +#, fuzzy +msgid "Unexpected field value in snapshot file" +msgstr "Fim de ficheiro inesperado no ficheiro de arquivo" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Não se pode mudar para a directoria %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Apaga-se %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "Formato de data inválido \"%s\"" + +#: src/tar.c:180 +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:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Fim de ficheiro inesperado no arquivo" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +#, 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:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Não se pode verificar arquivos multi-volume" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Arquivo para stdin" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Há conflitos entre as opções de compressão" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "Não se consegue escrever para o programa de compressão" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Não se pode mudar para a directoria %s" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Retira-se \"/\" das ligações (\"links\") absolutas " + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +#, fuzzy +msgid "ask for confirmation for every action" +msgstr "Não se consegue obter confirmação, do utilizador" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Há conflitos entre as opções de compressão" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr "Opção \"%c\" desconhecida" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "" + +#: src/tar.c:1794 +#, fuzzy +msgid "Invalid record size" +msgstr "Valor inválido para tamanho de registo (record_size)" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "" + +#: src/tar.c:1854 +#, fuzzy +msgid "Only one --to-command option allowed" +msgstr "Só se permite uma opção de compressão" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Opção \"%c\" desconhecida" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "A antiga opção `%c' exige um argumento." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Para usar vários arquivos é necessária a opção \"-M\"" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Não se pode verificar arquivos multi-volume" + +#: src/tar.c:2269 +#, fuzzy +msgid "Cannot verify compressed archives" +msgstr "Não se pode actualizar o verificar um arquivo comprimido" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Não se pode de usar arquivos multi-volume comprimidos" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Não se pode actualizar o verificar um arquivo comprimido" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Recusa-se, covardemente, a criar um arquivo vazio" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "As opções \"-Aru\" são imcompatíveis com \"-f -\"" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Tem que se especificar uma das opções \"-Acdtrux\"" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Leu-se o ponto de verificação %d" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "Há conflitos entre as opções de compressão" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, 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:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Formato de data inválido \"%s\"" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Erro desconhecido, do sistema" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "Não se consegue abrir %s" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Não se consegue executar %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "Opção \"%c\" desconhecida" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "Não se consegue executar \"stat\" para o ficheiro %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Nomes de ficheiros truncados--\n" + +#: tests/genfile.c:866 +#, 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 "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: %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" + +#, 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..12c225f Binary files /dev/null and b/po/pt_BR.gmo differ diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..dee356e --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,3012 @@ +# tar: translation to Brazilian Portuguese (pt_BR) +# Copyright (C) 1995, 2002 Free Software Foundation, Inc. +# Alexandre Folle de Menezes , 2002. +# based on the previous translation to pt_BR (1.13.17) by +# João Luiz Barbosa Silva , 1997. +# based on the translation to Portuguese (pt) by +# António José Coutinho , 1996. +# Marcus Moreira de Souza +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.13.25\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-11-27 20:30-0300\n" +"Last-Translator: Alexandre Folle de Menezes \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumento %s inválido para %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumento %s ambíguo para %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Os argumentos válidos são:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Uso: %s [OPÇÃO]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"Informar erros no programa para .\n" +"Informar erros na tradução para .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Erro de sistema desconhecido" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: a opção `%s' exige um argumento\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opção `%s' é ambígua\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opção `%s' exige um argumento\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opção `--%s' não reconhecida\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opção `%c%s' não reconhecida\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opção ilegal -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opção inválida -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opção exige um argumento -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opção `-W %s' é ambígua\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memória esgotada" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Impossível mudar o diretório de trabalho" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Impossível salvar diretório de trabalho" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Removendo `%.*s' inicial dos nomes dos membros" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Removendo `%.*s' inicial dos nomes dos membros" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Removendo `%.*s' inicial dos nomes dos membros" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Escrito por François Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Escrito por François Pinard" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Escrito por François Pinard" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 .\n" +"Informar erros na tradução para .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Total de bytes escritos: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Total de bytes escritos: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valor inválido para \"record_size\"" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Nome de arquivo-tar não informado" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "" +"Impossível verificar arquivos-tar de entrada/saída padrão (stdin/stdout)" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Impossível atualizar arquivos-tar compactados" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "No princípio da fita, encerrando agora" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Muitos erros, encerrando" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: contém um número de volume inválido" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Sobrecarga de número de volumes" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Prepare o volume #%d para %s e tecle Enter: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Fim-de-arquivo onde era esperado resposta do usuário" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "AVISO: O arquivo-tar está incompleto" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nenhum volume novo; encerrando.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "comando `%s' falhou" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s não continua neste volume" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s é o tamanho errado (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Este volume está fora de sequência" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "O arquivo-tar não rotulado para casar com %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "O volume %s não casa com %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "valor %s fora da faixa %s: %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Gerando cabeçalhos octais negativos" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tipo de arquivo desconhecido; arquivo ignorado" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " link para %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: arquivo sem alterações; não será arquivado" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: arquivo é o arquivo-tar; não será arquivado" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: arquivo removido antes de ser lido" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: arquivo alterado enquanto estava sendo lido" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: \"socket\" ignorado" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Diretório foi renomeado" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Diretório foi renomeado" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: O diretório é novo" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Carimbo de horário inválido" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Modo inválido informado na opção" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Número de dispositivo inválido" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Número de inode inválido" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Final-de-arquivo inesperado no arquivo-tar" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Removendo %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Grupo inválido" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Desejadas características GNU num arquivo-tar com formato incompatível" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Final-de-arquivo inesperado no arquivo-tar" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Erro ao escrever para saída padrão" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Impossível verificar arquivos-tar multi-volume" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Opções de formato do arquivo-tar conflitantes" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opções de compressão conflitantes" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: arquivo é o arquivo-tar; não será arquivado" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: arquivo é o arquivo-tar; não será arquivado" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: arquivo é o arquivo-tar; não será arquivado" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Impossível mudar o diretório de trabalho" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Removendo `%.*s' inicial dos nomes dos membros" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "O volume %s não casa com %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Opções de compressão conflitantes" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " tipo de arquivo \"%s\" desconhecido\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Arquivo de datas não encontrado" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Substituindo %s pelo formato de data desconhecido %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: arquivo é o arquivo-tar; não será arquivado" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Fator de blocagem inválido" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Tamanho da fita inválido" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mais do que uma data limite" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Grupo inválido" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Modo inválido informado na opção" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Número de inode inválido" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Dono inválido" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Tamanho de registro inválido" + +#: src/tar.c:1797 +#, 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:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Tamanho da fita inválido" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "A opção antiga `%c' exige um argumento." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Múltiplos arquivos-tar é exigem a opção \"-M\"" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Impossivel combinar --listed-incremental com --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Impossível verificar arquivos-tar multi-volume" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Impossível verificar arquivos-tar compactados" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Impossível usar arquivos-tar compactados multi-volume" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Impossível atualizar arquivos-tar compactados" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Recusando a criar um arquivo-tar vazio" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "As opções `-Aru' são incompatíveis com `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Deve ser especificada uma das opções \"-Acdtrux\"" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Grupo inválido" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Ponto de verificação de leitura %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Opções de compressão conflitantes" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Erro ao escrever para saída padrão" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Carimbo de horário inválido" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Número do inode fora de faixa" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Erro de sistema desconhecido" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Impossível fechar" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " tipo de arquivo \"%s\" desconhecido\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Impossível saltar para %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "O processo filho morreu com o sinal %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Nomes de arquivos truncados--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "tamanho de bloco" + +#~ 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" 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..9a93bd6 Binary files /dev/null and b/po/ro.gmo differ diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..a16812b --- /dev/null +++ b/po/ro.po @@ -0,0 +1,2735 @@ +# Mesajele în limba românã pentru GNU tar +# Copyright (C) 2005 Free Software Foundation, Inc. +# Laurentiu Buzdugan >, 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.15.1\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2005-07-15 12:00-0500\n" +"Last-Translator: Laurentiu Buzdugan \n" +"Language-Team: Romanian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument invalid %s pentru %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument ambiguu %s pentru %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumente valide sunt:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: parametrul ARGP_HELP_FMT necesitã o valoare" + +#: lib/argp-help.c:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: parametru ARGP_HELP_FMT necunoscut" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Gunoi în ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Folosire:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " sau: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [OPÞIUNE...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Raportaþi bug-uri la %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Eroare sistem necunoscutã" + +#: lib/argp-parse.c:81 src/tar.c:763 +#, fuzzy +msgid "give this help list" +msgstr "Afiºeazã aceastã listã de ajutor" + +#: lib/argp-parse.c:82 src/tar.c:764 +#, fuzzy +msgid "give a short usage message" +msgstr "Afiºeazã un scurt mesaj despre folosire" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NUME" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +#, fuzzy +msgid "print program version" +msgstr "Afiºeazã versiunea programului" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: opþiunea `%s' necesitã un argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opþiunea `%s' este ambiguã\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opþiunea `%s' necesitã un argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opþiunea `--%s' nu este recunoscutã\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opþiunea `%c%s' bu este recunoscutã\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opþiune ilegalã -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opþiune invalidã -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opþiunea necesitã un argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opþiunea `-W %s' este ambiguã\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "memorie epuizatã" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Nu pot schimba directorul în care lucrez" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Nu pot salva directorul în care lucrez" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Eliminãm primul `%s' din numele membrilor" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Eliminãm primul `%s' din destinaþiile hard link" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Înlocuiesc `.' pentru nume de membrii goale" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Numãr total octeþi scriºi: %s (%s, %s/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, 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:433 +msgid "(pipe)" +msgstr "(pipe)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Valoare invalidã pentru record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Nume arhivã nu a fost furnizat" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Nu pot verifica arhive atdin/stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Arhiva este compresatã. Folosiþi opþiunea %s." + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Nu pot actualiza arhive comprimate" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "La începutul benzii, ieºim acum" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Prea multe erori, ieºim" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek nu s-a oprit la limita unei înregistrãri" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: conþine numãr volum invalid" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Depãºire domeniu numãr volum" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Preparã volum #%d pentru %s ºi apasã tasta return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "EOF unde era aºteptat rãspunsul utilizatorului" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "AVERTISMENT: Arhiva este incompletã" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nici un volum nou; terminãm.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "`%s' comanda a eºuat" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nu este continuat pe acest volum" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s este de dimensiune greºitã (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Acest volum este în afara secvenþei" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arhiva nu este etichetatã sã se potriveascã cu %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volumul %s nu se potriveºte cu %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Un bloc zero singuratic la %s" + +#: 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:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "valoarea %s în afara %s intervalului %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Generez antete octale negative" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: numele link-ului este prea lung; nimic generat" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Tip de fiºier necunoscut; fiºier ignorat" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "Link lipsã cãtre '%s'.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: fiºierul este neschimbat; nimic generat" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: fiºierul este în arhivã; nimic generat" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fiºier ºters înainte de a-l putea citi" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s: conþine o etichetã de director cache; nimic generat" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: fiºier schimbat în timp ce îl citeam" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket ignorat" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Directorul a fost redenumit" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Directorul a fost redenumit" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Directorul este nou" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Înregistrare timp invalidã" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Mod invalid furnizat ca opþiune" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Numãr dispozitiv invalid" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Numãr inode invalid" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "EOF neaºteptat în arhivã" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Argument densitate malformat: '%s'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Argument densitate malformat: '%s'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Nu curãþ director: nu pot determina statistici" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: ªtergem %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Format arhivã invalid" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Capabilitãþi GNU cerute pentru un format de arhivã incompatibil" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "Mod de operare principal:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "listeazã conþinutul unei arhive" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "extrage fiºiere dintr-o arhivã" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "creazã o nouã arhivã" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "gãseºte diferenþele dintre arhive ºi sistemul de fiºiere" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "adaugã fiºiere la sfârºitul unei arhive" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "adaugã numai fiºierele mai noi decât copia din arhivã" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "adaugã fiºiere tar la o arhivã" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "ºterge din arhivã (nu pe benzi magnetice!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modificatori operaþie:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "manipuleazã eficient fiºierele rerefiate (sparse)" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "foloseºte vechiul format GNU pentru backup incremental" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FIªIER" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "foloseºte noul format GNU pentru backup incremental" + +#: src/tar.c:407 +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:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NUMÃR" + +#: src/tar.c:409 +#, 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:415 +#, fuzzy +msgid "archive is seekable" +msgstr "Arhiva este cãutabilã" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "încearcã sã verifici arhiva dupã scrierea sa" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "ºterge fiºierele dupã ce acestea sunt adãugate la arhivã" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "nu înlocui fiºierele existente la extragere" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "supra-scrie fiºierele existente la extragere" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "ºterge fiecare fiºier înainte de a extrage peste acesta" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "goleºte ierarhiile înainte de a extrage un director" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "pãstrazã metadata directoarelor existente" + +#: src/tar.c:445 +#, fuzzy +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "supra-scrie fiºierele existente la extragere" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "extrage fiºierele la ieºirea standard" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "COMANDÃ" + +#: src/tar.c:456 +#, fuzzy +msgid "pipe extracted files to another program" +msgstr "extrage fiºierele la ieºirea standard" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Manipulare atribute fiºiere:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "forþeazã NUME ca proprietar pentru fiºierele adãugate" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "forþeazã NUME ca grup pentru fiºierele adãugate" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATA-FIªIERULUI" + +#: src/tar.c:472 +#, 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:473 +msgid "CHANGES" +msgstr "SCHIMBÃRI" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "forþeazã mod (simbolic) SCHIMBÃRI pentru fiºierele adãugate" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "nu extrage timpul de modificare al fiºierului" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "încearcã extragerea fiºierelor cu aceleaºi drepturi (ownership)" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "extrage fiºierele ca dvs. însuºi" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "foloseºte întotdeauna numere pentru numele utilizator/grup" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "sorteazã numele de extras sã se potriveascã cu arhiva" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "la fel ca -p ºi -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Selectare ºi schimbare unitate:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARHIVÃ" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "foloseºte fiºier arhivã sau unitate ARHIVÃ" + +#: src/tar.c:513 +#, 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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "foloseºte rmt COMANDà în loc de rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "foloseºte remote COMANDà în loc de rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "specificã unitate ºi densitate" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "creazã/listeazã/extrage arhiva pe volume multiple" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "schimbã banda dupã scriere a NUMÃR x 1024 octeþi" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "ruleazã script la terminarea fiecãrei benzi (implicã -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "foloseºte/actualizeazã numãrul de volum în FIªIER" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blocuri unitate:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOCURI" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOCURI x 512 octeþi pe întregistrare" + +#: src/tar.c:552 +#, fuzzy +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "DIMENSIUNE octeþi pe înregistrare, multiplu de 12" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ignorã blocuri zero-uate în arhivã (înseamnã EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "redimensioneazã bloc în timpul citirii (pentru pipe-uri BSD4.2" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Selecþie format arhivã:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +#, fuzzy +msgid "create archive of the given format" +msgstr "creazã arhiva de formatul dat." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT este unul din urmãtoarele" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "vechiul format tar V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "oldgnu formatul GNU format ca pentru tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "formatul GNU tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "formatul POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "formatul POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +#, fuzzy +msgid "same as pax" +msgstr "ca ºi pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "ca ºi --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "ca ºi --format=posix" + +#: src/tar.c:584 +#, fuzzy +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "cuvânt_cheie[[:]=valoare][,cuvânt_cheie[[:]=valoare], ...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "controleazã cuvintele cheie pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "TEXT" + +#: src/tar.c:587 +#, 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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Opþiunile de compresie sunt în conflict" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtrazã arhiva prin bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtreazã arhiva prin gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtreazã arhiva prin compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "filtreazã arhiva prin gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtreazã prin PROG (trebuie sã accepte -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Selecþie fiºier local:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "DIR" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "schimbã în directorul DIR" + +#: src/tar.c:619 +#, 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:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T citeºte nume terminate cu null, deactiveazã cu -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "PATTERN" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "exclude fiºiere, date ca un PATTERN" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "pattern-urile de excludere sunt listate în FIªIER" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "exclude directoarele ce conþin o etichetã cache" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "exclude directoarele ce conþin o etichetã cache" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "exclude directoarele ce conþin o etichetã cache" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "exclude directoarele ce conþin o etichetã cache" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "exclude directoarele ce conþin o etichetã cache" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "evitã coborârea automatã în directoare" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "stai în sistemul de fiºire local la creare arhivei" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "coboarã recursiv în directoare (implicit)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "nu elimina primul `/' din numele fiºierelor" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NUME-MEMBRU" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "începe la membrul NUME-MEMBRU în arhivã" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "stocheazã numai fiºiere mai noi decât DATA-FIªIERULUI" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATA" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "comparã data ºi timpul numai când a fost schimbatã data" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "CONTROL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "fã backup înainte de ºtergere, alege CONTROL pentru versiuni" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "ªIR" + +#: src/tar.c:669 +#, 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:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +#, 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:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "în excluderi ignorã cazul caracterelor (minuscule/majuscule)" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "pattern-urile de excludere potrivesc începutul numelor de fiºiere" + +#: src/tar.c:691 +#, fuzzy +msgid "patterns match after any `/' (default for exclusion)" +msgstr "pattern-urile de excludere potrivesc dupã orice / (implicit)" + +#: src/tar.c:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "excluderea depinde de caz (minuscule/majuscule) (implicit)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "wildcard-urile în pattern-urile de excludere nu potrivesc '/'" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "wildcard-urile din pattern-urile de excludere potrivesc '/' (implicit)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Ieºire informativã:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "listeazã cu amãnunte fiºierele procesate" + +#: src/tar.c:711 +#, 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:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +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:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "afiºeazã datele de modificare a fiºierelor în UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "trimite ieºire detaliatã în FIªIER" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "aratã numãrul blocului din arhivã pentru fiecare mesaj" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "cere confirmare pentru fiecare acþiune" + +#: src/tar.c:733 +#, fuzzy +msgid "show tar defaults" +msgstr "Aratã valorire implicite folosite de tar" + +#: src/tar.c:735 +#, 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:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Opþiuni compatibilitate:" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "Alte opþiuni:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Opþiunile de compresie sunt în conflict" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " tip fiºier necunoscut %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Fiºier date nu a fost gãsit" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Înlocuim %s pentru format de datã necunoscut %s" + +#: src/tar.c:1022 +#, fuzzy, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Tratez data `%s' ca %s + %ld nanosecundã" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: fiºierul este în arhivã; nimic generat" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Acest* tar foloseºte implicit:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Factor blocuri invalid" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Lungime de bandã invalidã" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mai mult de o singurã datã limitã" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Grup invalid" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Mod invalid furnizat ca opþiune" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Numãr invalid" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Proprietar invalid" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Dimensiune înregistrare invalidã" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Dimensiune înregistrare trebuie sã fie un multiplu de %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Numãr invalid de elemente" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, fuzzy, c-format +msgid "Malformed density argument: %s" +msgstr "Argument densitate malformat: '%s'" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Densitate necunoscutã: '%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FIªIER]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Vechea opþiune `%c' necesitã un argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence n-are sens fãrã o listã de fiºiere" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence nu poate fi folosit în modul de operare cerut" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Fiºiere de arhivã multiple necesitã opþiunea `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Nu puteþi combina --listed-incremental cu --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Nu pot verifica arhive pe volume multiple" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Nu pot verifica arhive comprimate" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Nu pot folosi arhive comprimate pe volume multiple" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Nu pot actualiza arhive comprimate" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option poate fi folosit numai pentru arhive POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Refuz categoric sã creez o arhivã goalã" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Opþiunile `-Aru' sunt incompatibile cu `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Trebuie sã specificaþi una din opþiunile `-Acdtrux'" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Grup invalid" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Citeºte punct de verificare %d" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "Alte opþiuni:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "creazã arhiva de formatul dat." + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "extrage fiºierele la ieºirea standard" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "Am citit %s octeþi de la %s" + +#: tests/genfile.c:134 +#, fuzzy +msgid "-T reads null-terminated names" +msgstr "-T citeºte nume terminate cu null, deactiveazã cu -C" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "încearcã sã verifici arhiva dupã scrierea sa" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +#, fuzzy +msgid "Execute COMMAND" +msgstr "COMANDÃ" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Înregistrare timp invalidã" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Numãr inode în afara intervalului" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Eroare sistem necunoscutã" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s: Nu pot cãuta (seek) cãtre %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " tip fiºier necunoscut %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Nu pot cãuta (seek) cãtre %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Amestecat numele fiºierelor--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "dimensiune bloc" + +#~ 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..d652a8a Binary files /dev/null and b/po/ru.gmo differ diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..349a609 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,2743 @@ +# Translation of tar messages to Russian +# Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the cpio package. +# Const Kaplinsky , 1998, 1999. +# Pavel Maryanov , 2004, 2006, 2008. +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-01-18 01:00+0200\n" +"Last-Translator: Pavel Maryanov \n" +"Language-Team: Russian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "неверный аргумент %s для %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "неоднозначный аргумент %s для %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Допустимые аргументы:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: Для параметра ARGP_HELP_FMT требуется значение" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: Параметра ARGP_HELP_FMT должен быть положительным" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Неизвестный параметр ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Мусор в ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Обязательные или необязательные аргументы для длинный опций также являются " +"обязательными или необязательными для соответствующих коротких опций." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "Использование:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " или: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [ОПЦИЯ...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "" +"Попробуйте `%s --help' или `%s --usage' для получения дополнительной " +"информации.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Отчеты об ошибках отправляйте на %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Неизвестная системная ошибка" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "вывод этой справки" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "вывод короткого сообщения об использовании" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "ИМЯ" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "определяет название программы" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "СЕК" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "ожидание в течение заданных СЕКУНД (по умолчанию 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "вывод версии программы" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(ОШИБКА ПРОГРАММЫ) Неизвестная версия?!" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Слишком много аргументов\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(ОШИБКА ПРОГРАММЫ) Опция должна была быть распознана?!" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: опция `%s' не однозначна\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: опция `--%s' не разрешает использовать аргумент\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: опция `%c%s' не разрешает использовать аргумент\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: для опции `%s' требуется аргумент\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: нераспознанная опция `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: нераспознанная опция `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недопустимая опция -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: неверная опция -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: для опции требуется аргумент -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: опция `-W %s' не однозначна\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: опция `-W %s' не разрешает использовать аргумент\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "память исчерпана" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Невозможно изменить рабочий каталог" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Удаляется начальный `%s' из имен объектов" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Удаляются начальные `%s' из целей жестких ссылок" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "`.' заменяются пустыми именами объектов" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yY]" + +#: lib/rpmatch.c:72 +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 "Невозможно запустить удалённый командный процессор" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Всего записано байт" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Всего прочитано байт" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Всего удалено байт: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(канал)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Неверное значение для record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Не указано имя архива" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Невозможно проверить архив на stdin/stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Архив сжат. Используйте опцию %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Невозможно обновить сжатые архивы" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Начало ленты, завершение работы" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Слишком много ошибок, завершение работы" + +#: src/buffer.c:678 +#, 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:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "Размер записи = %lu блок" +msgstr[1] "Размер записи = %lu блоков" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" +"Невозможно вернуться назад на один архивный файл; он может быть нечитаемым " +"без -i" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek не остановился на границе записи" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: содержит неверный номер тома" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Переполнение номера тома" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Приготовьте том Номер %d для %s и нажмите Enter: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Конец файла вместо ожидаемого ответа пользователя" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ПРЕДУПРЕЖДЕНИЕ: Архив не полный" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Порождение подпроцесса командного процессора\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Вывод этого списка\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Нет нового тома, завершение работы.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Не указано имя имя файла. Попробуйте ещё раз.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Неверные входные данные. Наберите ? для получения справки.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Сбой команды %s" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" +"%s, возможно, продолжается на этом томе - в заголовке находится усечённое имя" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s не продолжается на этом томе" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s является неверным размером (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Этот том нарушает последовательность" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Метка архива не соответствует %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Том %s не соответствует %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Нулевой блок в %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: содержит каталог с кэшем тегов %s; %s" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "значение %s за пределами %s диапазона %s..%s; заменяется на %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "значение %s за пределами %s диапазона %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Создаются отрицательные восьмеричные заголовки" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: имя файла слишком длинное (максисмум %d); не сброшено" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s: имя файла слишком длинное (не может быть разделено); не сброшено" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: имя ссылки слишком длинное; не сброшено" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: файл находится на другой файловой системе; не сброшен" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "содержимое не сброшено" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Неизвестный тип файла; файл проигнорирован" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Отсутствуют ссылки на %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: файл не изменён; не сброшен" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: файл является архивом; не сброшен" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Файла удален до его считывания" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "каталог не сброшен" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: файл изменился во время чтения" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: сокет проигнорирован" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Каталог был переименован из %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Каталог был переименован" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Каталог новый" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Неверная временная метка" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Неверное время изменения (секунды) " + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Неверное время изменения (наносекунды)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Неверный номер устройства" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Неверный номер inode" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Слишком длинное поле при чтении из snapshot-файла" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Ошибка чтения snapshot-файла" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Неожиданный конец файла snapshot-файле" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Неожиданное значения поля в snapshot-файле" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Отсутствует указатель конца записи" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Неверный формат инкрементного файла" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Неподдерживаемая версия инкрементного формата: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Неверно сформирован dump-каталог: ожидался '%c', а найден %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Неверно сформирован dump-каталог: 'X' повторяется" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Неверно сформирован dump-каталог: пустое имя в 'R'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Неверно сформирован dump-каталог: перед 'T' не стоит 'R'" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Неверно сформирован dump-каталог: пустое имя в 'T'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "Неверно сформирован dump-каталог: ожидался '%c', а найден конец данных" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Неверно сформирован dump-каталог: 'X' ни разу не использован" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Невозможно создать временный каталог с помощью шаблона %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Каталог не удалён: невозможно выполнить stat" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: Каталог находится на другом устройстве: не удален" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Удаляется %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Обе опции `-%s' и `-%s' используют стандартный ввод" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Неверный формат архива" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Запрошены расширения GNU для несовместимого формата архива" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Основной режим работы:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "вывод списка содержимого архива" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "извлечение файлов из архива" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "создание нового архива" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "поиск различий между архивом и файловой системой" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "добавление файлов в конец архива" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "добавление в архив только более новых файлов" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "присоедининие tar-файлов к архиву" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "удаление из архива (не на магнитных лентах!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "проверка метки тома архива и выход" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Модификаторы:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "эффективная обработка разрежённых файлов" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "MAJOR[.MINOR]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" +"установить версию используемого формата разрежения (подразумевает --sparse)" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "обработка добавочного резервирования старого формата GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "ФАЙЛ" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "обработка добавочного резервирования нового формата GNU" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "не завершать работу при ненулевом статусе для нечитаемых файлов" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "N" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "доступен поиск по архиву" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Управление перезаписью:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "попытка проверить архив после его записи" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "удаление файлов после их добавления в архив" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "не перезаписывать существующие файлы при извлечении" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" +"не перезаписывать существующие файлы, которые более новые, чем их копии в " +"архиве" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "перезапись существующих файлов при извлечении" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "удаление каждого файла до извлечения поверх него" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "очистка всей иерархии до извлечения каталога" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "сохранение метаданных существующих каталогов" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "перезапись существующих файлов при извлечении (по умолчанию)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Выбор выходного потока:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "извлекать файлы на стандартный вывод" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "перенаправлять извлечённые файлы в другую программу" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "игнорировать коды завершения дочерних процессов" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "считать ненулевые коды завершения дочерних процессов как ошибку" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Обработка атрибутов файлов:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" +"принудительно устанаваливать ИМЯ в качестве владельца для добавленных файлов" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" +"принудительно устанаваливать ИМЯ в качестве группы для добавленных файлов" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "ДАТА-ИЛИ-ФАЙЛ" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "устанаваливать для добавленных файлов mtime из ДАТЫ-ИЛИ-ФАЙЛА" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "РЕЖИМ" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" +"принудительно устанавливать (символьный) РЕЖИМ доступа для добавляемых файлов" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "СПОСОБ" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "не извлекать время изменения файла" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "попытаться извлечь файлы с тем же владельцем" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "извлекать файлы как свои собственные" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "использовать числа вместо имён владельца/группы" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"извлекать информацию о правах доступа к файлу (по умолчанию для " +"суперпользователя)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"применять umask пользователя при извлечении прав доступа из архива (по " +"умолчанию для обычных пользователей)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "сортировать извлекаемые имена в том же порядке, что и в архиве" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "эквивалент -p и -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"не устанавливать время изменения и права доступа извлечённых каталогов до " +"завершения процесса извлечения" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "отменить действие опции --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Выбор и переключение устройств:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "АРХИВ" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "использовать файл или устройство АРХИВ" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "файл архива является локальным, даже если содержит двоеточие" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "использовать указанную КОМАНДУ rmt вместо rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "использовать удалённую КОМАНДУ вместо rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "указать устройство и плотность" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "создание/листинг/извлечение многотомных архивов" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "сменить ленту после записи ЧИСЛО x 1024 байт" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" +"запустить скрипт по окончании каждой ленты (подразумевается использование -М)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "использовать/обновлять номера тома в ФАЙЛЕ" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Разбиение на блоки:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "БЛОКИ" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "число БЛОКОВ x 512 байт на запись" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "ЧИСЛО байт на запись, кратное 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "игнорировать нулевые блоки в архиве (т.е. EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "заново разбивать на блоки при чтении (для каналов 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Формата архива:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "ФОРМАТ" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "создать архив в указанном формате" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "ФОРМАТОМ может быть:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "старый формат tar V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "формат GNU как в tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "формат GNU tar 1.13.х" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "формат POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "формат POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "эквивалент pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "эквивалент --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "эквивалент --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "keyword[[:]=значение][,keyword[[:]=значение]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "управляющие ключевые слова pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "ТЕКСТ" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" +"создать архив с именем тома ТЕКСТ; при листинге/извлечении использовать " +"ТЕКСТ в качестве шаблона подстановки" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Конфликт опций сжатия" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "пропустить архив через bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "пропустить архив через gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "пропустить архив через compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "пропустить архив через gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "ПРОГ" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "пропустить архив через ПРОГ (должна поддерживать -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Выбор локальных файлов:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "добавить указаный ФАЙЛ в архив (полезно, если имя начинается с дефиса)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "КАТАЛОГ" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "перейти в КАТАЛОГ" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "загрузить из ФАЙЛА имена для извлечения или создания" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T читает строки, оканчивающиеся нулём, отключает опцию -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "убрать кавычки с имён файлов, прочитанных с опцией -T (по умолчанию)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "не убирать кавычки с имён файлов, прочитанных с опцией -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "ШАБЛОН" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "исключать файлы, определённые ШАБЛОНОМ" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "исключать шаблоны, перечисленных в ФАЙЛЕ" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"исключать содержимое каталогов с файлом CACHEDIR.TAG за исключением самого " +"файла с тегами" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "исключать всё содержимое каталогов, содержащих файл CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "исключать каталоги, содержащие файл CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "исключать каталоги, содержащие ФАЙЛ, за исключением самого ФАЙЛА" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "исключать всё содержимое каталогов, содержащих ФАЙЛ" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "исключать каталоги с ФАЙЛОМ" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "исключать каталоги CVS" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "отключить автоматический спуск в каталоги" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "оставаться в локальной файловой системе при создании архива" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "рекурсивный спуск по каталогам (по умолчанию)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "не удалять начальные `/' из имен файлов" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" +"следовать по символьным ссылкам и сохранять файлы, на которые они указывают" + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"следовать по символьным ссылкам и сохранять файлы, на которые они указывают" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "ИМЯ-ЧЛЕНА" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "начинать с члена ИМЯ-ЧЛЕНА в архиве" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "сохранять только те файлы, которые новее ДАТЫ-ИЛИ-ФАЙЛА" + +#: src/tar.c:664 +msgid "DATE" +msgstr "ДАТА" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "сравнивать дату и время, только если изменены данные" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "УПРАВЛЕНИЕ" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "делать копию перед удалением, УПРАВЛЕНИЕ выбора версий" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "СТРОКА" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"делать копию перед удалением, переопределяет обычный суффикс ('~', если " +"только он не переопределён переменной окружения SIMPLE_BACKUP_SUFFIX)" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Преобразвание имён файлов:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" +"удалять указанное ЧИСЛО начальных компонентов из имён файлов перед " +"извлечением" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "РАСШИРЕНИЕ" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "использовать замену РАСШИРЕНИЯ sed'ом для преобразования имён файлов" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Параметры шаблонов подстановки для имён файлов (вляют на шаблюны включения и " +"исключения):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "игноририровать регистр" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "шаблоны начала имени файла" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "шаблоны после любого '/' (по умолчанию для исключаемых)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "с учётом регистра (по умолчанию)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "использовать маски (по умолчанию для исключаемых)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "точное соответствие строке" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "маски не соответствуют '/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "маски соответствут '/' (по умолчанию для исключаемых)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Вывод информации:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "подробный листинг обрабатываемых файлов" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" +"вывод сообщений о ходе выполнения через каждые ЧИСЛО записей (по умолчанию " +"10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "вывод сообщений, если сохранены не все ссылки" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "СИГНАЛ" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "вывод даты изменения файла в формате UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "отправить подробный вывод данных в FILE" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "выводить номера блоков архива в каждом сообщении" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "запрашивать подтверждение для каждого действия" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "показать значения tar по умолчанию" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" +"при выводе листинга или извлечении показывать все каталоги, не " +"соответствующем условию поиска" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "показывать имена файлов или архивов после преобразования" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "СТИЛЬ" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "установить стиль цитирования имён. Значения для СТИЛЯ см. ниже" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "дополнительно цитировать символы из СТРОКИ" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "отключить цитирование символов из СТРОКИ" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Опции совместимости:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" +"при создании, эквивалент --old-archive; при извлечении, эквивалент --no-same-" +"owner" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Другие опции:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "отключить использование некоторых потенциально опасных опций" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Указать можно не более одной опции `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Конфликт опций сжатия" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Неизвестное название сигнала: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Файл с образцом даты не найден" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "%s заменяется на неизвестный формат даты %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Опция `%s': дата '%s' рассматривается как %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: список файлов уже прочитан" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: в прочитанном имени файла присутствует пустой символ" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Допустимые агрументы для опций --quoting-style:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Значения по умолчанию *этого* tar:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Неверный размер ёмкости блока" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" +"Предупреждение: опция -I не поддерживается; может имелась в виду -j или -T?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Неверная длина ленты" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Больше одной пороговой даты" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Неверное значение версии разрежения" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' не поддерживается на этой платформе" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "значение --checkpoint не явлется целым числом" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Неверная группа" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "В опции указан неверный режим доступа" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Неверное число" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Неверный владелец" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Неверный размер записи" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Размер записи должен быть кратен %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Неверное число элементов" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Разрешается использовать только одну опцию --to-command" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Неверно сформирован аргумент плотности: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Неизвестная плотность: '%c'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "Опции `-[0-7][lmh]' не поддерживаются *этим* tar'ом" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[ФАЙЛ]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Для старой опции `%c' нужно указать аргумент." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence бесполезна без списка файлов" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence не может быть использована запрошеном режиме работы" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Для нескольких файлов архивов требуется опция `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Нельзя комбинировать --listed-incremental с --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Невозможно проверить многотомные архивы" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Невозможно проверить сжатые архивы" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Невозможно использовать многотомные сжатые архивы" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Невозможно объединить сжатые архивы" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option может быть использована только с архивами POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Робкий отказ от создания пустого архива" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Опции `-Aru' не совместимы с `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Вы должны указать одну из опций `-Acdtrux'" + +#: src/tar.c:2483 +#, 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: нечётное число " +"значений" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Неверная группа" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Контрольная точка чтения %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile используется для работы с файлами данных для пакета тестов paxutils " +"от GNU.\n" +"ОПЦИИ:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Опции создания файла:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "РАЗМЕР" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Создание файла указанного РАЗМЕРА" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Запись в файл с ИМЕНЕМ, а не на стандартный вывод" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Чтение имён файла из ФАЙЛА" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T читает строки, оканчивающиеся нулём" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "Заполнение файла заданным ШАБЛОНОМ. ШАБЛОН - это 'default' или 'zeros'" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Размер блока для разрежённого файла" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"Создание разрежённого файла. Остальная часть команды определяет карту файла." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "СМЕЩЕНИЕ" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Искать до указанного смещения перед записью данных" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Опции статистики по файлам:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" +"Вывод содержимого структуры stat для всех указанных файлов. ФОРМАТ по " +"умолчанию:" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Опции синхронного выполнения:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Выполнение указанной КОМАНДЫ. Полезно вместе с параметром --checkpoint и " +"одним из --cut, --append, --touch" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" +"Выполнение указанного действия (см. ниже) до достижения контрольной точки с " +"заданным НОМЕРОМ" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Указание даты для следующего параметра --touch" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Показать выполненные контрольные точки и статус выхода КОМАНДЫ" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Синхронное выполнение действий. Они выполняются при достижении контрольной " +"точки с номером, определённым опцией --checkpoint." + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Усечь ФАЙЛ до размера, определённого предыдущей опцией --length (или 0, если " +"не указан)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" +"Добавить РАЗМЕР байт к ФАЙЛУ. РАЗМЕР определяется предыдущей опцией --length." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Обновить время последнего доступа и изменения ФАЙЛА." + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Выполнить КОМАНДУ" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Недопустимый размер: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Число за пределами допустимого диапазона: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Отрицательный размер: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "Сбой stat(%s)" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Ошибка разбора числа возле `%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Неизвестный формат даты" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[АРГУМЕНТЫ...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "невозможно открыть `%s'" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "невозможно найти" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "в имени файла присутствует пустой символ" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"невозможно вывести разрежённые файлы на стандартный вывод; используйте опцию " +"--file" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "неверная маска (возле `%s')" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Неизвестное поле `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "невозможно установить время в `%s'" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Команда успешно выполнена\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Сбой команды; состояние: %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Команда завершена по сигналу %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Команда остановлена по сигналу %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Команда сбросила дамп памяти\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Команда завершена\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "для опции --stat нужны имена файлов" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "слишком много аргументов" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]ЧИСЛО" + +#~ msgid "block size" +#~ 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/sk.gmo b/po/sk.gmo new file mode 100644 index 0000000..17d033a Binary files /dev/null and b/po/sk.gmo differ diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..6375446 --- /dev/null +++ b/po/sk.po @@ -0,0 +1,3027 @@ +# Slovak translations for GNU tar +# Copyright (C) 1997 Free Software Foundation, Inc. +# Martin Lacko , 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: tar- \n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2002-02-10 12:00CEST\n" +"Last-Translator: Martin Lacko \n" +"Language-Team: Slovak \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument %s je pre %s neplatný" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument %s nie je pre %s jednoznaèný" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Platné argumenty sú:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +#, fuzzy +msgid " [OPTION...]" +msgstr "" +"\n" +"Pou¾itie: %s [PREPÍNAÈ]...\n" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +" Chyby v programe oznamujte na adresa (iba anglicky),\n" +"pripomienky k pkekladu zasielajte na adresu " +"(slovensky).\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Neznáma systémová chyba" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: prepínaè `%s' vy¾aduje argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: prepínaè %s nie je jednoznaèný\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: prepínaè `%s' vy¾aduje argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neznámy prepínaè `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neznámy prepínaè `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neznámy prepínaè -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neznámy prepínaè -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: prepínaè vy¾aduje argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: prepínaè `-W %s' nie je jednoznaèný\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "Pamä» vyèerpaná" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Pracovný adresár nie je mo¾né zmeni»" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Pracovný adresár nie je mo¾né uchova»" + +#. 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:155 +#, fuzzy, c-format +msgid "Removing leading `%s' from member names" +msgstr "Odstraòujem úvodné `%.*s' z názvov súborov" + +#: lib/paxnames.c:156 +#, fuzzy, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Odstraòujem úvodné `%.*s' z názvov súborov" + +#: lib/paxnames.c:169 +#, fuzzy +msgid "Substituting `.' for empty member name" +msgstr "Odstraòujem úvodné `%.*s' z názvov súborov" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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»" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Written by F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Written by F. Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Written by F. Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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: 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 (iba anglicky),\n" +"pripomienky k pkekladu zasielajte na adresu " +"(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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "Celkom zapísané bajtov: %s (%sB, %sB/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Celkom zapísané bajtov: %s (%sB, %sB/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(rúra)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Chybná hodnota pre veµkos» záznamu" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Meno archívu nebolo zadané" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Stdin/Stdout archív nie je mo¾né otvori»" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Komprimovaný archív nie je mo¾né aktualizova»" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Páska na zaèiatku, konèím" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Príli¹ mnoho chýb, konèím" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: vracia chybné èíslo zväzku" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Èíslo zväzku preteèené" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Namiesto u¾ívateµskej odpovede bol zadaný koniec súboru" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "VAROVANIE: Archiv je nekompletný" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Nie je nový zväzok; konèím.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "'%s' príkaz zlyhal" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s nepokraèuje na tomto zväzku" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s je chybnej då¾ky (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Tento zväzok nie je následníkem predchádzajúceho" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Pre vyhodnotenie vzorky `%s' musí by» archív pomenovaný" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Zväzok %s nezodpovedá vzorke %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "hodnota %s typu %s je mimo rozsah %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Generujem záporné osmièkové hlavièky" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, fuzzy, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: súbor nie je zmenený; neaktualizovaný" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Neznámy typ súboru; súbor ignorovaný" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr " odkaz na %s\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: súbor nie je zmenený; neaktualizovaný" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: súbor je archiv; nearchivovaný" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Súbor zmazaný skôr ako mohl by» èítaný" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: súbor bol poèas èítania zmenený" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: soket ignorovaný" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Adresár bol premenovaný" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Adresár bol premenovaný" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Adresár je nový" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Neplatný èas súboru" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "Zadáné chybné práva" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Neplatné èíslo zariadenia" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Neplatné èíslo i-uzlu" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "Neoèekávaný koniec archívu" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Ma¾em %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, fuzzy, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Chybná skupina" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU roz¹írenia po¾adované na nekompatibilnom formáte archívu" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "Neoèekávaný koniec archívu" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "Chyba pri zápise na ¹tandardný výstup" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "Víczväzkový archív nie je mo¾né otvori»" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +#, fuzzy +msgid "Archive format selection:" +msgstr "Odporujúce si archívne formáty" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Odporujúce si kompresné prepínaèe" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s: súbor je archiv; nearchivovaný" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s: súbor je archiv; nearchivovaný" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s: súbor je archiv; nearchivovaný" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "Pracovný adresár nie je mo¾né zmeni»" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "Odstraòujem úvodné `%.*s' z názvov súborov" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "Zväzok %s nezodpovedá vzorke %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Odporujúce si kompresné prepínaèe" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " neznámy typ súboru %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Dátumový súbor nebol nájdený" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: súbor je archiv; nearchivovaný" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Neplatný poèet bajtov na záznam" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Neplatná då¾ka pásky" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Viac ako jeden poèiatoèný dátum" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Chybná skupina" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Zadáné chybné práva" + +#: src/tar.c:1738 +#, fuzzy +msgid "Invalid number" +msgstr "Neplatné èíslo i-uzlu" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Neplatný vlastník" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Chybná veµkos» záznamu" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Veµkos» záznamu musí by» násobok %d." + +#: src/tar.c:1834 +#, fuzzy +msgid "Invalid number of elements" +msgstr "Neplatná då¾ka pásky" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Prepínaè `%c' vy¾aduje argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +#, fuzzy +msgid "Multiple archive files require `-M' option" +msgstr "Viac archivaèných súborov vy¾aduje prepínaè `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental a --newer nie je mo¾né kombinova»" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Víczväzkový archív nie je mo¾né otvori»" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Komprimovaný archív nie je mo¾né otvori»" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Viaczväzkový komprimovaný archív nie je mo¾né vytvori»" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Komprimovaný archív nie je mo¾né aktualizova»" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Vytvorenie prázdneho archívu odmietnuté." + +#: src/tar.c:2343 +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:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Musíte zada» jeden z prepínaèov `-Acdtrux'" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Chybná skupina" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "Èítanie testovacieho bodu %d" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Odporujúce si kompresné prepínaèe" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "Chyba pri zápise na ¹tandardný výstup" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Neplatný èas súboru" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Èíslo i-uzlu mimo rozsah" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Neznáma systémová chyba" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Nedá sa zatvori»" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " neznámy typ súboru %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s: Nedá sa zmeni» pozícia v súbore na %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Potomok bol ukonèený signálom %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Rozdelené meno súboru--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ msgstr "veµkos» bloku" + +#~ 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" diff --git a/po/sl.gmo b/po/sl.gmo new file mode 100644 index 0000000..b78f86d Binary files /dev/null and b/po/sl.gmo differ diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..44b25cf --- /dev/null +++ b/po/sl.po @@ -0,0 +1,3555 @@ +# -*- mode: po; coding: utf-8; -*- Slovenian message catalog for GNU Tar +# Copyright (C) 1996, 1999, 2000, 2001, 2005, 2006, 2007 Free Software Foundation, Inc. +# Primož Peterlin , 1996, 1999, 2000, 2001, 2005, 2006, 2007. +# +# $Id: tar-1.19.sl.po,v 1.1 2007/10/17 08:26:36 peterlin Exp $ +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2007-10-17 10:26+0200\n" +"Last-Translator: Primož Peterlin \n" +"Language-Team: Slovenian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "neveljaven argument %s za %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "dvoumen argument %s za %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Veljavni argumenti so:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: parameter ARGP_HELP_FMT zahteva podano vrednost" + +#: lib/argp-help.c:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: neznan parameter ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Smetje v ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Uporaba:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " ali: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [IZBIRA...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Poročila o napakah javite na %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Neznana sistemska napaka" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "poda ta seznam pomoči" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "poda kratka navodila za uporabo" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "IME" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "nastavi ime programa" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEK" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "premor SEK sekund (privzeto 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "izpis izdaje programa" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMSKA NAPAKA) Različica ni poznana?!" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Preveč argumentov\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMSKA NAPAKA) Izbira bi morala biti prepoznana?!" + +#: lib/closeout.c:73 +#, fuzzy +msgid "write error" +msgstr "Pisanje zapisa\n" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: izbira »%s« ni enoznačna\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: izbira »--%s« ne dovoljuje argumenta\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: izbira »%s« zahteva argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neprepoznana izbira »--%s«\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neprepoznana izbira »%c%s«\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nedovoljena izbira -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neveljavna izbira -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: izbira zahteva argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: izbira »-W %s« je dvoumna\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: izbira »-W %s« ne dovoljuje argumenta\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "zmanjkalo pomnilnika" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Ni mogoče izvedeti trenutnega imenika" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Delovnega imenika ni mogoče shraniti" + +#. 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 +#, 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Odstranjujemo vodilne »%s« iz imen elementov" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Odstranjujemo vodilne »%s« iz imen trdih povezav" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Nadomeščamo manjkajoča imena elementov s ».«" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "»" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "«" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[dDjJ]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "Avtor François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "Avtor François Pinard." + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Avtor François Pinard." + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Skupno zapisanih bajtov" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Skupno prebranih bajtov" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Skupno izbrisanih bajtov: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(cev)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Neveljavna vrednost za dolžino zapisa (record_size)" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Ime arhiva ni podano" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Arhivov na stdin/stdout ni mogoče preveriti" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Arhiv je stisnjen. Uporabite izbiro %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Stisnjenega arhiva ni mogoče ažurirati" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Na začetku traku, končujem" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Preveč napak, končujem" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek se ni ustavil na meji zapisa" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: vsebuje neveljavno Å¡tevilko dela" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Prekoračitev Å¡tevilke dela" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Pripravite del #%d za %s in pritisnite Return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Znak EOF na mestu, kjer se pričakuje odgovor uporabnika" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "POZOR: Arhiv nepopoln" + +#: src/buffer.c:934 +#, 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] Podamo novo ime datoteke za naslednji del (in vse nadaljnje)\n" +" q Končamo tar\n" +" y, newline Nadaljujemo z delovanjem\n" + +#: src/buffer.c:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Poženemo ukazno podlupino\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Ta seznam uzazov\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Novega dela ni, konec.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Neveljaven vnos. Vtipkajte ? za pomoč.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "ukaz %s neuspeÅ¡en" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s se morda nadaljuje v tem delu: zaglavje vsebuje porezano ime" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s se ne nadaljuje v tem delu" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s je napačne velikosti (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Ta del ne sodi v zaporedje" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arhiv ni označen skladno z %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Del %s ne ustreza %s" + +#: src/buffer.c:1372 +#, 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 zaglavje GNU večdelnega arhiva; " +"porezano" + +#: 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Osamljeni ničelni blok pri %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: vsebuje značko medpomnilniÅ¡kega imenika %s; %s" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "vrednost %s od %s obseg %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Ustvarjanje negativnih osmiÅ¡kih glav" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: ime povezave je predolgo; brez iznosa" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "vsebina ni izneÅ¡ena" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Neznan tip datoteke; datoteka ignorirana" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Manjkajo povezave na %s.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: datoteka je nespremenjena; brez iznosa" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: datoteka je arhiv; brez iznosa" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Datoteka je bila odstranjena, preden smo jo prebrali" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "imenik ni iznaÅ¡en" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: Datoteka je bila spremenjena med branjem" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: vtičnica ignorirana" + +#: src/create.c:1744 +#, 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 +#, c-format +msgid "Cannot rename %s to %s" +msgstr "Preimenovanje %s 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Imenik je bil preimenovan z %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Imenik je bil preimenovan" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Imenik je nov" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Neveljavna oznaka časa" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Neveljaven čas spremembe (sekunde)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Neveljaven čas spremembe (nanosekunde)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Neveljavna Å¡tevilka enote" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Neveljavna Å¡tevilka inoda" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Predolgo polje pri branju trenutnega posnetka" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Napaka pri branju trenutnega posnetka" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Nepričakovan znak za konec datoteke v trenutnem posnetku" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Nepričakovana vrednost polja v trenutnem posnetku" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Manjkajoč zaključek zapisa" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Okvarjen inkrementalni zapis datoteke" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Nepodprta različica inkrementalnega zapisa: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Okvarjen argument gostote: »%s«" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Okvarjen argument gostote: »%s«" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, 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:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Imenika ne čistimo: statistika zanj ni dosegljiva" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: BriÅ¡emo %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Izbiri »-%s« in »-%s« obe zahtevata standardni vhod" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Neveljavna oblika arhiva" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "RazÅ¡iritve GNU izbrane na nezdružljivem formatu arhiva" + +#: src/tar.c:241 +#, 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:334 +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« 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" + +#: src/tar.c:343 +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 "" +"Pripona 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" +" none, off nikoli ne izdeluj varnostnih kopij\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:369 +msgid "Main operation mode:" +msgstr "Glavni načini delovanja:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "izpis vsebine arhiva" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "izvlečenje datoteke iz arhiva" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "ustvarjanje novega arhiva" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "iskanje razlik med arhivom in datotečnim sistemom" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "dodajanje datotek na konec arhiva" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "dodajanje novih datotek, če so novejÅ¡e od že arhiviranih" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "zlivanje arhivov" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "brisanje datotek iz arhiva (ne deluje na traku!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Določila delovanja:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "ekonomično ravnanje z razprÅ¡enimi datotekami" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "stari zapis GNU za inkrementalne arhive" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "DATOTEKA" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "novi zapis GNU za inkrementalne arhive" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "nadaljuj z branjem, tudi če datoteke ni moč prebrati" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "N" + +#: src/tar.c:409 +#, 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:415 +msgid "archive is seekable" +msgstr "po arhivu je mogoče iskati" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Nadzor nad pisanjem prek:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "s poskusom preverjanja zapisanega arhiva" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "pobriÅ¡i datoteke, potem ko so arhivirane" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "pri izvlačenju ne piÅ¡i prek obstoječih datotek" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "pri izvlačenju piÅ¡i prek obstoječih datotek" + +#: src/tar.c:439 +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:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "izprazni hierarhije pred izvlačenjem imenikov" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "ohrani metainformacije o obstoječih imenikih" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "pri izvlačenju piÅ¡i prek metapodatkov obstoječih imenikov (privzeto)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Izbira izhodnega toka:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "datoteke izvleci na standardni izhod" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "UKAZ" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "datoteke napelji na vhod drugega programa" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "prezri izhodne kode hčerinskih procesov" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "obravnavaj neničelne izhodne kode hčerinskih procesov kot napako" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Ravnanje z atributi datotek:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "pri dodajanju datotek spremenimo lastnika v IME" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "pri dodajanju datotek spremenimo skupino v IME" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATUM-ČAS" + +#: src/tar.c:472 +#, fuzzy +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "shrani le datoteke, novejÅ¡e od DATUM-ČAS" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "SPREMEMBE" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "zahtevaj (simbolne) SPREMEMBE zaščite za dodane datoteke" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METODA" + +#: src/tar.c:477 +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 "" +"ohrani čas dostopa na iznesenih datotekah, bodisi z restavriranjem časa po " +"branju (METODA=replace, privzeto) ali tako, da se časa sploh ne nastavi " +"(METODA=system)" + +#: src/tar.c:481 +msgid "don't extract file modified time" +msgstr "brez izvlačenja časa spremembe" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "z ohranitvijo lastniÅ¡tva, če je mogoče" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "pri izvlačenju prepiÅ¡emo lastniÅ¡tvo nase" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "s Å¡tevilčnimi vrednostmi UID/GID namesto imen" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"izvleci podatke o dovoljenjih za dostop do datotek (privzeto za " +"administratorja)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"uporabi uporabnikovo masko umask pri izvlačenju dovoljenj za dostop do " +"datotek (privzeto za uporabnike)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "imena razvrstimo tako, da se ujemajo z arhivom" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "isto kot -p in -s skupaj" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"počakaj do končanega izvlačenja, preden nastavimo čase sprememb in " +"dovoljenja za dostop za izvlečene imenike" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "prekliči učinek izbire --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Izbira enote in preklapljanje:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARHIV" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "uporabi datoteko ali enoto ARHIV" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "arhiv je lokalen kljub dvopičju v imenu datoteke" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "uporabi navedeni UKAZ rmt namesto rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "uporabi nelokalen UKAZ namesto rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "določi enoto in gostoto zapisa" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "ustvari/pregledaj/izvleci arhiva v več delih" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "menjava traku po Å T x 1024 zapisanih bajtih" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "poženi SKRIPT po koncu traku (privzema -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "uporabimo/ažuriramo Å¡tevilo dela v DATOTEKI" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Bločna razdelitev enote:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOKI" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "dolžina zapisa BLOKI × 512 bajtov" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "Å TEVILO bajtov v zapisu (večkratnik 512)" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ne meni se za bloke ničel (EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "razdeli na bloke ob branju (cevovodi 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Izbira oblike arhiva:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "OBLIKA" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "ustvari arhiv v navedeni obliki" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "OBLIKA je nekaj od naÅ¡tetega:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "oblika starega V7 tar" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "stara oblika GNU tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "oblika GNU tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "oblika POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "oblika POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "isto kot pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "isto kot --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "isto kot --format=posix" + +#: src/tar.c:584 +#, fuzzy +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "ključna-beseda[[:]=vrednost][,ključna-beseda[[:]=vrednost],...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "krmilne ključne besede pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "VZOREC" + +#: src/tar.c:587 +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 za ime dela" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "Nasprotujoče si izbire glede stiskanja arhiva" + +#: src/tar.c:594 +#, fuzzy +msgid "use archive suffix to determine the compression program" +msgstr "Pisanje na vhod programa za stiskanje ne gre" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtriraj arhiv skozi bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtriraj arhiv skozi gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtriraj arhiv skozi compress" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "filtriraj arhiv skozi gzip" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROGRAM" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtriraj skozi PROGRAM (sprejemati mora izbiro -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Izbira lokalne datoteke:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "dodaj navedeno DATOTEKO v arhiv (za imena datotek, ki se začnejo z »-«)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "IMENIK" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "pomik v navedeni IMENIK" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "preberi seznam datotek z navedene DATOTEKE" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T prebere z \\000 terminirana imena; onemogoči -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "odstrani narekovaje iz imen datotek, prebranih s -T (privzeto)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "ne odstrani narekovajev iz imen datotek, prebranih s -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "VZOREC" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "brez datotek, ki jih opisuje VZOREC" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "brez datotek, ustrezajočim vzorcem, prebranih z DATOTEKE" + +#: src/tar.c:631 +#, 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:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "brez imenikov, ki vsebujejo značko medpomnilnika" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "brez imenikov, ki vsebujejo značko medpomnilnika" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "brez imenikov, ki vsebujejo značko medpomnilnika" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "brez imenikov, ki vsebujejo značko medpomnilnika" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "brez imenikov, ki vsebujejo značko medpomnilnika" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "podimenikov ne vključujemo avtomatično" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "pri arhiviranju izpusti datoteke na nelokalnih datotečnih sistemih" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "rekurzivno vključi vse podimenike" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "ne odstrani vodilnih »/« iz imen datotek" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "sledi simbolnim povezavam; arhiviraj/iznesi ciljne datoteke" + +#: src/tar.c:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "sledi simbolnim povezavam; arhiviraj/iznesi ciljne datoteke" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "IME" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "začenÅ¡i z navedenim IMENOM v arhivu" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "shrani le datoteke, novejÅ¡e od DATUM-ČAS" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATUM" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "primerjaj datum in uro le, kadar se podatki spremenijo" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "TIP" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" +"varnostna kopija pred brisanjem, z možnostjo izbire TIPA varnostne kopije" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "NIZ" + +#: src/tar.c:669 +#, 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:674 +#, fuzzy +msgid "File name transformations:" +msgstr "Druge izbire:" + +#: src/tar.c:676 +#, fuzzy +msgid "strip NUMBER leading components from file names on extraction" +msgstr "izpusti Å TEVILO vodilnih komponent iz imen datotek" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "IZRAZ" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "izključitveni vzorci ne razlikujejo med malimi in velikimi črkami" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "izključitveni vzorci opisujejo celotno ime datoteke" + +#: src/tar.c:691 +#, fuzzy +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" +"izključitveni vzorci opisujejo ime datoteke od znaka »/« dalje (privzeto)" + +#: src/tar.c:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "" +"izključitveni vzorci razlikujejo med malimi in velikimi črkami (privzeto)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "uporabi nadomestne znake (privzeto za izločanje)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "dobesedno ujemanje nizov" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "izključitveni vzorci ne opisujejo »/«" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "izključitveni vzorci opisujejo tudi »/« (privzeto)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informativni izpisi:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "z izčrpnim izpisom obdelanih datotek" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "izpiÅ¡i poročilo o napredku pri vsakem N-tem zapisu (privzeto 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "izpiÅ¡i sporočilo, če niso zapisane vse povezave" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "z izpisom časov sprememb datotek v UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "zapiÅ¡i izčrpno poročilo v DATOTEKO" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "z izpisom zaporednega bloka v arhivu ob vsakem sporočilu" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "vpraÅ¡aj za potrditev pri vsakem koraku" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "prikaži privzete nastavitve" + +#: src/tar.c:735 +#, 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:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "SLOG" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "nastavi slog navajanja imen; glej spodaj za veljavne SLOGE" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Združljivostne izbire:" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "Druge izbire:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Naenkrat je dovoljena največ ena od izbir »-Acdtrux«" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Nasprotujoče si izbire glede stiskanja arhiva" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " neznan tip datoteke %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "Datoteke z datumom ni najti" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Nadomeščamo %s za neznan format datuma %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s: datoteka je arhiv; brez iznosa" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Privzete vrednosti *tega* programa tar:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Neveljaven faktor blokiranja" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Neveljavna dolžina traku" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Več kot en pražni podatek" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Neveljavna skupina" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Podana zaščita ni veljavna" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Neveljavno Å¡tevilo" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Neveljaven lastnik" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Neveljavna dolžina zapisa" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Dolžina zapisa mora biti večkratnik %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Neveljavno Å¡tevilo elementov" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, fuzzy, c-format +msgid "Malformed density argument: %s" +msgstr "Okvarjen argument gostote: »%s«" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "Neznana gostota: »%c«" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[DATOTEKA]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Stara izbira »%c« zahteva argument." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence nima pomena brez seznama datotek" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence ni mogoče uporabiti v zahtevanem načinu delovanja" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Več arhivskih datotek zahteva izbiro »-M«" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Izbire --listed-incremental ni mogoče kombinirati z --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Arhivov v več delih ni mogoče preveriti" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Stisnjenega arhiva ni mogoče preveriti" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Stisnjeni arhivi v več delih niso mogoči" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "Stisnjenega arhiva ni mogoče ažurirati" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "izbira --pax-option je mogoča le na arhivih POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Zahteva po odprtju praznega arhiva bojazljivo zavrnjena" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Izbire »-Aru« so nezdružljive z »-f -«" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Ena od izbir »-Acdtrux« je obvezna" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: Neveljavna skupina" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "" + +# 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/checkpoint.c:222 +#, c-format +msgid "Write checkpoint %u" +msgstr "Oznaka pisanja %u" + +# 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Oznaka branja %u" + +#: tests/genfile.c:111 +#, 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:126 +#, fuzzy +msgid "File creation options:" +msgstr "Druge izbire:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "ustvari arhiv v navedeni obliki." + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "datoteke izvleci na standardni izhod" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "Prebranih %s bajtov iz %s" + +#: tests/genfile.c:134 +#, fuzzy +msgid "-T reads null-terminated names" +msgstr "-T prebere z \\000 terminirana imena; onemogoči -C" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "s poskusom preverjanja zapisanega arhiva" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +#, fuzzy +msgid "Update the access and modification times of FILE" +msgstr "%s: Časa zadnje spremembe in dostopa ni možno spremeniti" + +#: tests/genfile.c:190 +#, fuzzy +msgid "Execute COMMAND" +msgstr "UKAZ" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "Neveljavna oznaka časa" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Å tevilka inoda izven obsega" + +#: tests/genfile.c:248 +#, fuzzy, c-format +msgid "Negative size: %s" +msgstr "Neveljavna oznaka časa" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "Neznana sistemska napaka" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, fuzzy, c-format +msgid "cannot open `%s'" +msgstr "Ni mogoče odpreti %s" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "Ni mogoče zapreti" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " neznan tip datoteke %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "Ni mogoče do statistike za datoteko %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "Naslednik umrl s signalom %d" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +# POZOR Je to res to? +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--Predelana imena datotek--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]N" + +#~ msgid "block size" +#~ msgstr "velikost bloka" + +#~ 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 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 "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 "Cannot exec %s" +#~ msgstr "Ni mogoče pognati %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 %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: %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 "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..63a3f0c Binary files /dev/null and b/po/sv.gmo differ diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..d6961df --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2590 @@ +# Swedish messages for tar +# Copyright © 1996, 2001, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +# Jan Djärv , 2000, 2001, 2004, 2006, 2007 +# Revision: 1.85 +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-14 17:49+0100\n" +"Last-Translator: Jan Djärv \n" +"Language-Team: Swedish \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ogiltigt argument %s för %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "tvetydigt argument %s för %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Giltiga argument är:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, 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:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Okänd ARGP_HELP_FMT-parameter" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Skräp i ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Användning:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " eller: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [FLAGGA...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"Rapportera fel till %s.\n" +"Rapportera fel eller synpunkter pÃ¥ översättningen till .\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Okänt systemfel" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "visa denna hjälptext" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "ge ett kort hjälpmeddelande" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "NAMN" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "ange programnamnet" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SEK" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "vänta i SEK sekunder (standardvärde 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "visa programversion" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(PROGRAMFEL) Ingen version känd!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: För mÃ¥nga argument\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(PROGRAMFEL) Flagga borde ha känts igen!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "skrivfel" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flaggan \"%s\" är tvetydig\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flagga \"--%s\" tar inget argument\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flagga \"%s\" kräver ett argument\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: okänd flagga \"--%s\"\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: okänd flagga \"%c%s\"\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillÃ¥ten flagga -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaggan kräver ett argument -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flaggan \"-W %s\" är tvetydig\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flagga \"-W %s\" tar inget argument\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "minnet slut" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "kan inte lagra nuvarande arbetskatalog" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "kan inte gÃ¥ tillbaka till initial arbetskatalog" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Tar bort inledande \"%s\" frÃ¥n namnen i arkivet" + +#: lib/paxnames.c:156 +#, 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:169 +msgid "Substituting `.' for empty member name" +msgstr "Ersätter tomma namn i arkivet med \".\"" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "\"" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "\"" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yYjJ]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Licens GPLv3+: GNU GPL version 3 eller senare \n" +"Detta program är fri programvara. Du kan modifiera och distribuera den.\n" +"Det finns inte NÅGON SOM HELST GARANTI, till den grad som lagen tillÃ¥ter.\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Skrivet av %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Skrivet av %s och %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Skrivet av %s, %s och %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s\n" +"och %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s och %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s, %s och %s.\n" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s, %s, %s och %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s, %s, %s, %s\n" +"och %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s och %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Skrivet av %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s och andra.\n" + +#: 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 .\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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Summa skrivna byte" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Summa lästa byte" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Summa borttagna byte: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(rör)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Ogiltigt värde pÃ¥ record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arkivnamn saknas" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Kan inte verifiera standard in/ut-arkiv" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Arkivet är komprimerat. Använd flaggan %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Komprimerade arkiv kan inte uppdateras" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Vid bandets början, avslutar nu" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "För mÃ¥nga fel, avslutar" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek stannade inte pÃ¥ en postgräns" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: innehÃ¥ller ogiltigt volymnummer" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Volymnummer flödade över" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Filslut vid förväntat användarsvar" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "VARNING: Arkivet är ofullständigt" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Starta ett underskal\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Skriv denna lista\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Ingen ny volym; avslutar.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Filnamn inte angivet, försök igen.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Ogiltig indata. Skriv ? för hjälp.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "kommandot \"%s\" misslyckades" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s fortsätter inte i denna volym" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s har fel storlek (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Denna volym kommer inte i rätt ordning" + +#: src/buffer.c:1273 +#, 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:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Volym %s överensstämmer inte med %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Ett ensamt nollblock vid %s" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: innehÃ¥ller en cachekatalog-tagg %s; %s" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Genererar negativa oktala värden i arkivhuvudet" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "innehÃ¥llet inte arkiverat" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Okänd filtyp; filen ignorerad" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Det fattas länkar till \"%s\".\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: filen är oförändrad; inte arkiverad" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: filen är själva arkivet; inte arkiverad" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Fil borttagen innan vi läste den" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "katalog inte arkiverad" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: Fil ändrades under tiden vi läste den" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socketfil ignorerad" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Katalogen har bytt namn frÃ¥n %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Katalogen har bytt namn" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Katalogen är ny" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Ogiltigt värde pÃ¥ tidsvärde" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Ogiltig modifikationstid (sekunder)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Ogiltig modifikationstid (nanosekunder)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Ogiltigt enhetsnummer" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Ogiltigt inodnummer" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Fält för lÃ¥ngt när ögonblicksfil lästes" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Läsfel i ögonblicksfil" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Oväntat filslut i ögonblicksfil" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Oväntat fältvärde i ögonblicksfil" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Postavslutare fattas" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Felaktigt filformat för inkrementell säkerhetskopiering" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" +"Formatversion för inkrementell säkerhetskopiering stöds inte: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "Felaktig dumpkatalog: förväntade \"%c\" men hittade %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Felaktig dumpkatalog: \"X\" duplicerad" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Felaktig dumpkatalog: tomt namn i \"R\"" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Felaktig dumpkatalog: \"T\" föregÃ¥s inte av \"R\"" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Felaktig dumpkatalog: tomt namn i \"T\"" + +#: src/incremen.c:1431 +#, 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:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Felaktig dumpkatalog: \"X\" används inte" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Kan inte skapa temporärkatalog med mall %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Rensar inte katalog: kunde inte ta status" + +#: src/incremen.c:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Tar bort %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Ogiltigt arkivformat" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU-tillägg önskade i ett inkompatibelt arkivformat" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Operationsläge:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "visa innehÃ¥llet i arkivet" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "extrahera filer frÃ¥n arkivet" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "skapa ett nytt arkiv" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "visa skillnader mellan filsystemet och arkivet" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "lägg till filer pÃ¥ slutet av arkivet" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "lägg till filer som är nyare än de i arkivet" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "lägg till innehÃ¥llet i en arkivfil till arkivet" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "ta bort frÃ¥n arkivet (inte för arkiv pÃ¥ magnetband!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "verifiera arkivets volymnamn och avsluta." + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Modifiera operationslägen:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "hantera filer med hÃ¥l mer effektivt" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "ÖVRE[.UNDRE]" + +#: src/tar.c:401 +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:403 +msgid "handle old GNU-format incremental backup" +msgstr "hantera gamla GNU-formatet för inkrementell säkerhetskopiering" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "FIL" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "hantera nya GNU-formatet för inkrementell säkerhetskopiering" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "avsluta inte med felslutstatus p.g.a. oläsbara filer" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "NUMMER" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "arkivet är sökbart" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Kontrollera överskrivning:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "försök verifiera arkivet efter det skapats" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "ta bort filer efter de sparats i arkivet" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "ersätt inte befintliga filer vid extrahering" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "skriv över befintliga filer vid extrahering" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "ta bort befintliga filer innan de nya extraheras" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "töm kataloghierarkier före extrahering av katalog" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "bevara befintliga katalogers metadata" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"skriv över metadata för befintliga kataloger vid extrahering (standardvärde)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Välj utdataström:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "extrahera filer till standard ut" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "KOMMANDO" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "extrahera filer till standard in för ett annat program" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "ignorera barnprocessers slutstatus" + +#: src/tar.c:460 +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:465 +msgid "Handling of file attributes:" +msgstr "Hantering av filattribut:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "sätt NAMN som ägare för adderade filer" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "sätt NAMN som grupp för adderade filer" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DATUM-ELLER-FIL" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "RÄTTIGHET" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "sätt (symbolisk) RÄTTIGHET för adderade filer" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "METOD" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "extrahera inte filers modifieringstid" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "försök extrahera filer med samma ägare som i arkivet" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "extrahera filer med dig själv som ägare" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "använd alltid tal för användar- och gruppnamn" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"extrahera information om filrättigheter (standardvärde för superanvändare)" + +#: src/tar.c:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "sortera namn som ska extraheras sÃ¥ de passar ihop med arkivet" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "samma som bÃ¥de -p och -s" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "ta bort effekten av flaggan --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Enhetsval och enhetsbyte:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARKIV" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "använd arkivfil eller enhet ARKIV" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "arkivfilen är lokal även om namnet har kolon" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "använd KOMMANDO istället för rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "använd KOMMANDO istället för rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "ange enhet och densitet" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "skapa/visa/extrahera ett flervolymsarkiv" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "byt band efter det att NUMMER x 1024 byte skrivits" + +#: src/tar.c:539 +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:542 +msgid "use/update the volume number in FILE" +msgstr "använd/uppdatera volymnummer i FIL" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Blockhantering:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOCK" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "BLOCK x 512 byte per post" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "NUMMER byte per post, multipel av 512" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ignorera block med enbart nolltecken (betyder filslut)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "omblocka vid läsning (för 4.2BSD-rör)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Val av arkivformat:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "FORMAT" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "skapa ett arkiv med givet format" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "FORMAT är ett av följande:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "gammalt V7 format" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "GNU-format enligt tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU-format frÃ¥n tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) format" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) format" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "samma som pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "samma som --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "samma som --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "nyckelord[[:]=värde][,nyckelord[[:]=värde], ...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "ange nyckelord för pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "NAMN" + +#: src/tar.c:587 +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:592 +msgid "Compression options:" +msgstr "Komprimeringsflaggor:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "använd arkivsuffix för att bestämma komprimeringsprogram" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "filtrera arkivet genom bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "filtrera arkivet genom gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "filtrera arkivet genom compress" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "filtrera arkivet genom lzma" + +#: src/tar.c:606 +msgid "PROG" +msgstr "PROG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "filtrera genom PROG (mÃ¥ste förstÃ¥ -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Filval:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "KATALOG" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "byt katalog till KATALOG" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "hämta namn att extrahera frÃ¥n FIL" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T läser namn Ã¥tskilda med nolltecken, -C obrukbar" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "avcitera filnamn som lästs med -T (standardvärde)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "avcitera inte filnamn som lästs med -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MÖNSTER" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "utelämna filer som matchar MÖNSTER" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "utelämna filer som matchar mönster i FIL" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"utelämna innehÃ¥llet i kataloger som innehÃ¥ller CACHEDIR.TAG, förutom " +"CACHEDIR.TAG själv" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "utelämna allt i kataloger som innehÃ¥ller CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "utelämna kataloger som innehÃ¥ller CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "utelämna innehÃ¥llet i kataloger som innehÃ¥ller FIL, förutom FIL själv" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "utelämna allting i kataloger som innehÃ¥ller FIL" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "utelämna kataloger som innehÃ¥ller FIL" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "uteslut kataloger frÃ¥n versionshanteringssystem" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "gÃ¥ inte automatiskt ned i kataloger" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "byt inte filsystem när arkivet skapas" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "gÃ¥ rekursivt ned i kataloger (standardvärde)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "tag inte bort inledande \"/\" frÃ¥n namn" + +#: src/tar.c:656 +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:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "följ hÃ¥rda länkar, arkivera filerna de pekar pÃ¥" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "NAMN" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "börja med fil NAMN i arkivet" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "arkivera bara filer nyare än DATUM-ELLER-FIL" + +#: src/tar.c:664 +msgid "DATE" +msgstr "DATUM" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "jämför datum och tid endast för dataändringar" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "KONTROLL" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "gör säkerhetskopior före borttagning, välj typ av versionshantering" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "STRÄNG" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Filnamnstransformationer:" + +#: src/tar.c:676 +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:678 +msgid "EXPRESSION" +msgstr "UTTRYCK" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "använd seds ersättnings-UTTRYCK för att transformera filnamn" + +#: src/tar.c:684 +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:687 +msgid "ignore case" +msgstr "matcha gemener och versaler lika" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "mönster mÃ¥ste matcha i början pÃ¥ filnamn" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "mönster matchas efter \"/\" i filnamn (standardvärde vid uteslutning)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "matcha gemener och versaler olika (standardvärde)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "använd jokertecken (standardvärde för uteslutning)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "ordagrann strängjämförelse" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "jokertecken matchar inte \"/\"" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "jokertecken matchar \"/\" (standardvärde för uteslutning)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Informativ utskrift:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "visa namn pÃ¥ alla filer som behandlas" + +#: src/tar.c:711 +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:713 +msgid "ACTION" +msgstr "ÅTGÄRD" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "utför ÅTGÄRD vid vare kontrollpunkt" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "visa ett meddelande om inte alla länkar arkiverats" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "SIGNAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "visa filers modifieringstid i UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "skicka informativa meddelanden till FIL" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "visa blocknummer inom arkivet för varje meddelande" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "frÃ¥ga efter bekräftelse för varje steg" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "visa standardvärden för \"tar\"" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "visa fil- eller arkivnamn efter transformering" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "STIL" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "citera även tecken i STRÄNG" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "citera inte tecken i STRÄNG" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Kompatibilitetsflaggor:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Andra flaggor:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "begränsa användningen av eventuellt farliga flaggor" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Du kan endast ange en av flaggorna \"-Acdtrux\"" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Motstridiga komprimeringsflaggor" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Okänt signalnamn: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Tidsfil hittades inte" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Flagga %s: Tolkar tidsangivelse \"%s\" som %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: fillistan redan läst" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: filnamnet som lästes innehÃ¥ller nolltecken" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Giltiga argument till flaggan --quoting-style är:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Denna* tar har standardvärdena:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Ogiltig blockfaktor" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Ogiltig bandlängd" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Mer än en datumgräns" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Ogiltig version för filer med hÃ¥l" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' stöds inte pÃ¥ denna plattform" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint-värdet är inte ett heltal" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Ogiltig grupp" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Ogiltiga rättigheter givna för flagga" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Ogiltigt nummer" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Ogiltig ägare" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Ogiltig poststorlek" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Poststorlek mÃ¥ste vara en multipel av %d" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Ogiltig antal element" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Endast en --to-command flagga tillÃ¥ten" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Ogiltig densitetsangivelse: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Okänd densitet: \"%c\"" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[FIL]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Gammal flagga \"%c\" kräver ett argument" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence är meningslöst utan en fillista" + +#: src/tar.c:2202 +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:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Multipla arkivfiler kräver \"-M\" flaggan" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Kan inte kombinera --listed-incremental med --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Flervolymsarkiv kan inte verifieras" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Komprimerade arkiv kan inte verifieras" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Kan inte använda komprimerade flervolymsarkiv" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Komprimerade arkiv kan inte slÃ¥s samman" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option kan bara användas pÃ¥ POSIX-arkiv" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Vägrar fegt att skapa ett tomt arkiv" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Flaggorna \"-Aru\" är inkompatibla med \"-f -\"" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Du mÃ¥ste ange en av flaggorna \"-Acdtrux\"" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: ogiltig timeout" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: okänd kontrollpunktsÃ¥tgärd" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "skriv" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "läs" + +#. 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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Kontrollpunkt för läsning %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Flaggor för filskapande:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "STORLEK" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Skapa ett arkiv med given STORLEK" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Skriv till NAMN istället för till standard ut" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Läs filnamn frÃ¥n FIL" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T läser namn Ã¥tskilda med nolltecken" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Storlek för ett block för filer med hÃ¥l" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "POSITION" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Flytta till given position innan data skrivs" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Flaggor för filstatistik:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Flaggor för synkron exekvering:" + +#: tests/genfile.c:163 +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:166 +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:169 +msgid "Set date for next --touch option" +msgstr "Sätt datum för nästa --touch" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Visa exekverade kontrollpunkter och slutstatus pÃ¥ KOMMANDO" + +#: tests/genfile.c:177 +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:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "Uppdatera access- och modifikationstider för FIL" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Exekvera KOMMANDO" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Ogiltigt storlek: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Nummer utanför giltigt intervall: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negativ storlek: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "status (stat) kunde ej tas pÃ¥ %s" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Fel vid parsning av tal nära \"%s\"" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Okänt datumformat" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGUMENT...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "kan inte öppna \"%s\"" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "kan inte flytta (seek)" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "filnamnet innehÃ¥ller nolltecken" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "felaktig mask (nära \"%s\")" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Okänt fält \"%s\"" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "kan inte sätta tid pÃ¥ \"%s\"" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Kommandot avslutades utan fel\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Kommandot misslyckades med slutstatus %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Kommandot terminerades av signal %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Kommandot stoppades av signal %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Kommandot dumpade minnet\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Kommandot avslutade\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat kräver filnamn" + +#: tests/genfile.c:866 +#, 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..23c9429 --- /dev/null +++ b/po/tar.pot @@ -0,0 +1,2479 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr "" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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 "" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "" +msgstr[1] "" + +#: src/buffer.c:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "" +msgstr[1] "" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "" + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +msgid "Compression options:" +msgstr "" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "" + +#: src/tar.c:2483 +#, 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 "" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" diff --git a/po/tr.gmo b/po/tr.gmo new file mode 100644 index 0000000..5657517 Binary files /dev/null and b/po/tr.gmo differ diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..e9cd42f --- /dev/null +++ b/po/tr.po @@ -0,0 +1,2568 @@ +# Turkish translations for GNU tar messages. +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# Nilgün Belma Bugüner , 2001,..., 2007. +msgid "" +msgstr "" +"Project-Id-Version: tar 1.18\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2007-07-09 11:30+0300\n" +"Last-Translator: Nilgün Belma Bugüner \n" +"Language-Team: Turkish \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "`%2$s' için %1$s argümanı geçersiz" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "`%2$s' için %1$s argümanı belirsiz" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Geçerli argümanlar:" + +#: lib/argp-help.c:147 +#, 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:220 +#, 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:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT parametresi pozitif olmalı" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: ARGP_HELP_FMT ile belirtilen parametre bilinmiyor" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "ARGP_HELP_FMT bozuk: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Kullanımı:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " veya: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [SEÇENEK...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"Yazılım hatalarını <%s> adresine,\n" +"çeviri hatalarını adresine bildiriniz.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Bilinmeyen sistem hatası" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "bu yardım iletisi gösterilir" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "kısa bir kullanım iletisi gösterilir" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "Ä°SÄ°M" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "uygulama ismi" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "SAN" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "SANÄ°YE saniye bekler (öntanımlı 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "sürüm bilgisi gösterilir" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(YAZILIM HATASI) Sürümünü bilmiyor!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: argüman sayısı fazla\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(YAZILIM HATASI) Seçenek tanınmak zorunda!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' seçeneği belirsiz\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, 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:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: `--%s' seçeneği bilinmiyor\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: `%c%s' seçeneği bilinmiyor\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kuraldışı seçenek -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, 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:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneği belirsiz\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "bellek tükendi" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "Çalışma dizini değiştirilemez" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +msgstr "Çalışılan dizin kaydedilemez" + +#. 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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Üye isimlerinden `%s' kaldırılıyor" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Sabit bağ hedeflerinden `%s' kaldırılıyor" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Boş üye ismi için `.' ikamesi" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[eEyY]" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" + +#: 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ı 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Yazılan toplam bayt" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Okunan toplam bayt" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Silinen toplam bayt: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(boru)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "record_size için geçersiz değer" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Arşiv ismi verilmemiş" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "stdG/stdÇ arşivi doğrulanamaz" + +#: src/buffer.c:517 +#, 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:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Sıkıştırılmış arşivler güncellenemez" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Bandın başlangıcında, şimdilik çıkıyor" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Çok hata var, çıkıyor" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +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:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek bir kaydın sınırında durmadı" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: geçersiz bölüm numarası içeriyor" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Bölüm numarası kapsamdışı" + +#: src/buffer.c:909 +#, 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:915 +msgid "EOF where user reply was expected" +msgstr "Kullanıcı cevabı beklenirken dosya sonuna gelindi" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "UYARI: Arşiv eksik" + +#: src/buffer.c:934 +#, 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 İşlem sürdürülür\n" + +#: src/buffer.c:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! bir alt kabuk açılır\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Bu listeyi basar\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Yeni bölüm yok; çıkıyor.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Dosya ismi belirtilmemiş. Tekrar deneyin.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Girdi geçersiz, Yardım için ? yazın.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "%s komutu başarısız" + +#: src/buffer.c:1199 +#, 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:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s bu bölümde devam etmiyor" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s yanlış uzunluk (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Bu bölüm sıralama dışı" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Arşiv etiketi %s ile eşleşmiyor" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "%s bölümü %s ile eşleşmiyor" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 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/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: %s arabellekleme dizini yaftasını içeriyor; %s" + +#: src/create.c:272 +#, 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:278 +#, 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:338 +msgid "Generating negative octal headers" +msgstr "Negatif sekizlik başlık üretiliyor" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: bağ ismi çok uzun; dökümlenmedi" + +#: src/create.c:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "içerik dökümlenmedi" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Bilinmeyen dosya türü; dosya yoksayıldı" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "%s için bağlar kayıp.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: dosya değişmedi; dökümlenmedi" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: dosya arşivdir; dökümlenmedi" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Dosya okunamadan kaldırıldı" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "dizin dökümlenmedi" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: dosya okundu olarak imlendi" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: soket yoksayıldı" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Dizinin eski adı %s idi" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Dizin adı değiştirilmişti" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Dizin yeni" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Geçersiz zaman damgası" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Değişiklik zamanı (saniye cinsinden) geçersiz" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Değişiklik zamanı (nanosaniye cinsinden) geçersiz" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Geçersiz aygıt numarası" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Geçersiz düğüm numarası" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Anlık görüntü dosyası okunurken alan çok uzun" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Anlık görüntü dosyasında okuma hatası" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Anlık görüntü dosyasında beklenmeyen dosya sonu" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Anlık görüntü dosyasında beklenmeyen alan değeri" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Kayıt sonlandırıcı eksik" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Arttırımlı dosya biçimi hatalı" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Desteklenmeyen arttırımlı biçim sürümü: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "dumpdir bozuk: umulan '%c' ama bulunan %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "dumpdir bozuk: 'X' yinelenmiş" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "dumpdir bozuk: 'R'deki isim boş" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "dumpdir bozuk: 'T' 'R' ile öncelenmemiş" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "dumpdir bozuk: 'T'deki isim boş" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "dumpdir bozuk: umulan'%c' ama bulunan veri sonu" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "dumpdir bozuk: 'X' hiç kullanılmamış" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "%s şablonu kullanılarak geçici dizin oluşturulamıyor" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: dizin temizlenmiyor: durumlama yapılamadı" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: dizin farklı bir aygıtta: temizlenmiyor" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: %s siliniyor\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Geçersiz arşiv biçimi" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "GNU özellikleri ile uyumsuz arşiv biçimi" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Ana işlem kipi:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "bir arşiv içeriğini listeler" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "bir arşivdeki dosyaları çıkarır" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "yeni bir arşiv oluşturur" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "arşiv ile dosya sistemi arasındaki farklar bulunur" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "dosyaları arşivin sonuna ekler" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "sadece arşivdeki kopyasından daha yeni dosyalar eklenir" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "bir arşive tar dosyaları ekler" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "arşivden siler (teyplerde değil!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "arşiv bölüm etiketini sınar ve çıkar" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "İşlem değiştiriciler:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "seyrek dosyalar verimli şekilde elde edilir" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "ANA[.ALT]" + +#: src/tar.c:401 +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:403 +msgid "handle old GNU-format incremental backup" +msgstr "GNU eski tarz arttırımlı yedekleme tanınır" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "DOSYA" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "GNU yeni tarz arttırımlı yedekleme tanınır" + +#: src/tar.c:407 +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:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "SAYI" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "arşiv arama yapılabilen türde" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Üsteyazma denetimi:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "yazdıktan sonra arşivi doğrulamaya çalışır" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "arşive eklendikten sonra dosyalar silinir" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "çıkarılırken mevcut dosyalar değiştirilmez" + +#: src/tar.c:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "çıkarılırken mevcut dosyaların üzerine yazılır" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "çıkarılmadan önce mevcut dosya silinir" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "dizin çıkarılmadan önce alt dizinleri silinir" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "mevcut dizinlerin öznitelikleri korunur" + +#: src/tar.c:445 +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:451 +msgid "Select output stream:" +msgstr "Çıktı akımını seçiniz:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "dosyalar standart çıktıya çıkarılır" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "KOMUT" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "çıkarılan dosyaları başka bir uygulamaya borular" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "altsüreçlerin çıkış kodları yoksayılır" + +#: src/tar.c:460 +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:465 +msgid "Handling of file attributes:" +msgstr "Dosya özniteliklerinin elde edilmesi:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "Ä°SÄ°M eklenen dosyaların sahibi yapılır" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "Ä°SÄ°M eklenen dosyaların grubu yapılır" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "DOSYA-TARÄ°HÄ°" + +#: src/tar.c:472 +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:473 +msgid "CHANGES" +msgstr "KÄ°P" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "KÄ°P eklenen dosyaların (sembolik) kipi yapılır" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "YÖNTEM" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "dosya değişiklik zamanı çıkarılmaz" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "sahibi aynı olan dosyalar çıkarılmaya çalışılır" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "dosyalar sizin sahipliğinizde çıkarılır" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "kullanıcı/grup isimleri yerine daima numaraları kullanılır" + +#: src/tar.c:489 +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:493 +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:495 +msgid "sort names to extract to match archive" +msgstr "isimler arşivdeki sırasına göre çıkarılır" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "-p ve -s birlikte verilmiş gibi olur" + +#: src/tar.c:500 +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:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "--delay-directory-restore seçeneğinin etkisi iptal edilir." + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Aygıt seçimi ve aygıt değiştirme:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "ARŞİV" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "arşiv dosyası ya da ARŞİV aygıtı kullanılır" + +#: src/tar.c:513 +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:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "rmt yerine rmt KOMUT kullanılır" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "rsh yerine uzak uçta KOMUT kullanılır" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "sürücü ve yoğunluk belirtilir" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "çok bölümlü arşivi oluşturur/listeler/çıkarır" + +#: src/tar.c:537 +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:539 +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:542 +msgid "use/update the volume number in FILE" +msgstr "DOSYAda bölüm numarası kullanılır/güncellenir" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Aygıtın blok düzeni:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "BLOK" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "kayıt başına BLOK x 512 bayt" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "512'nin katları olarak kayıt başına BOYUT bayt" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "arşivdeki sıfırlı bloklar yoksayılır (dosyasonu anlamında)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "okunmuş olarak yeniden bloklanır (4.2 BSD boruları için)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Arşiv biçimi seçimi:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "BİÇİM" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "belirtilen biçimin arşivi oluşturulur." + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "BİÇİM şunlardan biri olabilir:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "eski V7 tar biçimi" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "tar <= 1.12 için GNU biçimi" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x biçimi" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) biçimi" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) biçimi" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "pax ile aynı" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr " --format=v7 ile aynı" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "--format=posix ile aynı" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "isim[[:]=değer][,isim[[:]=değer]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "pax anahtar sözcüklerini denetler" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "METÄ°N" + +#: src/tar.c:587 +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:592 +#, fuzzy +msgid "Compression options:" +msgstr "Sıkıştırma seçenekleri çelişiyor" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "arşivi bzip2 üzerinden geçirir" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "arşivi gzip üzerinden geçirir" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "arşivi compress üzerinden geçirir" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "arşivi gzip üzerinden geçirir" + +#: src/tar.c:606 +msgid "PROG" +msgstr "UYG" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "arşivi UYG üzerinden geçirir (UYG -d kabul etmeli)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Yerel dosya seçimi:" + +#: src/tar.c:615 +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:616 +msgid "DIR" +msgstr "DÄ°ZÄ°N" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "DÄ°ZÄ°N dizinine geçilir" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "çıkarılacak ya da oluşturulacak isimler DOSYAdan alınır" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T boş karakter sonlandırmalı isimleri okur, -C iptal edilir" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "-T ile okunan dosyaisimlerine tırnak ayıklama uygulanır" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "-T ile okunan dosyaisimlerine tırnak ayıklama uygulanmaz" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "ŞABLON" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "belirtilen ŞABLONa uyan dosyalar hariç tutulur" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "DOSYAdaki şablonlara uyan isimler hariç tutulur" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "yafta dosyası hariç, CACHEDIR.TAG içeren dizinler dışlanır" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG içeren dizinlerin altındaki herşey hariç tutulur" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "CACHEDIR.TAG içeren dizinler hariç tutulur" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"DOSYA'nın kendisi hariç, DOSYA içeren dizinlerin içerikleri hariç tutulur" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "DOSYA içeren dizinlerin altındaki herşey hariç tutulur" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "DOSYA içeren dizinler hariç tutulur" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "dizinlerde özdevinimli olarak azalan sıralamadan kaçınılır" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "arşiv oluşturulurken yerel dosya sisteminde kalınır" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "dizinlerin alt dizinlerine inilir (öntanımlı)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "dosya isimlerinin başındaki `/'lar ayrılmaz" + +#: src/tar.c:656 +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:658 +#, fuzzy +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" +"sembolik bağlar izlenir; hedeflerindeki dosyalar arşivlenir ve dökümlenir" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "ÜYE-Ä°SMÄ°" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "arşivin ÜYE-Ä°SMÄ° üyesinden başlanır" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "sadece DOSYA-TARÄ°HÄ°nden daha yeni dosyalar saklanır" + +#: src/tar.c:664 +msgid "DATE" +msgstr "TARÄ°H" + +#: src/tar.c:665 +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:666 +msgid "CONTROL" +msgstr "DENETÄ°M" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "kaldırılmadan önce DENETÄ°M sürümü seçilerek yedeklenir" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "DÄ°ZGE" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Dosya ismi dönüşümleri:" + +#: src/tar.c:676 +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:678 +msgid "EXPRESSION" +msgstr "Ä°FADE" + +#: src/tar.c:679 +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:684 +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:687 +msgid "ignore case" +msgstr "harf büyüklükleri önemsenmez" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "dosya isminin başlangıcına uyan kalıplar" + +#: src/tar.c:691 +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:693 +msgid "case sensitive matching (default)" +msgstr "harf büyüklüklerine duyarlı eşleşme (öntanımlı)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "genelleme kalıpları kullanılır (dışlama için öntanımlı)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "birebir dizge eşleme" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "'/' ile eşleşmeyen genelleme kalıpları" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "'/' ile eşleşen genelleme kalıpları (dışlama için öntanımlı)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Bilgilendirme çıktısı:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "işlenen dosyalar ayrıntılı listelenir" + +#: src/tar.c:711 +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:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +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:718 +msgid "SIGNAL" +msgstr "SiNYAL" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "dosya değişiklik zamanları UTC'ye göre basılır" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "ayrıntılı çıktı DOSYAya gönderilir" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "her iletide arşiv içindeki blok sayısı gösterilir" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "her eylemden önce doğrulama istenir" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "tar öntanımlıları gösterilir" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "dönüşümden sonra dosya ve arşiv isimlerini gösterir" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "ŞEKÄ°L" + +#: src/tar.c:741 +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:743 +msgid "additionally quote characters from STRING" +msgstr "DÄ°ZGEdeki sarmalama karakterlerine ek olarak" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "DÄ°ZGEdeki karakterler için sarmalamayı iptal eder" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Uyumluluk seçenekleri:" + +#: src/tar.c:753 +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:758 +msgid "Other options:" +msgstr "Diğer seçenekler:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "bozuculuk olasılığı olan bazı seçeneklerin kullanımı iptal edilir" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "`-Acdtrux' seçenekleri birden fazla belirtilemez" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Sıkıştırma seçenekleri çelişiyor" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Bilinmeyen sinyal ismi: %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Tarih örnekleri dosyası bulunamadı" + +#: src/tar.c:997 +#, 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:1022 +#, 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:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: dosya listesi zaten okundu" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: okunan dosya ismi boş karakter içeriyor" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "--quoting-style seçeneği için geçerli değerler:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*Bu* tar için öntanımlılar:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Bloklama çarpanı geçersiz" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Kayıt ortamının uzunluğu geçersiz" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Birden fazla eşik tarihi" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Seyrek sürüm değeri geçersiz" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' seçeneği bu platformda desteklenmiyor" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "--checkpoint değeri bir tamsayı değil" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: geçersiz grup" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Seçenekte verilen kip geçersiz" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Sayı geçersiz" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Sahip geçersiz" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Kayıt uzunluğu geçersiz" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Kayıt uzunluğu %d nin katları olmalı" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Elemen sayısı geçersiz" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Sadece tek bir --to-command seçeneği kullanılabilir" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Hatalı yoğunluk argümanı: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Bilinmeyen yoğunluk: '%c'" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[DOSYA]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Eski seçenek `%c' bir argümanla kullanılır." + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "--occurrence bir dosya listesi olmaksızın anlamlı değil" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence istenen işlem kipinde kullanılamaz" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Çok sayıda arşiv dosyası `-M' seçeneği gerektirir" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "--listed-incremental ile --newer birlikte kullanılamaz" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Çok sayıda bölüm içeren arşivler doğrulanamaz" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Sıkıştırılmış arşivler doğrulanamaz" + +#: src/tar.c:2275 +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:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Sıkıştırılmış arşivler birleştirilemez" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option sadece POSIX arşivlerinde kullanılabilir" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Bir boş arşivin oluşturulması ister istemez reddediliyor" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "`-Aru' seçenekleri `-f -' ile uyumsuz" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "`-Acdtrux' seçeneklerinden biri belirtilmeli" + +#: src/tar.c:2483 +#, 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" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s: geçersiz grup" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Okuma sınaması yeri %u" + +#: tests/genfile.c:111 +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:126 +msgid "File creation options:" +msgstr "Dosya oluşturma seçenekleri:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "BOYUT" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Dosya belirtilen BOYUTta oluşturulur" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Dosyalar standart çıktı yerine Ä°SÄ°M dosyasına yazılır" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Dosya isimleri DOSYAdan okunur" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T boş karakter sonlandırmalı isimleri okur" + +#: tests/genfile.c:136 +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:139 +msgid "Size of a block for sparse file" +msgstr "Seyrek dosyalar için blok boyu" + +#: tests/genfile.c:141 +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:143 +msgid "OFFSET" +msgstr "KONUM" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Veriyi yazmadan önce belirtilen konuma gider" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Dosya istatistikleri seçenekleri:" + +#: tests/genfile.c:153 +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:160 +msgid "Synchronous execution options:" +msgstr "Ä°cra eşzamanlama seçenekleri:" + +#: tests/genfile.c:163 +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:166 +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:169 +msgid "Set date for next --touch option" +msgstr "Sonraki --touch seçeneği için tarih ayarlanır" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Ä°cra edilen sınamalar ve KOMUTun çıkış durumu gösterilir" + +#: tests/genfile.c:177 +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:180 +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:184 +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:187 +msgid "Update the access and modification times of FILE" +msgstr "DOSYAnın değişiklik ve erişim zamanları güncellenir" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "KOMUT çalıştırılır" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Geçersiz boyut: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Numara izin verilen aralığın dışında: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Negatif boyut: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) başarısız" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Sayı çözümlenirken `%s' civarında hata" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Bilinmeyen tarih biçimi" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ARGÜMANLAR...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "`%s' açılamıyor" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "konumlanamıyor" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "dosya ismi boş karakter içeriyor" + +#: tests/genfile.c:509 +#, 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:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "kalıp yanlış (`%s' yakınında)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Bilinmeyen alan `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "zaman `%s' olarak ayarlanamaz" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Komut başarıyla sonlandı\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Komut %d çıkış durumu ile başarısız oldu\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Komut %d sinyali ile sonlandırıldı\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Komut %d sinyali ile durduruldu\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Komut bellek dökümü verdi\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Komut sonlandı\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat seçeneği dosya isimleri gerektirir" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "argüman sayısı çok fazla" + +#~ msgid "block size" +#~ msgstr "blok uzunluğu" + +#~ msgid "[.]NUMBER" +#~ msgstr "[.]SAYI" diff --git a/po/uk.gmo b/po/uk.gmo new file mode 100644 index 0000000..58216e9 Binary files /dev/null and b/po/uk.gmo differ diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..1827990 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,2779 @@ +# Ukrainian messages for GNU tar +# Copyright (C) 2008 Free Software Foundation, Inc. +# Sergey Poznyakoff , 2005, 2006, 2007, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-21 19:59+0200\n" +"Last-Translator: Sergey Poznyakoff \n" +"Language-Team: Ukrainian \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "неправильний аргумент %s для %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "неоднозначний аргумент %s для %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Дозволені аргументи такі:" + +#: lib/argp-help.c:147 +#, 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:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: параметр ARGP_HELP_FMT вимагає значення" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: параметр ARGP_HELP_FMT має бути додатнім" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Невідомий параметр ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Хибні дані в ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" +"Аргументи, обов'язкові для довгих ключів, є обов'язковими й для коротких." + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "Використання:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " чи: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [ОПЦІЯ...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "" +"Спробуйте `%s --help' або `%s --usage' для отримання докладнішого опису.\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Про помилки звітуйте на <%s>.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Невідома системна помилка" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "вивести цю довідку" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "вивести коротке повідомлення про використання" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "НАЗВА" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "встановити назву програми" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "СЕКУНДИ" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "зачекати вказану кількість секунд (типово 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "вивести версію програми" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(ПОМИЛКА ПРОГРАМУВАННЯ) Невідома версія!?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Забагато аргументів\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(ПОМИЛКА ПРОГРАМУВАННЯ) Опція мала бути розпізнана!?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "помилка запису" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: опція `%s' неоднозначна\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: опція `--%s' не може мати аргументу\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: опція `%c%s' не може мати аргументу\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: опція `%s' вимагає аргумент\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: невідома опція `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: невідома опція `%c%s'\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: недопустима опція -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: невірна опція -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: опція вимагає аргумент -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: опція `-W %s' неоднозначна\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: опція `-W %s' не може мати аргументу\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "пам'ять вичерпана" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "не вдається змінити поточний каталог" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "Видалення початкового префіксу `%s' з назв файлів" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "Видалення початкового префіксу `%s' з назви цілі жорсткого посилання" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "Підстановка `.' замість пустої назви файлу" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[yYтТ]" + +#: lib/rpmatch.c:72 +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 "Не вдалося запустити віддалену оболонку" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Ліцензія GPLv3+: GNU GPL версії 3 або пізнішої \n" +"Немає ЖОДНИХ ГАРАНТІЙ, в межах дозволених правом.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Автор: %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Автори: %s та %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Автори: %s, %s та %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"та %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, та %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, %s та %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, %s, %s та %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, %s, %s, %s та %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, %s, %s, %s,\n" +"%s та %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Автори: %s, %s, %s\n" +"%s, %s, %s, %s,\n" +"%s, %s та інші.\n" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Записано загалом" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Прочитано байтів загалом" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Видалено загалом: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(канал)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Недійсне значення record_size" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Не вказано назви архіву" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Неможливо перевіряти архів, записаний до stdout" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "Архів стиснений. Використовуйте опцію %s" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Не можна оновлювати стиснені архіви" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "На початку стрічки, закінчуємо" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Надто багато помилок, виконання перервано" + +#: src/buffer.c:678 +#, 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:698 +#, 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:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "" +"Не вдалося переміститись назад у архіві; можливо архів не можна прочитати " +"без опції -i" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek не зупинився на межі запису" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: містить невірний номер тому" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Переповнення номера тому" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "Підготуйте том #%d архіву %s ї натиснить return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "Кінець файлу, замість очікуваної відповіді" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "ПОПЕРЕДЖЕННЯ: Незавершений архів" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Викликати оболонку\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? Вивести цю довідку\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Новий том відсутній. Завершення.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "Не вказано назви файлу. Спробуйте ще раз.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Недійсні вхідні дані. Наберіть ? щоб отримати підказку.\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "збій виконання `%s'" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "" +"%s можливо продовжується у цьому томі: заголовок містить обрізану назву" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s не продовжується у цьому томі" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s є неправильним розміром (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "Цей том є за межами послідовності" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "Назви тому відсутня в архіві. Не можна порівняти з %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Етикетка тому %s не співпадає з %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "Самотній блок нулів, зсув %s" + +# Не подобається мені це "кешування"... +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: містить мітку каталогу кешування `%s'; %s" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "Значення %s поза межами діапазону типа %s %s..%s; заміна на %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "значення %s за межами діапазону типа %s %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Створення від'ємних вісімкових заголовків" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s: назва файлу занадто довга (макс. %d); не архівується" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s: назва файлу занадто довга (не вдається розділити); не архівується" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s: назва посилання занадто довга; не архівується" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s: файл знаходиться в іншої файлової системі; не архівується" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "вміст не архівується" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s: Невідомий тип файла; Файл проігноровано" + +#: src/create.c:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Відсутні деякі посилання до `%s'.\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s: файл не змінено; не архівується" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s: файл є архівом; не архівується" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s: Файл було видалено перед тим як tar встиг його прочитати" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "каталог не архівується" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s: файл змінився під час читання" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: гніздо ігнорується" + +# FIXME: door? +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Каталог перейменовано з %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Каталог перейменовано" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: Новий каталог" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Невірний час файлу" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Невірна дата модифікації (секунди)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Недійсний час модифікації (наносекунди)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Невірний номер пристрою" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Невірний номер і-вузла" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "З файла-знімка прочитано надто довге поле" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Помилка читання файла-знімка" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Неочікуваний кінець файла-знімка" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Неочікуваний кінець файла-знімка" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Бракує ознаки кінця запису" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Неправильний формат файла знімку" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Такий інкрементний формат не підтримується: %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" +"Неправильно сформований dumpdir: очікувалося '%c' натомість знайдено %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "Неправильно сформований dumpdir: 'X' вказаний двічі" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "Невірний формат dumpdir: пуста назва у `R'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "Невірний формат dumpdir: `T' без попереднього `R'" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "Невірний формат dumpdir: пуста назва у `T'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" +"Невірний формат dumpdir: очікувалося `%c', натомість знайдено кінець файла" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "Невірний формат dumpdir: `X' не використаний" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Не вдається створити тимчасовий каталог використовуючи шаблон %s" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s: Каталог не очищується: не вдалося виконати stat" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s: Каталог знаходиться на іншому пристрої: не очищується" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Стирання %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "Обидві опції -%s і -%s вимагають доступу до стандартного входу" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Невірний формат архіву" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "Формат архіву є несумісним з розширеними властивостями GNU" + +#: src/tar.c:241 +#, 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:334 +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:343 +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:369 +msgid "Main operation mode:" +msgstr "Режими роботи:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "вивести вміст архіву" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "витягнути файли з архіву" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "створити новий архів" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "порівняти файли в архіві з файлами у файлової системі" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "долучити файли до існуючого архіву" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "долучати тільки такі файли, що є новішими за їх копії в архіві" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "долучити архів до архіву" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "видалити файли з архіву (не на стрічці!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "перевірити мітку тому та вийти" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Модифікатори режиму роботи:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "заощаджувати простір під час зберігання розсіяних файлів" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "ГОЛОВНИЙ[.ДРУГОРЯДНИЙ]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "встановлює версію формату розсіяних файлів (вмикає --sparse)" + +# FIXME: incremental +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "обробка старого формату інкрементного архіву GNU" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "ФАЙЛ" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "обробка нового формату інкрементного архіву GNU" + +# FIXME: хммм... +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "ігнорувати помилки читання файлів" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "ЧИСЛО" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "архів підтримує операцію seek" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Керування перезаписом:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "перевірити архів після запису в нього" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "видаляти файли після додавання до архіву" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "не заміняти існуючи файли під час витягування" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "не заміняти існуючи файли що є новішими за їх копії у архіві" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "перезаписувати існуючі файли під час витягування" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "видаляти кожний файл перед витягуванням його копії" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "спорожняти старий каталог перед витягуванням його копії з архіву" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "зберігати мета-дані існуючих каталогів" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"перезаписувати метадані існуючих каталогів під час витягування (типово)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Вибір вихідного потоку:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "витягувати файли у стандартний вивід" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "передавати витягнуті файли до стандартного вводу іншої програми" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "ігнорувати коди завершення процесів-нащадків" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "вважати ненульовий код завершення нащадка помилкою" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Обробка атрибутів файлу:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "встановлення вказаного користувача власником доданих файлів" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "встановлення групи з вказаною назвою групою власника доданих файлів" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "ДАТА-АБО-ФАЙЛ" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "встановлення часу останньої зміни доданих файлів" + +# Ну, і чому це CHANGES?? +#: src/tar.c:473 +msgid "CHANGES" +msgstr "ПРАВА" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "встановлення вказаних символічно прав доступу для доданих файлів" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "МЕТОД" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "не витягувати час модифікації файлів" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "витягувати назву власника файлів" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "стати власником витягнутих файлів" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "завжди використовувати числа замість назв власника/групи" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"встановлювати права доступу згідно з даними архіву (типово для супер-" +"користувача)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"встановлювати права доступу згідно зі значенням umask (типово для звичайного " +"користувача)" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "витягувати файли у порядку їх з'явлення в архіві" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "те ж, що -p -s разом" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"затримати встановлення часу модифікації та прав доступу до каталогів до " +"кінця витягування" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "відмінити дії опції --delay-directory-restore" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Вибір та зміна пристрою:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "АРХІВ" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "використовувати вказаний файл або пристрій" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "файл архіву є локальним, навіть якщо його назва містить двокрапку" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "використовувати вказану команду замість rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "використовувати вказану команду замість rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "визначає пристрой та густину" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "створити, виводити зміст або витягувати файли з багатотомного архіву" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "змінити стрічку після запису ЧИСЛА x 1024 байтів" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "запускати сценарій наприкінці кожної стрічки (вмикає -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "використовувати/обновляти номер тому у ФАЙЛІ" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "Блокування пристрою:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "ЧИСЛО-БЛОКІВ" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "розмір запису ЧИСЛО-БЛОКІВ x 512 байтів" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "встановити розмір запису у блоках по 512 байтів" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "ігнорувати нульові блоки в архіві (звичайно вказують кінець файлу)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "розбивати на блоки під час читання (для каналів 4.2BSD)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "Вибір формату архіву:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "ФОРМАТ" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "створити архів у вказаному форматі" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "ФОРМАТ будь-який з наступних:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "старий формат V7" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "формат GNU, сумісний з версією tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "формат GNU, сумісний з версією tar 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "формат POSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "формат POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "те ж, що і pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "те ж, що і --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "те ж, що і --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "ключове_слово[[:]=значення][,ключове_слово[[:]=значення], ...]\"" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "керування ключовими словами pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "ТЕКСТ" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" +"створити архів з назвою тому \"ТЕКСТ\". Під час виводу змісту або " +"витягування, використовувати ТЕКСТ як шаблон пошуку тому" + +#: src/tar.c:592 +msgid "Compression options:" +msgstr "Опції стиснення:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "вибирати програму стиснення за суфіксом архіву" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "використовувати bzip2 для стиснення/розтискання архіву" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "використовувати gzip для стиснення/розтискання архіву" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "використовувати compress для стиснення/розтискання архіву" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "використовувати lzma для стиснення/розтискання архіву" + +#: src/tar.c:606 +msgid "PROG" +msgstr "ПРОГРАМА" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "використовувати ПРОГРАМУ для стиснення/розтискання архіву" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "Вибір файлів:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "долучити ФАЙЛ до архіву (корисне, якщо його назва починається з -)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "КАТАЛОГ" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "перейти до вказаного каталогу" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "читати назви файлів для додання/витягування з вказаного файла" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" +"файл, вказаний з опцією -T, містить назви, відокремлені нульовими символами. " +"Ця опція вимикає -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "усувати цитування з назв файлів прочитаних за допомогою -T (типово)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "не усувати цитування з назв файлів прочитаних за допомогою -T" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "ШАБЛОН" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "не обробляти файли, назви яких відповідають вказаному шаблону" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "виключити назви що відповідають шаблонам, вказаним у файлі" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"не архівувати файли в каталогах, що містять CACHEDIR.TAG, з винятком самого " +"файлу" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "не архівувати жодні файли в каталогах, що містять CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "не архівувати каталоги, що містять CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" +"не архівувати файли в каталогах, що містять ФАЙЛ, з винятком самого файлу" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "не архівувати жодні файли в каталогах, що містять ФАЙЛ" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "не архівувати каталоги, що містять ФАЙЛ" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "не архівувати каталоги систем керування версіями" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "не заходити автоматично у каталоги" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "залишатися у локальної файлової системі під час створення архіву" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "рекурсивно проходити каталоги (типово)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "не видаляти початкову косу риску `/' з назв файлів" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "Йти за символьними посиланнями: долучати файли, на яки вони вказують" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "Йти за жорсткими посиланнями: долучати файли, на яки вони вказують" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "НАЗВА-ФАЙЛУ" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "починати обслуговування архіву з вказаного файлу" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "долучати тільки такі файли, що є новіші за вказану дату або файл" + +#: src/tar.c:664 +msgid "DATE" +msgstr "ДАТА" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "порівнювати тільки дату і час зміни даних" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "РЕЖИМ" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "перед видаленням створювати резервні файли у вказаному режимі" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "РЯДОК" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"перед видаленням створювати резервні файли з указаним суфіксом (типово '~', " +"якщо не перевизначено змінною середовища SIMPLE_BACKUP_SUFFIX)" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "Перетворювання назв файлів:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "видаляти вказане ЧИСЛО компонентів з початку назв файлів" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "ВИРАЗ" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "перетворювати назви файлів за допомогою вказаного виразу заміни" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Керування порівнюванням назв (впливає на взірці як вилучення, так і " +"долучення):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "шаблони ігнорують відмінності у регістрі символів" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "порівнювати шаблони з назвами файлів починаючи від початку назви" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" +"порівнювати шаблони з назвами файлів починаючи від будь-якого / (типово)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "шаблони враховують регістр (типово)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "користатися шаблонами (типово для вилучення)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "порівнювати назви буквально" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "шаблони не стосуються до '/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "шаблони стосуються до '/' (типово)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Інформативний вивід:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "виводити докладну інформацію про оброблені файли" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "виводити контрольне повідомлення кожне ЧИСЛО записів (типово 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "ДІЯ" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "виконати вказану дію у контрольному пункті" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "виводити повідомлення якщо до архіву було додано не всі посилання" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "СИГНАЛ" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "друкувати час модифікації файлів у UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "виводити детальну інформацію у ФАЙЛ" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "попереджувати кожне повідомлення номером блоку в архіві" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "Запитувати підтвердження кожної дії" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "вивести типові налаштування" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" +"під час виведення змісту або витягування файлів друкувати назви каталогів що " +"не відповідають критеріям пошуку" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "показувати перетворені назви файлів" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "СТИЛЬ" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "встановити стиль цитування; дозволені стилі див. нижче" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "цитувати також вказані символи" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "вимкнути цитування вказаних символів" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Опції сумісності:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" +"під час створення архіву, те ж саме, що і --old-archive. Під час " +"витягування, те ж саме, що --no-same-owner" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Інші опції:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "заборонити користування деякими потенційно небезпечними опціями" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "Не можна вказувати більш ніж одну з опцій `-Acdtrux'" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "Опції стиснення конфліктують одна з другою" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Невідомий тип файла %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Не знайдено файл-зразок дати" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "Використовується %s замість невідомого формату дати %s" + +#: src/tar.c:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Опція %s: Дату `%s' сприйнято як %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: перелік файлів уже прочитано" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: прочитана назва файла містить нульовий символ" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Допустимими аргументами опції --quoting-style є:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"Типові налаштування *цієї* копії програми:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Неправильний фактор блокування" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "" +"Попередження: опція -I не підтримується. Можливо ви маєте на увазі -j або -T?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "Неправильна довжина стрічки" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Більш ніж одна гранична дата" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Недійсна версія формату розсіяних файлів" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "опція --atime-preserve='system' не підтримується на цій платформі" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "аргумент --checkpoint мусить бути цілим числом" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Невірна група" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Невірний формат прав доступу" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Невірне число" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Невірний власник" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Невірний розмір запису" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "Розмір запису має ділитися на %d." + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "Невірна кількість елементів" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Дозволяється лише одна опція --to-command" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Невірний аргумент вказання густини: `%s'" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Невідома густина: `%c'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "Опції `-[0-7][lmh]' не підтримуються *цією* версією tar" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[ФАЙЛ]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "Стара опція `%c' потребує аргументу" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "вказання --occurrence не має сенсу без вказання переліку файлів" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "" +"опцію --occurrence не можна використовувати у зазначеному режимі роботи" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "Вказання декількох файлів потребує вказання опції `-M'" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Не можна використовувати --listed-incremental разом з --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Не можна перевіряти багатотомні архіви" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Не можна перевіряти стиснені архіви" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "Не можна використовувати стиснення багатотомних архівів" + +#: src/tar.c:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Не можна з'єднувати стиснені архіви" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "Опція --pax-option використовується тільки з архівами у форматі POSIX" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "Полохливо відмовляюся створювати пустий архів" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "Опції `-Aru' не сумісні з `-f -'" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "Необхідно вказати одну з опцій `-Acdtrux'" + +#: src/tar.c:2483 +#, 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: непарна кількість значень" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: недійсний ліміт часу" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: незнана дія" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "запис" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Контрольна відмітка читання %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile - програма обробки файлів з набору перевірок пакету GNU paxutils\n" +"Перелік опцій:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Опції створювання файлів:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "РОЗМІР" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Створити файл заданого розміру" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Писати у вказаний файл, замість стандартного виводу" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Читати назви файлів з вказаного файлу" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" +"файл, вказаний з опцією -T, містить назви, відокремлені нульовими символами" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"Взірець заповнення файла: 'default' (типовий) або 'zeros' (заповнення нулями)" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Розмір блока розсіяного файла" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "Створити розсіяний файл. Решта аргументів дає мапу файла." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "ЗСУВ" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Перед записом даних перейти до вказаного зсуву в файлі" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Статистика файлів:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "Виводити вміст структури stat для кожного файла. Типовий формат: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Синхронне виконання:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Виконати вказану команду. Для ужитку з опціями --cut, --append або --touch" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" +"Виконати вказану операцію (див. нижче) по досягненню контрольної відмітки" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Встановлює дати для наступної опції --touch" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Друкувати виконані операції і код завершення команди" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Операції синхронного виконання. Виконуються по досягненню контрольної " +"відмітки, вказаної опцією --checkpoint. " + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Обрізати файл до розміру, вказаного попередньою опцією --length (до 0, якщо " +"її не було вказано)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "Додати до файла кількість байтів, вказану попередньою опцією --length." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Поновити час доступу та модифікації файла" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Виконати КОМАНДУ" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Невірний розмір: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Число поза допустимими межами: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Від'ємний розмір: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "збій виконання stat(%s)" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Помилка розбору числа біля `%s'" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Невідомий формат дати" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[АРГУМЕНТИ...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "не вдається відкрити `%s'" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "не вдається виконати lseek" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "назва файла містить нульовий символ" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"неможливо створювати розсіяні файли на стандартному виводі; користайтеся " +"опцією --file" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "недійсна маска (біля `%s')" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Невідоме поле `%s'" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "не вдається встановити час файла `%s'" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Команда завершилася успішно\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Команда завершилася з кодом %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Команда завершилася по сигналу %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Команда зупинилася по сигналу %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Команда скинула відбиток пам'яті\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Команда завершилася\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "опція --stat вимагає назв файлів" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "забагато аргументів" + +#~ msgid "block size" +#~ msgstr "розмір блока" + +#~ msgid "[.]NUMBER" +#~ 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..41a118f Binary files /dev/null and b/po/vi.gmo differ diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..ac23dd0 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,2589 @@ +# Vietnamese translation for Tar. +# Copyright © 2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the tar-1.19.90 package. +# Phan Vinh Thinh , 2005. +# Clytie Siddall , 2007-2008. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.19.90\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2008-02-09 11:37+1030\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \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: LocFactoryEditor 1.7b1\n" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "tham số không thích hợp %s cho %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "tham số không rõ ràng %s cho %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Các tham số đúng là:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "ARGP_HELP_FMT: giá trị %s nhỏ hÆ¡n hay bằng %s" + +#: lib/argp-help.c:220 +#, 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:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: tham số ARGP_HELP_FMT phải là số dÆ°Æ¡ng" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: Tham số không rõ ARGP_HELP_FMT" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "Có rác trong ARGP_HELP_FMT: %s" + +#: lib/argp-help.c:1246 +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:1639 +msgid "Usage:" +msgstr "Sá»­ dụng:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " hoặc: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [TÙY CHỌN...]" + +#: lib/argp-help.c:1682 +#, 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:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "Báo cáo lỗi tới %s.\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "Lỗi hệ thống không rõ" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "hiển thị trợ giúp này" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "hiển thị cách sá»­ dụng ngắn gọn" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "TÊN" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "đặt tên chÆ°Æ¡ng trình" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "GIÂY" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "treo trong vòng GIÂY giây (mặc định 3600)" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "In ra phiên bản chÆ°Æ¡ng trình" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "(LỖI CHƯƠNG TRÌNH) Không rõ phiên bản !?" + +#: lib/argp-parse.c:611 +#, c-format +msgid "%s: Too many arguments\n" +msgstr "%s: Quá nhiều đối số\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "(LỖI CHƯƠNG TRÌNH) Tùy chọn nên được nhận ra !?" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "lỗi ghi" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, 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:575 lib/getopt.c:579 +#, 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:588 lib/getopt.c:593 +#, 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:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, 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:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: tùy chọn không nhận ra `--%s'\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, 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:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: tùy chọn không cho phép -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: tùy chọn không đúng -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, 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:892 lib/getopt.c:908 +#, 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:932 lib/getopt.c:950 +#, 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/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "cạn bộ nhớ" + +#: lib/openat-die.c:33 +#, c-format +msgid "unable to record current working directory" +msgstr "Không thể thu thÆ° mục làm việc hiện thời" + +#: lib/openat-die.c:46 +#, c-format +msgid "failed to return to initial working directory" +msgstr "không trở được về thÆ° mục làm việc đầu tiên" + +#. 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 +#, 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, trong khi đọc %lu byte" + +#: 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: Cảnh báo: Lỗi đọc tại byte %s, trong khi đọ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:155 +#, 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:156 +#, 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:169 +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:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "'" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "^[cCyY]" + +#: lib/rpmatch.c:72 +msgid "^[nN]" +msgstr "^[kKnN]" + +#: 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 "đầu vào tiêu chuẩn" + +#: lib/rtapelib.c:306 +#, c-format +msgid "stdout" +msgstr "đầu ra tiêu chuẩn" + +#: lib/rtapelib.c:512 +#, c-format +msgid "Cannot execute remote shell" +msgstr "Không thể chạy shell ở xa" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "©" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" +"\n" +"Giấy phép GPL pb3+: Giấy phép Công cộng GNU phiên bản 3 và sau:\n" +"\n" +"Đây là phần mềm tá»± do : bạn có quyền thay đổi và phát hành lại nó.\n" +"KHÔNG CÓ BẢO HÀNH GÌ CẢ, với điều kiện được pháp luật cho phép.\n" +"\n" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "Tác giả: %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "Tác giả: %s và %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "Tác giả: %s, %s và %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s\n" +"và %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s và %s.\n" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s, %s và %s.\n" + +#. TRANSLATORS: Each %s denotes an author name. +#. You can use line breaks, estimating that each author name occupies +#. ca. 16 screen columns and that a screen line has ca. 80 columns. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s, %s, %s và %s.\n" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s, %s, %s, %s\n" +"và %s.\n" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s và %s.\n" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +msgstr "" +"Tác giả: %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s và các người khác.\n" + +#: rmt/rmt.c:142 +msgid "Input string too long" +msgstr "Chuỗi gõ quá dài" + +#: rmt/rmt.c:161 +msgid "Number syntax error" +msgstr "Lỗi cú pháp con số" + +#: 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 +#, 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 từ, 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 +msgid "Seek offset error" +msgstr "Lỗi hiệu số tìm nÆ¡i" + +#: 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +msgid "Total bytes written" +msgstr "Tổng số byte đã ghi" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "Tổng số byte đã đọc" + +#: src/buffer.c:344 +#, c-format +msgid "Total bytes deleted: %s\n" +msgstr "Tổng số byte đã xoá: %s\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(đường ống)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "Giá trị cho record_size không đúng" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "Không đưa ra tên tập tin lÆ°u trữ" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "Không kiểm tra được tập tin lÆ°u trữ stdin/stdout" + +#: src/buffer.c:517 +#, 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:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "Không cập nhật được lÆ°u trữ đã nén" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "Tại đầu băng ghi âm, thoát ra bây giờ" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "Quá nhiều lỗi, đang thoát" + +#: src/buffer.c:678 +#, 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ữ" + +#: src/buffer.c:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "Khối chÆ°a sắp hàng (%lu byte) trong tập tin lÆ°u trữ" + +#: src/buffer.c:771 +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:803 +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:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s: chứa số thứ tá»± khối không đúng" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "Số thứ tá»± khối thừa ra" + +#: src/buffer.c:909 +#, 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:915 +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:920 src/buffer.c:952 +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:934 +#, 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 tin tiếp theo (và theo sau)\n" +" q Dừng tar\n" +" y hay dòng mới\tTiếp tục lại chạy tiến trình\n" + +#: src/buffer.c:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr " ! Tạo một trình bao con\n" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr " ? In ra danh sách này\n" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "Không có khối mới; đang thoát.\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "ChÆ°a ghi rõ tên tập tin: hãy thá»­ lại.\n" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "Gõ sai. (Gỏ ? để xem trợ giúp.)\n" + +#: src/buffer.c:1044 +#, c-format +msgid "%s command failed" +msgstr "Câu lệnh %s không thành công" + +#: src/buffer.c:1199 +#, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s có thể tiếp tục trên khối tin này: phần đầu chứa tên bị cắt ngắn" + +#: src/buffer.c:1203 +#, 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:1217 +#, 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:1227 +msgid "This volume is out of sequence" +msgstr "Khối này vượt quá dãy cho phép" + +#: src/buffer.c:1273 +#, 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:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "Khối %s không tÆ°Æ¡ng ứng %s" + +#: src/buffer.c:1372 +#, 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 nên bị cắt " +"ngắn" + +#: 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" + +#: 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:1329 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 +#, c-format +msgid "%s: Unknown file type `%c', diffed as normal file" +msgstr "" +"%s: không rõ dạng tập tin '%c' nên khác biệt (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/compare.c:612 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/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s: chứa một thẻ thÆ° mục ghi nhớ tạm %s: %s" + +#: src/create.c:272 +#, 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:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "giá trị %s vượt quá %s phạm vi %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "Đang tạo phần đầu hệ tám âm" + +#: src/create.c:624 src/create.c:687 +#, 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:634 +#, 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:661 +#, 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:1076 +#, 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:1177 +#, 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:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "chÆ°a đổ nội dung" + +#: src/create.c:1361 +#, 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:1464 +#, c-format +msgid "Missing links to %s.\n" +msgstr "Thiếu liên kết tới '%s'.\n" + +#: src/create.c:1535 +#, 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:1543 +#, 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:1573 +#, 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:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "chÆ°a đổ thÆ° mục" + +#: src/create.c:1659 +#, 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:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s: socket bị lờ đi" + +#: src/create.c:1744 +#, 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 +#, c-format +msgid "%s: time stamp %s is %s s in the future" +msgstr "%s: tem thời gian %s là %s 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 +msgid "Unexpected long name header" +msgstr "Phần đầu tên dài không mong đợi" + +#: src/extract.c:1159 +#, c-format +msgid "%s: Unknown file type `%c', extracted as normal file" +msgstr "%s: Dạng tập tin không rõ '%c' nên giải nén nhÆ° tập tin thông thường" + +#: src/extract.c:1184 +#, c-format +msgid "Current %s is newer or same age" +msgstr "%s hiện thời là mới hay hay cùng thời" + +#: 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 +#, c-format +msgid "Cannot rename %s to %s" +msgstr "Không thể đổi tên %s 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:390 src/incremen.c:430 +#, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s: Đã đổi tên thÆ° mục từ %s" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s: Đã đổi tên thÆ° mục" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s: ThÆ° mục là mới" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "Tem thời gian không đúng" + +#: src/incremen.c:889 +msgid "Invalid modification time (seconds)" +msgstr "Thời gian sá»­a đổi không hợp lệ (giây)" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "Thời gian sá»­a đổi không hợp lệ (nanô-giây)" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "Số thứ tá»± thiết bị không đúng" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "Số thứ tá»± chỉ mục inode sai" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "Trường quá dài trong khi đọc tập tin ảnh chụp" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "Lỗi đọc trong tập tin ảnh chụp" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +msgid "Unexpected EOF in snapshot file" +msgstr "Kết thúc tập tin (EOF) không mong đợi trong tập tin ảnh chụp" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "Giá trị trường không mong đợi trong tập tin ảnh chụp" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "Thiếu dấu giới hạn mục ghi" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "Định dạng tập tin dần sai" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "Phiên bản định dạng dần không được hỗ trợ : %" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "ThÆ° mục đổ dạng sai: mong đợi « %c » còn tìm %#3o" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "ThÆ° mục đổ dạng sai: « X » đã nhân đôi" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "ThÆ° mục đổ dạng sai: tên rỗng trong « R »" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "ThÆ° mục đổ dạng sai: « T » không có « R » đi trướ" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "ThÆ° mục đổ dạng sai: tên rỗng trong « T »" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "ThÆ° mục đổ dạng sai: mong đợi « %c » còn tìm kết thúc dữ liệu" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "ThÆ° mục đổ dạng sai: « X » không bao giờ dùng" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "Không thể tạo thÆ° mục tạm bằng mẫu %s" + +#: src/incremen.c:1543 +#, 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:1556 +#, 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:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s: Đang xóa %s\n" + +#: src/incremen.c:1569 +#, 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: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 +#, c-format +msgid "Archive value %s is out of %s range %s..%s" +msgstr "Giá trị lÆ°u trữ %s vượt quá phạm vi %s (%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 "Tên tập tin chứa ký tá»± khớp mẫu." + +#: src/names.c:601 +msgid "use --wildcards to enable pattern matching, or --no-wildcards to" +msgstr "Hãy dùng « --wildcards » để hiệu lá»±c khớp mẫu," + +#: src/names.c:603 +msgid "suppress this warning." +msgstr "hoặc dùng « --no-wildcards » để thu hồi cảnh báo này." + +#: 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:79 +#, 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:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s: Định dạng lÆ°u trữ không đúng" + +#: src/tar.c:180 +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:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" +"Không rõ kiểu dáng trích dẫn « %s ». Hãy thá»­ lệnh « %s --quoting-style=help » " +"để xem danh sách." + +#: src/tar.c:334 +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 " +"từ 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 kho.tar foo bar # Tạo kho.tar từ các tập tin foo và bar.\n" +" tar -tvf kho.tar # Liệt kê chi tiết tất cả các tập tin có trong " +"kho.tar.\n" +" tar -xf kho.tar # Giải phóng tất cả các tập tin ra từ kho.tar.\n" + +#: src/tar.c:343 +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 "" +"Hậ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,\n" +"các giá trị là:\n" +"\n" +" none, off \tkhông bao giờ tạo lÆ°u trữ\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:369 +msgid "Main operation mode:" +msgstr "Chế độ thao tác chính:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "liệt kê nội dung của một lÆ°u trữ" + +#: src/tar.c:374 +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:377 +msgid "create a new archive" +msgstr "tạo một lÆ°u trữ mới" + +#: src/tar.c:379 +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:382 +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:384 +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:386 +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:389 +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:391 +msgid "test the archive volume label and exit" +msgstr "thá»­ nhãn khối tin lÆ°u trữ rồi thoát" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "Từ khóa bổ nghÄ©a thao tác:" + +#: src/tar.c:399 +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:400 +msgid "MAJOR[.MINOR]" +msgstr "CHÍNH[.PHỤ]" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "đặt phiên bản của định dạng sparse cần dùng (ngụ ý « --sparse »)" + +#: src/tar.c:403 +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:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "TẬP TIN" + +#: src/tar.c:405 +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:407 +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:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "SỐ" + +#: src/tar.c:409 +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:\n" +" --delete\t\txoá\n" +" --diff\t\tkhác biệt\n" +" --extract \tgiải nén\n" +" --list \t\tliệt kê\n" +"và khi đưa ra một danh sách tập tin hoặc trên dòng lệnh hoặc qua tùy chọn « -" +"T ».\n" +"Mặc định SỐ có giá trị bằng 1." + +#: src/tar.c:415 +msgid "archive is seekable" +msgstr "có thể tìm nÆ¡i trong kho lÆ°u trữ" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "Điều khiển ghi đè:" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "thá»­ kiểm tra lÆ°u trữ sau khi ghi nó" + +#: src/tar.c:431 +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:433 +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:435 +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:437 +msgid "overwrite existing files when extracting" +msgstr "ghi đè lên những tập tin đã có khi giải phóng" + +#: src/tar.c:439 +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:441 +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:443 +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:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" +"ghi đè lên siêu dữ liệu của những thÆ° mục đã có khi giải phóng (mặc định)" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "Chọn luồng xuất:" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "giải phóng tập tin ra đầu ra tiêu chuẩn" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "CÂU LỆNH" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "gá»­i các tập tin đã giải nén qua ống dẫn cho chÆ°Æ¡ng trình khác" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "bỏ qua mã thoát của tiến trình con" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "xá»­ lý mã thoát khác số không của tiến trình con nhÆ° lỗi" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "Điều khiển thuộc tính tập tin:" + +#: src/tar.c:468 +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:470 +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:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "NGÀY-CỦA-TẬP-TIN" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "đặt từ DATE-OR-FILE thời gian mtime cho các tập tin đã thêm" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "THAY ĐỔI" + +#: src/tar.c:474 +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:476 +msgid "METHOD" +msgstr "PHƯƠNG PHÁP" + +#: src/tar.c:477 +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 "" +"bảo tồn các thời gian truy cập của tập tin đã đổ, hoặc bằng cách phục hồi " +"thời gian sau khi đọc (PHƯƠNG PHÁP='replace'; mặc định), hoặc bằng cách " +"không đặt thời gian nhÆ° vậy (PHƯƠNG PHÁP='system')" + +#: src/tar.c:481 +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:483 +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:485 +msgid "extract files as yourself" +msgstr "giải phóng tập tin nhÆ° tá»± bạn" + +#: src/tar.c:487 +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:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" +"cÅ©ng giải nén thông tin về quyền truy cập tập tin (mặc định cho siêu người " +"dùng)" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" +"áp dụng umask của người dùng khi giải nén quyền truy cập ra từ kho lÆ°u trữ " +"(mặc định cho người dùng bình thường)" + +#: src/tar.c:495 +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:498 +msgid "same as both -p and -s" +msgstr "giống nhÆ° khi có hai tùy chọn -p và -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" +"hoãn đến kết thúc tiến trình giải nén việc đặt thời gian sá»­a đổi và quyền " +"truy cập các thÆ° mục đã giải nén" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "hủy hiệu ứng của tùy chọn « --delay-directory-restore »" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "Lá»±a chọn và chuyển đổi thiết bị:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "LƯU TRá»®" + +#: src/tar.c:511 +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:513 +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:515 +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:517 +msgid "use remote COMMAND instead of rsh" +msgstr "sá»­ dụng CÂU LỆNH từ xa thay cho rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "chỉ ra ổ và mật độ ghi dữ liệu" + +#: src/tar.c:535 +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:537 +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:539 +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:542 +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:547 +msgid "Device blocking:" +msgstr "Khối của thiết bị:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "KHỐI" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "KHỐI X 512 byte cho mỗi bản ghi" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "SỐ byte cho mỗi mục ghi, bội số cho 512" + +#: src/tar.c:554 +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:556 +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:561 +msgid "Archive format selection:" +msgstr "Lá»±a chọn định dạng lÆ°u trữ:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "ĐỊNH DẠNG" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "tạo lÆ°Æ° trữ với định dạng đưa ra" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "ĐỊNH DẠNG là một trong số sau:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "định dạng tar V7 cÅ©" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "định dạng GNU theo nhÆ° tar <= 1.12" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "định dạng tar GNU 1.13.x" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "định dạng PoSIX 1003.1-1988 (ustar)" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "định dạng POSIX 1003.1-2001 (pax)" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "bằng pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "giống nhÆ° --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "giống nhÆ° --format=posix" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "từ_khoá[[:]=giá_trị][,từ_khoá[[:]=giá_trị]]..." + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "từ khóa điều khiển pax" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "VĂN BẢN" + +#: src/tar.c:587 +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 tin VĂN BẢ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 glob cho tên khối tin" + +#: src/tar.c:592 +msgid "Compression options:" +msgstr "Tùy chọn nén:" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "dùng hậu tố lÆ°u trữ để xác định chÆ°Æ¡ng trình nén" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "lọc lÆ°u trữ qua bzip2" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "lọc lÆ°u trữ qua gzip" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "lọc lÆ°u trữ qua compress" + +#: src/tar.c:605 +msgid "filter the archive through lzma" +msgstr "lọc lÆ°u trữ qua lzma" + +#: src/tar.c:606 +msgid "PROG" +msgstr "TRÌNH" + +#: src/tar.c:607 +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:612 +msgid "Local file selection:" +msgstr "Lá»±a chọn tập tin nội bộ:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" +"thêm vào kho lÆ°u trữ TẬP TIN đã cho (có ích nếu tên nó bắt đầu với dấu gạch)" + +#: src/tar.c:616 +msgid "DIR" +msgstr "THƯ MỤC" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "thay đổi tới thÆ° mục THƯ MỤC" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "lấy các tên tập tin cần giải phóng hay tạo từ TẬP TIN" + +#: src/tar.c:621 +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:623 +msgid "unquote filenames read with -T (default)" +msgstr "hủy trích dẫn các tên tập tin được đọc bằng « -T » (mặc định)" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "đừng hủy trích dẫn các tên tập tin được đọc bằng « -T »" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "MẪU" + +#: src/tar.c:627 +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:629 +msgid "exclude patterns listed in FILE" +msgstr "loại trừ những mẫu liệt kê trong TẬP TIN" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" +"loại trữ nội dung của thÆ° mục chứa thẻ ghi nhớ tạm CACHEDIR.TAG, trừ tập tin " +"thẻ chính nó" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" +"loại trữ mọi thứ đều nằm dưới thÆ° mục chứa thẻ ghi nhớ tạm CACHEDIR.TAG" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "loại trữ thÆ° mục chứa thẻ ghi nhớ tạm CACHEDIR.TAG" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "loại trữ nội dung của thÆ° mục chứa TẬP TIN, trừ TẬP TIN chính nó" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "loại trữ mọi thứ đều nằm dưới thÆ° mục chứa TẬP TIN" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "loại trữ thÆ° mục chứa TẬP TIN" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "trừ thÆ° mục của hệ thống điều khiển phiên bản (v.d. « .svn »)" + +#: src/tar.c:648 +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:650 +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:652 +msgid "recurse into directories (default)" +msgstr "đệ quy vào các thÆ° mục (mặc định)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "đừng bỏ `/' ở đầu tên tập tin" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "theo liên kết tượng trÆ°ng; lÆ°u trữ và đổ tập tin tới đó nó chỉ" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "theo liên kết cứng; lÆ°u trữ và đổ tập tin tới đó nó chỉ" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "TÊN-THÀNH-VIÊN" + +#: src/tar.c:660 +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:662 +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:664 +msgid "DATE" +msgstr "NGÀY" + +#: src/tar.c:665 +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:666 +msgid "CONTROL" +msgstr "ĐIỀU KHIỂN" + +#: src/tar.c:667 +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:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "CHUỖI" + +#: src/tar.c:669 +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:674 +msgid "File name transformations:" +msgstr "Chuyển dạng tên tập tin:" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "bỏ đi SỐ thành phần đứng đầu ra tên tập tin khi giải nén" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "BIỂU THỨC" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "dùng « sed replace BIỂU THỨC » để chuyển dạng tên tập tin" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" +"Tùy chọn khớp tên tập tin (có tác động mẫu kiểu cả hai loại trừ và bao gồm):" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "không phân biệt chữ hoa/thường" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "mẫu tÆ°Æ¡ng ứng với bắt đầu tên tập tin" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "mẫu tÆ°Æ¡ng ứng sau bất kỳ / nào (mặc định để loại trừ)" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "khớp có phân biệt chữ hoa/ thường (mặc định)" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "dùng ký tá»± đại diện (mặc định để loại trừ)" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "khớp chuỗi nghÄ©a chữ" + +#: src/tar.c:699 +msgid "wildcards do not match `/'" +msgstr "ký tá»± đại diện không tÆ°Æ¡ng ứng '/'" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "ký tá»± đại diện tÆ°Æ¡ng ứng '/' (mặc định để loại trừ)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "Dữ liệu kết quả có tính thông tin:" + +#: src/tar.c:709 +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:711 +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 mục ghi thứ SỐ (mặc định 10)" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "HÀNH_ĐỘNG" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "thá»±c hiện HÀNH_ĐỘNG này ở mỗi điểm kiểm" + +#: src/tar.c:717 +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:718 +msgid "SIGNAL" +msgstr "TÍN HIỆU" + +#: src/tar.c:719 +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 "" +"in ra tổng số byta sau khi xá»­ lý kho lÆ°u trữ ;\n" +"có đối số thì in ra tổng số byte khi nhận được TÍN HIỆU này; tín hiệu được " +"phép:\n" +"SIGHUP, SIGQUIT, SIGINT, SIGUSR1, SIGUSR2;\n" +"cÅ©ng chấp nhận tên không có tiền tố « SIG »." + +#: src/tar.c:724 +msgid "print file modification dates in UTC" +msgstr "in ra ngày sá»­a đổi tập tin theo UTC" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "gá»­i kết quả chi tiết tới TẬP TIN" + +#: src/tar.c:728 +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:730 +msgid "ask for confirmation for every action" +msgstr "hỏi xác nhận trước mỗi hành động" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "hiển thị các giá trị mặc định của tar" + +#: src/tar.c:735 +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:737 +msgid "show file or archive names after transformation" +msgstr "hiển thị các tên tập tin hay kho lÆ°u trữ sau khi chuyển dạng" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "KIỂU DÁNG" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" +"đặt kiểu dáng trích dẫn tên; xem dưới để tìm các giá trị KIỂU DÁNG hợp lệ" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "cÅ©ng trích dẫn các ký tá»± của CHUỖI" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "tắt trích dẫn các ký tá»± của CHUỖI" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "Tùy chọn tÆ°Æ¡ng thích:" + +#: src/tar.c:753 +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "" +"khi tạo, giống nhÆ° « --old-archive »\n" +"khi giải phóng, giống nhÆ° « --no-same-owner »" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "Những tùy chọn khác:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "tắt sá»­ dụng một số tùy chọn có thể gây tai hại" + +#: src/tar.c:899 +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:909 +msgid "Conflicting compression options" +msgstr "Mâu thuẫn giữa các tùy chọn nén" + +#: src/tar.c:965 +#, c-format +msgid "Unknown signal name: %s" +msgstr "Không rõ tên tín hiệu : %s" + +#: src/tar.c:989 +msgid "Date sample file not found" +msgstr "Không tìm thấy tập tin mẫu ngày tháng" + +#: src/tar.c:997 +#, 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:1022 +#, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "Tùy chọn %s: đang xá»­ lý ngày tháng « %s » nhÆ° %s" + +#: src/tar.c:1096 +#, c-format +msgid "%s: file list already read" +msgstr "%s: danh sách tập tin đã được đọc" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "%s: đọc tên tập tin chứa ký tá»± vô giá trị" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "Các đối số thích hợp với tùy chọn « --quoting-style »:" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"tar *này* mặc định tới:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "Nhân tố khối không đúng" + +#: src/tar.c:1340 +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:1373 +msgid "Invalid tape length" +msgstr "Chiều dài băng ghi âm không đúng" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "Có nhiều ngày bắt đầu" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "Giá trị phiên bản sparse không hợp lệ" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "--atime-preserve='system' không được hỗ trợ trên nền tảng này" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "giá trị « --checkpoint » không phải số nguyên" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s: Nhóm không đúng" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "Đưa ra chế độ không đúng trên tùy chọn" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "Số không đúng" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "Chủ sở hữu không đúng" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "Kích thước bản ghi không đúng" + +#: src/tar.c:1797 +#, 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:1834 +msgid "Invalid number of elements" +msgstr "Số thứ tá»± của nguyên tố không đúng" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "Cho phép chỉ một tùy chọn « --to-command »" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "Tham số mật độ dạng sai: %s" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "Mật độ không rõ : « %c »" + +#: src/tar.c:1973 +#, 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:2008 +msgid "[FILE]..." +msgstr "[TẬP TIN]..." + +#: src/tar.c:2114 +#, 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:2196 +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:2202 +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:2232 +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:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "Không thể kết hợp --listed-incremental với --newer" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "Không thể kiểm tra lÆ°u trữ nhiều khối" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "Không thể kiểm tra lÆ°u trữ đã nén" + +#: src/tar.c:2275 +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:2281 +msgid "Cannot concatenate compressed archives" +msgstr "Không thể ghép nối các kho nén" + +#: src/tar.c:2293 +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:2318 +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:2343 +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:2432 +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:2483 +#, 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 +#, c-format +msgid "Keyword %s is unknown or not yet implemented" +msgstr "Từ khóa %s không rõ hoặc chÆ°a được thá»±c hiện" + +#: 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 +msgid "Malformed extended header: missing length" +msgstr "Phần đầu mở rộng dạng sai: thiếu chiều dài" + +#: src/xheader.c:506 +msgid "Extended header length is out of allowed range" +msgstr "Chiều dài phần đầu mở rộng ở ngoại phạm vi được phép" + +#: src/xheader.c:513 +#, c-format +msgid "Extended header length %*s is out of range" +msgstr "Chiều dài phần đầu mở rộng %*s ở ngoại phạm vi được phép" + +#: src/xheader.c:525 +msgid "Malformed extended header: missing blank after length" +msgstr "Phần đầu mở rộng dạng sai: 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 +msgid "Malformed extended header: missing newline" +msgstr "Phần đầu mở rộng dạng sai: thiếu dòng mới" + +#: src/xheader.c:576 +#, c-format +msgid "Ignoring unknown extended header keyword `%s'" +msgstr "Bỏ qua từ khoá phần đầu mở rộng không rõ « %s »" + +#: src/xheader.c:780 +#, c-format +msgid "Generated keyword/value pair is too long (keyword=%s, length=%s)" +msgstr "Cặp từ khoá/giá trị đã tạo ra quá dài (từ khoá=%s, chiều dài=%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 "Phần đầu mở rộng %s=%s ở ngoại phạm vi (%s..%s)" + +#: src/xheader.c:943 src/xheader.c:973 src/xheader.c:1287 +#, c-format +msgid "Malformed extended header: invalid %s=%s" +msgstr "Phần đầu mở rộng dạng sai: %s=%s không hợp lệ" + +#: src/xheader.c:1240 src/xheader.c:1265 src/xheader.c:1315 +#, c-format +msgid "Malformed extended header: excess %s=%s" +msgstr "Phần đầu mở rộng dạng sai: %s=%s thừa" + +#: src/xheader.c:1328 +#, c-format +msgid "Malformed extended header: invalid %s: unexpected delimiter %c" +msgstr "" +"Phần đầu mở rộng dạng sai: %s không hợp lệ: dấu giới hạn không mong đợi %c" + +#: src/xheader.c:1338 +#, c-format +msgid "Malformed extended header: invalid %s: odd number of values" +msgstr "Phần đầu mở rộng dạng sai: %s không hợp lệ: số giá trị lẻ" + +#: src/checkpoint.c:107 +#, c-format +msgid "%s: not a valid timeout" +msgstr "%s: không phải quá hạn hợp lệ" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "%s: không rõ hành động điểm kiểm" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "ghi" + +#: src/checkpoint.c:132 +msgid "read" +msgstr "đọc" + +#. 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/checkpoint.c:222 +#, c-format +msgid "Write checkpoint %u" +msgstr "Điểm kiểm tra ghi %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/checkpoint.c:228 +#, c-format +msgid "Read checkpoint %u" +msgstr "Điểm kiểm tra đọc %u" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" +"genfile thao tác các tập tin dữ liệu cho bộ tiện ích thá»­ paxutils của GNU.\n" +"TÙY CHỌN:\n" + +#: tests/genfile.c:126 +msgid "File creation options:" +msgstr "Tùy chọn tạo tập tin:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "KÍCH Cá» " + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "Tạo tập tin có KÍCH Cá»  đã cho" + +#: tests/genfile.c:130 +msgid "Write to file NAME, instead of standard output" +msgstr "Ghi vào tập tin TÊN, thay vào thiết bị gõ chuẩn" + +#: tests/genfile.c:132 +msgid "Read file names from FILE" +msgstr "Đọc các tên tập tin từ TẬP TIN" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "-T đọc tên kết thúc vô hiệu lá»±c" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" +"Điền vào tập tin bằng MẪU đã cho. MẪU là:\n" +" • default\t\tmặc định\n" +" • zeros\t\tcác số không" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "Kích cỡ của khối cho tập tin spare" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" +"Tạo ra tập tin sparse. Phần còn lại của dòng lệnh đưa ra sÆ¡ đồ tập tin." + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "HIỆU SỐ" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "Tìm nÆ¡i theo hiệu số đã cho trước khi ghi dữ liệu" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "Tùy chọn thống kê tập tin:" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "In ra kết xuất struct stat về mỗi tập tin đã cho. ĐỊNH DẠNG mặc định: " + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "Tùy chọn thá»±c hiện đồng thời:" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" +"Thá»±c hiện LỆNH đã cho. Có ích với « --checkpoint » (điểm kiểm tra) và một " +"của:\n" +" • --cut\t\tcất\n" +" • --append\tphụ thêm\n" +" • --touch\tsờ" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "Thá»±c hiện hành động đã cho (xem dưới) khi tới điểm kiểm tra SỐ" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "Đặt ngày tháng cho tùy chọn « -touch » kế tiếp" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "Hiển thị các điểm kiểm tra đã thá»±c hiện và trạng thái thoát của LỆNH" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" +"Các hành động thá»±c hiện đồng thời; được thá»±c hiện khi tới điểm kiểm tra có " +"số được ghi rõ bằng tùy chọn « --checkpoint »." + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" +"Cắt ngắn TẬP TIN thành kích cỡ được ghi rõ bằng tùy chọn « --length » trước " +"(không ghi rõ thì 0)" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" +"Phụ thêm KÍCH Cá»  byte vào TẬP TIN. KÍCH Cá»  được ghi rõ bằng tùy chọn « --" +"length » trước." + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "Cập nhật các thời gian truy cập và sá»­a đổi của TẬP TIN" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "Thá»±c hiện LỆNH" + +#: tests/genfile.c:240 +#, c-format +msgid "Invalid size: %s" +msgstr "Kích cỡ không hợp lệ: %s" + +#: tests/genfile.c:245 +#, c-format +msgid "Number out of allowed range: %s" +msgstr "Số nằm ngoài phạm vi cho phép: %s" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "Kích cỡ âm: %s" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "stat(%s) bị lỗi" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "Lỗi phân tích số gần « %s »" + +#: tests/genfile.c:361 +#, c-format +msgid "Unknown date format" +msgstr "Không rõ định dạng ngày tháng" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "[ĐỐI SỐ...]" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "không thể mở « %s »" + +#: tests/genfile.c:427 +msgid "cannot seek" +msgstr "không thể tìm nÆ¡i" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "tên tập tin chứa ký tá»± vô giá trị" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" +"không thể tạo ra tập tin sparse trên thiết bị gõ chuẩn: dùng tùy chọn « --" +"file »" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "mặt nạ không đúng (gần « %s »)" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, c-format +msgid "Unknown field `%s'" +msgstr "Không rõ trường « %s »" + +#: tests/genfile.c:653 +#, c-format +msgid "cannot set time on `%s'" +msgstr "không thể đặt thời gian trên « %s »" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "Lệnh đã thoát thành công\n" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "Lệnh bị lỗi với trạng thái %d\n" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "Lệnh đã chấm dứt khi nhận tín hiệu %d\n" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "Lệnh đã dừng chạy khi nhận tín hiệu %d\n" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "Lệnh đã đổ lõi\n" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "Lệnh đã chấm dứt\n" + +#: tests/genfile.c:853 +#, c-format +msgid "--stat requires file names" +msgstr "--stat yêu cầu tên tập tin" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "quá nhiều đối số" diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo new file mode 100644 index 0000000..50fa802 Binary files /dev/null and b/po/zh_CN.gmo differ diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100644 index 0000000..f01e866 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,2936 @@ +# Chinese (simplified) translation of tar. +# Copyright (C) 2004 Free Software Foundation, Inc. +# Wang Li , 2002. +# Rongjun Mu , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.14\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2004-08-06 23:45+0800\n" +"Last-Translator: Wang Li \n" +"Language-Team: Chinese (simplified) \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:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "%2$s 的参数 %1$s 无效" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "%2$s 的参数 %1$s 具有二义性" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "有效的参数为:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "" + +#: lib/argp-help.c:226 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr "" + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr "" + +#: lib/argp-help.c:1682 +#, fuzzy, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "请用“%s --help”获得更多信息。\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, fuzzy, c-format +msgid "Report bugs to %s.\n" +msgstr "" +"\n" +"将错误报告到 <%s>。\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "未知的系统错误" + +#: lib/argp-parse.c:81 src/tar.c:763 +msgid "give this help list" +msgstr "" + +#: lib/argp-parse.c:82 src/tar.c:764 +msgid "give a short usage message" +msgstr "" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +msgid "print program version" +msgstr "" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s:选项“%s”需要一个参数\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s:选项“%s”具有二义性\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s:选项“--%s”不接受参数\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s:选项“%c%s”不接受参数\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s:选项“%s”需要一个参数\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s:无法识别的选项“--%s”\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s:无法识别的选项“%c%s”\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s:非法选项 -- %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s:无效选项 -- %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s:选项需要一个参数 -- %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s:选项“-W %s”具有二义性\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s:选项“-W %s”不接受参数\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "内存耗尽" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "无法改变工作目录" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "从成员名中删除开头的“%s”" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "从硬连接目标中删除开头的“%s”" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "为空成员名替换“.”" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "“" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "”" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, c-format +msgid "Written by %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, c-format +msgid "Written by %s and %s.\n" +msgstr "" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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 +#, 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:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "总计写入字节数:%s (%s,%s/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "总计写入字节数:%s (%s,%s/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(管道)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "record_size 的无效值" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "未给出归档文件名" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "无法验证标准输入/标准输出归档文件" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "无法更新压缩归档文件" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "处于磁带的起点,现在退出" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "错误过多,退出" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "归档中未对齐的块 (%lu 字节)s" + +#: src/buffer.c:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "记录大小 = %lu 块" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "无法倒回归档文件;如果没有 -i 可能无法读入它" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s:包含无效的卷编号" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "卷编号溢出" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "为 %2$s 准备卷 #%1$d 并按回车:" + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "需得到用户应答时文件结束" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "警告:归档文件不完整" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "没有新的卷;退出。\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "“%s”命令失败" + +#: src/buffer.c:1199 +#, fuzzy, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s 在本卷中不连续" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s 在本卷中不连续" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s 的大小错误 (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "此卷次序有误" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "归档未被标记为匹配 %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "卷标 %s 不匹配 %s" + +#: src/buffer.c:1372 +#, 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:1329 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "在 %s 处一个单独的零块" + +#: src/create.c:67 +#, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "值 %s 超出了 %s 的范围 %s..%s;正在替换 %s" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "值 %s 超出了 %s 的范围 %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "正在生成负八进制头" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s:文件名太长(最长 %d);未输出" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s:文件名太长(不能被分割);未输出" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s:连接名太长;未输出" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s:文件在不同的文件系统上;未输出" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s:未知的文件类型;忽略文件" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "缺少到“%s”的连接。\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s:文件未改变;未输出" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s:文件是归档文件;未输出" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s:文件在我们读入之前被删除了" + +#: src/create.c:1591 src/incremen.c:474 +msgid "directory not dumped" +msgstr "" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s:在我们读入文件时文件发生了变化" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s:忽略套接字(socket)" + +#: src/create.c:1744 +#, 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s:目录已被改名" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s:目录已被改名" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s:目录是新的" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "无效的时间戳" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "选项中给出无效的访问模式" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "无效的设备号" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "无效的 inode 号" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "归档文件中异常的 EOF" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, fuzzy, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "无法为块因子(blocking factor) %d 分配内存" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "" + +#: src/incremen.c:1556 +#, fuzzy, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s:文件在不同的文件系统上;未输出" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s:正在删除 %s\n" + +#: src/incremen.c:1569 +#, 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: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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "选项“-%s”和“-%s”都需要标准输出" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s:无效的归档格式" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "在不兼容的归档格式上需要 GNU 特征" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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:369 +msgid "Main operation mode:" +msgstr "" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "" + +#: src/tar.c:377 +#, fuzzy +msgid "create a new archive" +msgstr "归档文件中异常的 EOF" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "" + +#: src/tar.c:409 +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:415 +msgid "archive is seekable" +msgstr "" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "" + +#: src/tar.c:445 +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +#, fuzzy +msgid "extract files to standard output" +msgstr "写入标准输出时出错" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "" + +#: src/tar.c:456 +msgid "pipe extracted files to another program" +msgstr "" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "" + +#: src/tar.c:472 +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "" + +#: src/tar.c:513 +msgid "archive file is local even if it has a colon" +msgstr "" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "" + +#: src/tar.c:535 +#, fuzzy +msgid "create/list/extract multi-volume archive" +msgstr "无法检验多卷归档文件" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "" + +#: src/tar.c:552 +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "" + +#: src/tar.c:564 +msgid "create archive of the given format" +msgstr "" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "" + +#: src/tar.c:577 +msgid "same as pax" +msgstr "" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "" + +#: src/tar.c:584 +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "" + +#: src/tar.c:587 +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "冲突的压缩选项" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "" + +#: src/tar.c:598 +#, fuzzy +msgid "filter the archive through gzip" +msgstr "%s:文件是归档文件;未输出" + +#: src/tar.c:602 +#, fuzzy +msgid "filter the archive through compress" +msgstr "%s:文件是归档文件;未输出" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "%s:文件是归档文件;未输出" + +#: src/tar.c:606 +msgid "PROG" +msgstr "" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "" + +#: src/tar.c:617 +#, fuzzy +msgid "change to directory DIR" +msgstr "无法改变工作目录" + +#: src/tar.c:619 +msgid "get names to extract or create from FILE" +msgstr "" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "" + +#: src/tar.c:631 +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "" + +#: src/tar.c:634 +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:637 +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "" + +#: src/tar.c:639 +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "" + +#: src/tar.c:642 +msgid "exclude everything under directories containing FILE" +msgstr "" + +#: src/tar.c:644 +msgid "exclude directories containing FILE" +msgstr "" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "" + +#: src/tar.c:654 +#, fuzzy +msgid "don't strip leading `/'s from file names" +msgstr "从成员名中删除开头的“%s”" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "" + +#: src/tar.c:664 +msgid "DATE" +msgstr "" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "" + +#: src/tar.c:669 +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +msgid "strip NUMBER leading components from file names on extraction" +msgstr "" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +msgid "ignore case" +msgstr "" + +#: src/tar.c:689 +msgid "patterns match file name start" +msgstr "" + +#: src/tar.c:691 +msgid "patterns match after any `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:693 +msgid "case sensitive matching (default)" +msgstr "" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "卷标 %s 不匹配 %s" + +#: src/tar.c:701 +msgid "wildcards match `/' (default for exclusion)" +msgstr "" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "" + +#: src/tar.c:711 +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "" + +#: src/tar.c:733 +msgid "show tar defaults" +msgstr "" + +#: src/tar.c:735 +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "" + +#: src/tar.c:753 +#, 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:758 +msgid "Other options:" +msgstr "" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "您不能在“-Acdtrux”中指定多个选项" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "冲突的压缩选项" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr " 未知的文件类型 %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "找不到数据文件" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "把未知的时间格式 %2$s 替换为 %1$s" + +#: src/tar.c:1022 +#, fuzzy, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "把时间 `%s' 当作 %s + %ld 纳秒" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s:文件是归档文件;未输出" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" + +#: src/tar.c:1264 +#, fuzzy +msgid "Invalid blocking factor" +msgstr "无效的块因子" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "警告:不支持 -I 选项,或许您的意思是 -j 或者 -T ?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "无效的磁带长度" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "多于一个时间阈值" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s:无效的组" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "选项中给出无效的访问模式" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "无效的数字" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "无效的所有者" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "无效的记录大小" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "记录大小必须是 %d 的倍数。" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "无效的元素数" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, c-format +msgid "Malformed density argument: %s" +msgstr "" + +#: src/tar.c:1956 +#, c-format +msgid "Unknown density: `%c'" +msgstr "" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "本 tar 不支持选项“-[0-7][lmh]”" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "" + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "旧选项“%c”需要参数。" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "没有一个文件列表时 --occurrence 是没有意义的" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence 不能用于请求的操作模式中" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "多个归档文件需要使用“-M”选项" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "无法在使用 --newer 的时候使用 --listed-incremental" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "无法检验多卷归档文件" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "无法检验压缩归档文件" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "无法使用多卷压缩归档文件" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "无法更新压缩归档文件" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option 只能用于 POSIX 归档中" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "谨慎地拒绝创建空归档文件" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "选项“-Aru”与“-f -”不兼容" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "您必须从选项“-Acdtrux”中指定一个" + +#: src/tar.c:2483 +#, 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 "错误的扩展头:缺少等于符号" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s:无效的组" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "读入检查点 %d" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "冲突的压缩选项" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +msgid "Create file of the given SIZE" +msgstr "" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "写入标准输出时出错" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "从 %2$s 读入 %1$s 字节" + +#: tests/genfile.c:134 +msgid "-T reads null-terminated names" +msgstr "" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +msgid "Seek to the given offset before writing data" +msgstr "" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +msgid "Execute COMMAND" +msgstr "" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "无效的时间戳" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "inode 号超出范围" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "未知的系统错误" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "%s:无法定位到 %s" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr " 未知的文件类型 %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s:无法定位到 %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, c-format +msgid "Command failed with status %d\n" +msgstr "" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--转换的文件名--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ 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/po/zh_TW.gmo b/po/zh_TW.gmo new file mode 100644 index 0000000..000de10 Binary files /dev/null and b/po/zh_TW.gmo differ diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..7acaeb7 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,2826 @@ +# Traditional Chinese Messages for tar +# Copyright (C) 2005 Free Software Foundation, Inc. +# Wei-Lun Chao , 2005 +# +msgid "" +msgstr "" +"Project-Id-Version: tar 1.15.1\n" +"Report-Msgid-Bugs-To: bug-tar@gnu.org\n" +"POT-Creation-Date: 2008-04-14 15:09+0300\n" +"PO-Revision-Date: 2005-05-10 17:13+0800\n" +"Last-Translator: Wei-Lun Chao \n" +"Language-Team: Chinese (traditional) \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" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "%2$s 的引數 %1$s 無效" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "%2$s 的引數 %1$s 是不明確的" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "有效的引數為:" + +#: lib/argp-help.c:147 +#, c-format +msgid "ARGP_HELP_FMT: %s value is less than or equal to %s" +msgstr "" + +#: lib/argp-help.c:220 +#, c-format +msgid "%.*s: ARGP_HELP_FMT parameter requires a value" +msgstr "%.*s: ARGP_HELP_FMT 參數需要一個值" + +#: lib/argp-help.c:226 +#, fuzzy, c-format +msgid "%.*s: ARGP_HELP_FMT parameter must be positive" +msgstr "%.*s: ARGP_HELP_FMT 參數需要一個值" + +#: lib/argp-help.c:235 +#, c-format +msgid "%.*s: Unknown ARGP_HELP_FMT parameter" +msgstr "%.*s: 未知的 ARGP_HELP_FMT 參數" + +#: lib/argp-help.c:247 +#, c-format +msgid "Garbage in ARGP_HELP_FMT: %s" +msgstr "ARGP_HELP_FMT 中無用的資訊: %s" + +#: lib/argp-help.c:1246 +msgid "" +"Mandatory or optional arguments to long options are also mandatory or " +"optional for any corresponding short options." +msgstr "長選項的必須或可選用的引數也是相對應短選項的必須或可選用的引數。" + +#: lib/argp-help.c:1639 +msgid "Usage:" +msgstr "用法:" + +#: lib/argp-help.c:1643 +msgid " or: " +msgstr " 或者: " + +#: lib/argp-help.c:1655 +msgid " [OPTION...]" +msgstr " [選項...]" + +#: lib/argp-help.c:1682 +#, c-format +msgid "Try `%s --help' or `%s --usage' for more information.\n" +msgstr "請嘗試‘%s --help’或‘%s --usage’來獲取更多資訊。\n" + +#: lib/argp-help.c:1710 src/tar.c:1230 +#, c-format +msgid "Report bugs to %s.\n" +msgstr "請向 %s 回報錯誤。\n" + +#: lib/argp-help.c:1929 lib/error.c:125 +msgid "Unknown system error" +msgstr "不明的系統錯誤" + +#: lib/argp-parse.c:81 src/tar.c:763 +#, fuzzy +msgid "give this help list" +msgstr "給出這個使用方式列表" + +#: lib/argp-parse.c:82 src/tar.c:764 +#, fuzzy +msgid "give a short usage message" +msgstr "給出簡短的使用訊息" + +#: lib/argp-parse.c:83 src/tar.c:467 src/tar.c:469 src/tar.c:538 +#: tests/genfile.c:129 +msgid "NAME" +msgstr "名稱" + +#: lib/argp-parse.c:83 +msgid "set the program name" +msgstr "" + +#: lib/argp-parse.c:84 +msgid "SECS" +msgstr "" + +#: lib/argp-parse.c:85 src/tar.c:769 +msgid "hang for SECS seconds (default 3600)" +msgstr "" + +#: lib/argp-parse.c:142 src/tar.c:765 +#, fuzzy +msgid "print program version" +msgstr "印出程式版本" + +#: lib/argp-parse.c:158 +#, c-format +msgid "(PROGRAM ERROR) No version known!?" +msgstr "" + +#: lib/argp-parse.c:611 +#, fuzzy, c-format +msgid "%s: Too many arguments\n" +msgstr "%s:選項‘%s’需要引數\n" + +#: lib/argp-parse.c:754 +msgid "(PROGRAM ERROR) Option should have been recognized!?" +msgstr "" + +#: lib/closeout.c:73 +msgid "write error" +msgstr "" + +#: lib/getopt.c:526 lib/getopt.c:542 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s:選項‘%s’是不明確的\n" + +#: lib/getopt.c:575 lib/getopt.c:579 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s:選項‘--%s’不可配合引數使用\n" + +#: lib/getopt.c:588 lib/getopt.c:593 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s:選項‘%c%s’不可配合引數使用\n" + +#: lib/getopt.c:636 lib/getopt.c:655 lib/getopt.c:971 lib/getopt.c:990 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s:選項‘%s’需要引數\n" + +#: lib/getopt.c:693 lib/getopt.c:696 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s:無法識別的選項‘--%s’\n" + +#: lib/getopt.c:704 lib/getopt.c:707 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s:無法識別的選項‘%c%s’\n" + +#: lib/getopt.c:759 lib/getopt.c:762 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s:不合法的選項 ─ %c\n" + +#: lib/getopt.c:768 lib/getopt.c:771 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s:無效的選項 ─ %c\n" + +#: lib/getopt.c:823 lib/getopt.c:839 lib/getopt.c:1043 lib/getopt.c:1061 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s:選項需要引數 ─ %c\n" + +#: lib/getopt.c:892 lib/getopt.c:908 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s:選項‘-W %s’是不明確的\n" + +#: lib/getopt.c:932 lib/getopt.c:950 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s:選項‘-W %s’不可配合引數使用\n" + +#: lib/obstack.c:423 lib/obstack.c:425 lib/xalloc-die.c:34 src/extract.c:1377 +msgid "memory exhausted" +msgstr "記憶體耗盡" + +#: lib/openat-die.c:33 +#, fuzzy, c-format +msgid "unable to record current working directory" +msgstr "無法更改使用中的目錄" + +#: lib/openat-die.c:46 +#, fuzzy, c-format +msgid "failed to return to initial working directory" +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:無法建立實際連結 (hard 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] "%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:155 +#, c-format +msgid "Removing leading `%s' from member names" +msgstr "從成員名稱中移除前端的‘%s’" + +#: lib/paxnames.c:156 +#, c-format +msgid "Removing leading `%s' from hard link targets" +msgstr "從硬式連結目標中移除前端的‘%s’" + +#: lib/paxnames.c:169 +msgid "Substituting `.' for empty member name" +msgstr "以‘.’來替換空白的成員名稱" + +#: lib/paxnames.c:170 +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 +#. +#. and use glyphs suitable for your language. +#: lib/quotearg.c:266 +msgid "`" +msgstr "‘" + +#: lib/quotearg.c:267 +msgid "'" +msgstr "’" + +#: lib/rpmatch.c:69 +msgid "^[yY]" +msgstr "" + +#: lib/rpmatch.c:72 +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" + +#. 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. +#: lib/version-etc.c:65 +msgid "(C)" +msgstr "" + +#: lib/version-etc.c:67 +msgid "" +"\n" +"License GPLv3+: GNU GPL version 3 or later \n" +"This is free software: you are free to change and redistribute it.\n" +"There is NO WARRANTY, to the extent permitted by law.\n" +"\n" +msgstr "" + +#. TRANSLATORS: %s denotes an author name. +#: lib/version-etc.c:83 +#, fuzzy, c-format +msgid "Written by %s.\n" +msgstr "由 F. Pinard 編寫。" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:87 +#, fuzzy, c-format +msgid "Written by %s and %s.\n" +msgstr "由 F. Pinard 編寫。" + +#. TRANSLATORS: Each %s denotes an author name. +#: lib/version-etc.c:91 +#, fuzzy, c-format +msgid "Written by %s, %s, and %s.\n" +msgstr "由 F. Pinard 編寫。" + +#. 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. +#: lib/version-etc.c:97 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:103 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:109 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:116 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:123 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:131 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, and %s.\n" +msgstr "" + +#. 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. +#: lib/version-etc.c:141 +#, c-format +msgid "" +"Written by %s, %s, %s,\n" +"%s, %s, %s, %s,\n" +"%s, %s, and others.\n" +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 +#, 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:檔案突然結束\n" + +#: rmt/rmt.c:474 +msgid "Premature end of file" +msgstr "檔案突然結束" + +#: rmt/rmt.c:672 +msgid "Garbage command" +msgstr "無用的命令" + +#: src/buffer.c:281 src/buffer.c:520 src/buffer.c:1106 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:333 src/buffer.c:342 +#, fuzzy +msgid "Total bytes written" +msgstr "已寫入位元組總數: %s (%s, %s/s)\n" + +#: src/buffer.c:340 src/buffer.c:354 +msgid "Total bytes read" +msgstr "" + +#: src/buffer.c:344 +#, fuzzy, c-format +msgid "Total bytes deleted: %s\n" +msgstr "已寫入位元組總數: %s (%s, %s/s)\n" + +#: src/buffer.c:433 +msgid "(pipe)" +msgstr "(管線)" + +#: src/buffer.c:456 +msgid "Invalid value for record_size" +msgstr "無效的紀錄大小" + +#: src/buffer.c:459 +msgid "No archive name given" +msgstr "沒有指定保存檔名稱" + +#: src/buffer.c:503 +msgid "Cannot verify stdin/stdout archive" +msgstr "無法檢驗標準輸出入保存檔" + +#: src/buffer.c:517 +#, c-format +msgid "Archive is compressed. Use %s option" +msgstr "保存檔已壓縮過。使用 %s 選項" + +#: src/buffer.c:566 src/tar.c:2279 +msgid "Cannot update compressed archives" +msgstr "無法更新壓縮的保存檔" + +#: src/buffer.c:644 +msgid "At beginning of tape, quitting now" +msgstr "開始讀取磁帶時出錯,立刻退出" + +#: src/buffer.c:650 +msgid "Too many errors, quitting" +msgstr "錯誤過多,必須中止" + +#: src/buffer.c:678 +#, c-format +msgid "Unaligned block (%lu byte) in archive" +msgid_plural "Unaligned block (%lu bytes) in archive" +msgstr[0] "保存檔中未排列的區塊 (%lu 位元組)" + +#: src/buffer.c:698 +#, c-format +msgid "Record size = %lu block" +msgid_plural "Record size = %lu blocks" +msgstr[0] "紀錄大小 = %lu 區塊" + +#: src/buffer.c:771 +msgid "Cannot backspace archive file; it may be unreadable without -i" +msgstr "無法倒退保存檔檔案;沒有 -i 也許會無法讀取" + +#: src/buffer.c:803 +msgid "rmtlseek not stopped at a record boundary" +msgstr "rmtlseek 無法在紀錄分界處停止" + +#: src/buffer.c:859 +#, c-format +msgid "%s: contains invalid volume number" +msgstr "%s:包含無效的卷冊號碼" + +#: src/buffer.c:894 +msgid "Volume number overflow" +msgstr "卷冊號碼已滿" + +#: src/buffer.c:909 +#, c-format +msgid "Prepare volume #%d for %s and hit return: " +msgstr "準備好卷冊 #%d 以完成 %s 並按下 return: " + +#: src/buffer.c:915 +msgid "EOF where user reply was expected" +msgstr "到達期待使用者回答的檔案末端" + +#: src/buffer.c:920 src/buffer.c:952 +msgid "WARNING: Archive is incomplete" +msgstr "警告:保存檔不完整" + +#: src/buffer.c:934 +#, 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:939 +#, c-format +msgid " ! Spawn a subshell\n" +msgstr "" + +#: src/buffer.c:940 +#, c-format +msgid " ? Print this list\n" +msgstr "" + +#: src/buffer.c:947 +msgid "No new volume; exiting.\n" +msgstr "沒有新的卷冊;離開。\n" + +#: src/buffer.c:980 +msgid "File name not specified. Try again.\n" +msgstr "" + +#: src/buffer.c:993 +#, c-format +msgid "Invalid input. Type ? for help.\n" +msgstr "" + +#: src/buffer.c:1044 +#, fuzzy, c-format +msgid "%s command failed" +msgstr "‘%s’指令失敗" + +#: src/buffer.c:1199 +#, fuzzy, c-format +msgid "%s is possibly continued on this volume: header contains truncated name" +msgstr "%s 在本卷冊中並不連續" + +#: src/buffer.c:1203 +#, c-format +msgid "%s is not continued on this volume" +msgstr "%s 在本卷冊中並不連續" + +#: src/buffer.c:1217 +#, c-format +msgid "%s is the wrong size (%s != %s + %s)" +msgstr "%s 的大小有錯誤 (%s != %s + %s)" + +#: src/buffer.c:1227 +msgid "This volume is out of sequence" +msgstr "本卷冊已超出序列" + +#: src/buffer.c:1273 +#, c-format +msgid "Archive not labeled to match %s" +msgstr "保存檔未標誌為符合 %s" + +#: src/buffer.c:1276 +#, c-format +msgid "Volume %s does not match %s" +msgstr "卷冊 %s 不符合 %s" + +#: src/buffer.c:1372 +#, fuzzy, 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:1329 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 +#, 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/compare.c:612 src/list.c:144 +#, c-format +msgid "A lone zero block at %s" +msgstr "位於 %s 的孤立零值區塊" + +#: src/create.c:67 +#, fuzzy, c-format +msgid "%s: contains a cache directory tag %s; %s" +msgstr "%s:包含一個快取目錄標籤;未傾印" + +#: src/create.c:272 +#, c-format +msgid "value %s out of %s range %s..%s; substituting %s" +msgstr "數值 %s 已超出 %s 的範圍 %s..%s;以 %s 替代中" + +#: src/create.c:278 +#, c-format +msgid "value %s out of %s range %s..%s" +msgstr "數值 %s 已超出 %s 的範圍 %s..%s" + +#: src/create.c:338 +msgid "Generating negative octal headers" +msgstr "正在產生負數的八進位表頭" + +#: src/create.c:624 src/create.c:687 +#, c-format +msgid "%s: file name is too long (max %d); not dumped" +msgstr "%s:檔名太長 (最大 %d);未傾印" + +#: src/create.c:634 +#, c-format +msgid "%s: file name is too long (cannot be split); not dumped" +msgstr "%s:檔名太長 (無法分割);未傾印" + +#: src/create.c:661 +#, c-format +msgid "%s: link name is too long; not dumped" +msgstr "%s:連接名稱太長;未傾印" + +#: src/create.c:1076 +#, 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:1177 +#, c-format +msgid "%s: file is on a different filesystem; not dumped" +msgstr "%s:檔案位於不同的檔案系統;未傾印" + +#: src/create.c:1221 src/create.c:1232 src/incremen.c:482 src/incremen.c:488 +msgid "contents not dumped" +msgstr "" + +#: src/create.c:1361 +#, c-format +msgid "%s: Unknown file type; file ignored" +msgstr "%s:檔案類型不詳;會忽略該檔案" + +#: src/create.c:1464 +#, fuzzy, c-format +msgid "Missing links to %s.\n" +msgstr "失去至 %s 的連結。\n" + +#: src/create.c:1535 +#, c-format +msgid "%s: file is unchanged; not dumped" +msgstr "%s:檔案沒有變更;未傾印" + +#: src/create.c:1543 +#, c-format +msgid "%s: file is the archive; not dumped" +msgstr "%s:這個檔案是保存檔;未傾印" + +#: src/create.c:1573 +#, c-format +msgid "%s: File removed before we read it" +msgstr "%s:當讀取檔案時該檔案已被移除" + +#: src/create.c:1591 src/incremen.c:474 +#, fuzzy +msgid "directory not dumped" +msgstr "%s:包含一個快取目錄標籤;未傾印" + +#: src/create.c:1659 +#, c-format +msgid "%s: file changed as we read it" +msgstr "%s:檔案在我們讀取時已變更" + +#: src/create.c:1739 +#, c-format +msgid "%s: socket ignored" +msgstr "%s:會忽略 socket" + +#: src/create.c:1744 +#, 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 +#, 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 "損毀名稱的檔案結尾不正常" + +#: 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:390 src/incremen.c:430 +#, fuzzy, c-format +msgid "%s: Directory has been renamed from %s" +msgstr "%s:目錄已被變更名稱" + +#: src/incremen.c:400 +#, c-format +msgid "%s: Directory has been renamed" +msgstr "%s:目錄已被變更名稱" + +#: src/incremen.c:441 +#, c-format +msgid "%s: Directory is new" +msgstr "%s:目錄是新的" + +#: src/incremen.c:833 src/incremen.c:850 +msgid "Invalid time stamp" +msgstr "無效的時間標記" + +#: src/incremen.c:889 +#, fuzzy +msgid "Invalid modification time (seconds)" +msgstr "選項中的模式無效" + +#: src/incremen.c:904 +msgid "Invalid modification time (nanoseconds)" +msgstr "" + +#: src/incremen.c:924 +msgid "Invalid device number" +msgstr "無效的裝置號碼" + +#: src/incremen.c:939 +msgid "Invalid inode number" +msgstr "無效的 inode 號碼" + +#: src/incremen.c:990 src/incremen.c:1027 +msgid "Field too long while reading snapshot file" +msgstr "" + +#: src/incremen.c:997 src/incremen.c:1035 +msgid "Read error in snapshot file" +msgstr "" + +#: src/incremen.c:999 src/incremen.c:1039 src/incremen.c:1091 +#: src/incremen.c:1149 +#, fuzzy +msgid "Unexpected EOF in snapshot file" +msgstr "保存檔的檔案結尾不正常" + +#: src/incremen.c:1006 src/incremen.c:1046 +msgid "Unexpected field value in snapshot file" +msgstr "" + +#: src/incremen.c:1141 +msgid "Missing record terminator" +msgstr "" + +#: src/incremen.c:1192 src/incremen.c:1195 +msgid "Bad incremental file format" +msgstr "" + +#: src/incremen.c:1214 +#, c-format +msgid "Unsupported incremental format version: %" +msgstr "" + +#: src/incremen.c:1369 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found %#3o" +msgstr "" + +#: src/incremen.c:1379 +msgid "Malformed dumpdir: 'X' duplicated" +msgstr "" + +#: src/incremen.c:1392 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'R'" +msgstr "未成形的密度引數: '%s'" + +#: src/incremen.c:1405 +msgid "Malformed dumpdir: 'T' not preceeded by 'R'" +msgstr "" + +#: src/incremen.c:1411 +#, fuzzy +msgid "Malformed dumpdir: empty name in 'T'" +msgstr "未成形的密度引數: '%s'" + +#: src/incremen.c:1431 +#, c-format +msgid "Malformed dumpdir: expected '%c' but found end of data" +msgstr "" + +#: src/incremen.c:1437 +msgid "Malformed dumpdir: 'X' never used" +msgstr "" + +#: src/incremen.c:1481 +#, c-format +msgid "Cannot create temporary directory using template %s" +msgstr "" + +#: src/incremen.c:1543 +#, c-format +msgid "%s: Not purging directory: unable to stat" +msgstr "%s:未能清空目錄;無法顯示狀態" + +#: src/incremen.c:1556 +#, c-format +msgid "%s: directory is on a different device: not purging" +msgstr "%s:目錄位於不同的裝置;無法清空" + +#: src/incremen.c:1564 +#, c-format +msgid "%s: Deleting %s\n" +msgstr "%s:正在刪除 %s\n" + +#: src/incremen.c:1569 +#, 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: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 +#, 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:79 +#, c-format +msgid "Options `-%s' and `-%s' both want standard input" +msgstr "選項‘-%s’與‘-%s’兩者都需要標準輸入" + +#: src/tar.c:156 +#, c-format +msgid "%s: Invalid archive format" +msgstr "%s:無效的保存檔格式" + +#: src/tar.c:180 +msgid "GNU features wanted on incompatible archive format" +msgstr "不能在不兼容於 GNU 的保存檔格式中使用 GNU 功能" + +#: src/tar.c:241 +#, c-format +msgid "" +"Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list." +msgstr "" + +#: src/tar.c:334 +#, 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:343 +#, 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" +"例子:\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" +"\n" +"備份檔的後置字串為‘~’,除非以 --suffix 選項或是 SIMPLE_BACKUP_SUFFIX\n" +"環境變數指定。版本控制的方式可透過 --backup 選項或 VERSION_CONTROL 環境\n" +"變數來選擇。可用的變數值為:\n" +"\n" +" t, numbered 備份檔會加上數字\n" +" nil, existing 若有數字的備份檔已經存在則使用數字,否則使用普通方式備份\n" +" never, simple 永遠使用普通方式備份\n" + +#: src/tar.c:369 +msgid "Main operation mode:" +msgstr "主要操作模式:" + +#: src/tar.c:372 +msgid "list the contents of an archive" +msgstr "列出保存檔的內容" + +#: src/tar.c:374 +msgid "extract files from an archive" +msgstr "從保存檔中解開檔案" + +#: src/tar.c:377 +msgid "create a new archive" +msgstr "建立一個新的保存檔" + +#: src/tar.c:379 +msgid "find differences between archive and file system" +msgstr "在保存檔與檔案系統之間找出差異" + +#: src/tar.c:382 +msgid "append files to the end of an archive" +msgstr "加入檔案到保存檔末端" + +#: src/tar.c:384 +msgid "only append files newer than copy in archive" +msgstr "只加入比保存檔中複本還新的檔案" + +#: src/tar.c:386 +msgid "append tar files to an archive" +msgstr "加入 tar 檔案到保存檔中" + +#: src/tar.c:389 +msgid "delete from the archive (not on mag tapes!)" +msgstr "從保存檔中刪除 (並非在磁帶上!)" + +#: src/tar.c:391 +msgid "test the archive volume label and exit" +msgstr "" + +#: src/tar.c:396 +msgid "Operation modifiers:" +msgstr "運算變更項:" + +#: src/tar.c:399 +msgid "handle sparse files efficiently" +msgstr "有效率地處理稀疏的檔案" + +#: src/tar.c:400 +msgid "MAJOR[.MINOR]" +msgstr "" + +#: src/tar.c:401 +msgid "set version of the sparse format to use (implies --sparse)" +msgstr "" + +#: src/tar.c:403 +msgid "handle old GNU-format incremental backup" +msgstr "處理舊型 GNU-格式之漸進式備份" + +#: src/tar.c:404 src/tar.c:541 src/tar.c:614 src/tar.c:618 src/tar.c:628 +#: src/tar.c:638 src/tar.c:641 src/tar.c:643 src/tar.c:725 tests/genfile.c:131 +#: tests/genfile.c:179 tests/genfile.c:183 tests/genfile.c:186 +msgid "FILE" +msgstr "檔案" + +#: src/tar.c:405 +msgid "handle new GNU-format incremental backup" +msgstr "處理新型 GNU-格式之漸進式備份" + +#: src/tar.c:407 +msgid "do not exit with nonzero on unreadable files" +msgstr "離開無法讀取的檔案時不要回傳非零的值" + +#: src/tar.c:408 src/tar.c:536 src/tar.c:551 src/tar.c:675 src/tar.c:710 +#: tests/genfile.c:165 +msgid "NUMBER" +msgstr "數目" + +#: src/tar.c:409 +#, 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 "" +"只有對於每一個在保存檔中第 NUM 個出現的檔案才會處理。此選項只有與 --" +"delete、--diff、--extract 或 --list 等次命令之一合併使用時才有效,而且要經由" +"命令列 或是 -T 選項來提供一個檔案序列。預設的數目是 1。" + +#: src/tar.c:415 +#, fuzzy +msgid "archive is seekable" +msgstr "保存檔是可搜尋的" + +#: src/tar.c:417 +msgid "do not check device numbers when creating incremental archives" +msgstr "" + +#: src/tar.c:420 +msgid "check device numbers when creating incremental archives (default)" +msgstr "" + +#: src/tar.c:426 +msgid "Overwrite control:" +msgstr "" + +#: src/tar.c:429 +msgid "attempt to verify the archive after writing it" +msgstr "嘗試在寫入之後驗證保存檔" + +#: src/tar.c:431 +msgid "remove files after adding them to the archive" +msgstr "在加入檔案至保存檔之後移除它們" + +#: src/tar.c:433 +msgid "don't replace existing files when extracting" +msgstr "解開時不要替換既有的檔案" + +#: src/tar.c:435 +msgid "don't replace existing files that are newer than their archive copies" +msgstr "不要替換既有且比它們在保存檔中複本還新的檔案" + +#: src/tar.c:437 +msgid "overwrite existing files when extracting" +msgstr "解開時覆寫既有檔案" + +#: src/tar.c:439 +msgid "remove each file prior to extracting over it" +msgstr "在解開並覆寫檔案之前先移除它" + +#: src/tar.c:441 +msgid "empty hierarchies prior to extracting directory" +msgstr "在解開目錄之前先清空目錄階層" + +#: src/tar.c:443 +msgid "preserve metadata of existing directories" +msgstr "保留既有目錄的原始資料" + +#: src/tar.c:445 +#, fuzzy +msgid "overwrite metadata of existing directories when extracting (default)" +msgstr "解開時覆寫既有檔案" + +#: src/tar.c:451 +msgid "Select output stream:" +msgstr "" + +#: src/tar.c:454 +msgid "extract files to standard output" +msgstr "解開檔案至標準輸出" + +#: src/tar.c:455 src/tar.c:514 src/tar.c:516 tests/genfile.c:162 +#: tests/genfile.c:189 +msgid "COMMAND" +msgstr "命令" + +#: src/tar.c:456 +#, fuzzy +msgid "pipe extracted files to another program" +msgstr "解開檔案至標準輸出" + +#: src/tar.c:458 +msgid "ignore exit codes of children" +msgstr "" + +#: src/tar.c:460 +msgid "treat non-zero exit codes of children as error" +msgstr "" + +#: src/tar.c:465 +msgid "Handling of file attributes:" +msgstr "檔案屬性的處理:" + +#: src/tar.c:468 +msgid "force NAME as owner for added files" +msgstr "強制以名稱做為加入檔案的擁有者" + +#: src/tar.c:470 +msgid "force NAME as group for added files" +msgstr "強制以名稱做為加入檔案的群組" + +#: src/tar.c:471 src/tar.c:661 +msgid "DATE-OR-FILE" +msgstr "檔案的日期" + +#: src/tar.c:472 +#, fuzzy +msgid "set mtime for added files from DATE-OR-FILE" +msgstr "只儲存比 DATE-OF-FILE 還新的檔案" + +#: src/tar.c:473 +msgid "CHANGES" +msgstr "變更" + +#: src/tar.c:474 +msgid "force (symbolic) mode CHANGES for added files" +msgstr "強制以(符號)變更做為加入檔案的模式" + +#: src/tar.c:476 +msgid "METHOD" +msgstr "" + +#: src/tar.c:477 +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:481 +msgid "don't extract file modified time" +msgstr "不要解開檔案的修改時間" + +#: src/tar.c:483 +msgid "try extracting files with the same ownership" +msgstr "嘗試以相同的擁有身分去解開檔案" + +#: src/tar.c:485 +msgid "extract files as yourself" +msgstr "以自己的身分解開檔案" + +#: src/tar.c:487 +msgid "always use numbers for user/group names" +msgstr "總是使用數字做為使用者/群組名稱" + +#: src/tar.c:489 +msgid "extract information about file permissions (default for superuser)" +msgstr "" + +#: src/tar.c:493 +msgid "" +"apply the user's umask when extracting permissions from the archive (default " +"for ordinary users)" +msgstr "" + +#: src/tar.c:495 +msgid "sort names to extract to match archive" +msgstr "解開時依名稱排序以符合保存檔" + +#: src/tar.c:498 +msgid "same as both -p and -s" +msgstr "等同於指定 -p 與 -s" + +#: src/tar.c:500 +msgid "" +"delay setting modification times and permissions of extracted directories " +"until the end of extraction" +msgstr "" + +#: src/tar.c:503 +msgid "cancel the effect of --delay-directory-restore option" +msgstr "" + +#: src/tar.c:508 +msgid "Device selection and switching:" +msgstr "裝置選擇與切換:" + +#: src/tar.c:510 +msgid "ARCHIVE" +msgstr "保存檔" + +#: src/tar.c:511 +msgid "use archive file or device ARCHIVE" +msgstr "使用保存檔檔案或保存檔裝置" + +#: src/tar.c:513 +#, fuzzy +msgid "archive file is local even if it has a colon" +msgstr "即使具有冒號,保存檔檔案仍位於本地端" + +#: src/tar.c:515 +msgid "use given rmt COMMAND instead of rmt" +msgstr "使用賦予的 rmt 命令以取代 rmt" + +#: src/tar.c:517 +msgid "use remote COMMAND instead of rsh" +msgstr "使用遠端的命令以取代 rsh" + +#: src/tar.c:521 +msgid "specify drive and density" +msgstr "指定磁碟機與記錄密度" + +#: src/tar.c:535 +msgid "create/list/extract multi-volume archive" +msgstr "建立/列表/解開 多重卷冊的保存檔" + +#: src/tar.c:537 +msgid "change tape after writing NUMBER x 1024 bytes" +msgstr "在寫入 NUMBER x 1024 位元組之後更換磁帶" + +#: src/tar.c:539 +msgid "run script at end of each tape (implies -M)" +msgstr "在每卷磁帶末端執行命令稿 (意指 -M)" + +#: src/tar.c:542 +msgid "use/update the volume number in FILE" +msgstr "使用/更新 FILE 中的卷冊號碼" + +#: src/tar.c:547 +msgid "Device blocking:" +msgstr "裝置分區:" + +#: src/tar.c:549 +msgid "BLOCKS" +msgstr "區塊" + +#: src/tar.c:550 +msgid "BLOCKS x 512 bytes per record" +msgstr "每筆紀錄含有 BLOCKS x 512 位元組" + +#: src/tar.c:552 +#, fuzzy +msgid "NUMBER of bytes per record, multiple of 512" +msgstr "每筆紀錄 SIZE 位元組,為 512 的倍數" + +#: src/tar.c:554 +msgid "ignore zeroed blocks in archive (means EOF)" +msgstr "忽略保存檔中零值的區塊 (意指 EOF)" + +#: src/tar.c:556 +msgid "reblock as we read (for 4.2BSD pipes)" +msgstr "讀取時重新分區 (用於 4.2BSD 管線)" + +#: src/tar.c:561 +msgid "Archive format selection:" +msgstr "保存檔格式選擇:" + +#: src/tar.c:563 tests/genfile.c:152 +msgid "FORMAT" +msgstr "格式" + +#: src/tar.c:564 +#, fuzzy +msgid "create archive of the given format" +msgstr "以給定格式建立保存檔。" + +#: src/tar.c:566 +msgid "FORMAT is one of the following:" +msgstr "符合下列任一格式:" + +#: src/tar.c:567 +msgid "old V7 tar format" +msgstr "舊式 V7 tar 格式" + +#: src/tar.c:570 +msgid "GNU format as per tar <= 1.12" +msgstr "tar <= 1.12 之 GNU 格式" + +#: src/tar.c:572 +msgid "GNU tar 1.13.x format" +msgstr "GNU tar 1.13.x 格式" + +#: src/tar.c:574 +msgid "POSIX 1003.1-1988 (ustar) format" +msgstr "POSIX 1003.1-1988 (ustar) 格式" + +#: src/tar.c:576 +msgid "POSIX 1003.1-2001 (pax) format" +msgstr "POSIX 1003.1-2001 (pax) 格式" + +#: src/tar.c:577 +#, fuzzy +msgid "same as pax" +msgstr "等同 pax" + +#: src/tar.c:580 +msgid "same as --format=v7" +msgstr "等同 --format=v7" + +#: src/tar.c:583 +msgid "same as --format=posix" +msgstr "等同 --format=posix" + +#: src/tar.c:584 +#, fuzzy +msgid "keyword[[:]=value][,keyword[[:]=value]]..." +msgstr "關鍵字[[:]=值][,關鍵字[[:]=值], ...]" + +#: src/tar.c:585 +msgid "control pax keywords" +msgstr "控制 pax 的關鍵字" + +#: src/tar.c:586 +msgid "TEXT" +msgstr "文字" + +#: src/tar.c:587 +#, fuzzy +msgid "" +"create archive with volume name TEXT; at list/extract time, use TEXT as a " +"globbing pattern for volume name" +msgstr "" +"以卷冊名稱 NAME 來建立保存檔。在列表/解開時,使用 TEXT 做為萬用比對樣式" + +#: src/tar.c:592 +#, fuzzy +msgid "Compression options:" +msgstr "有關壓縮的選項互相抵觸" + +#: src/tar.c:594 +msgid "use archive suffix to determine the compression program" +msgstr "" + +#: src/tar.c:596 +msgid "filter the archive through bzip2" +msgstr "保存檔以 bzip2 過濾處理" + +#: src/tar.c:598 +msgid "filter the archive through gzip" +msgstr "保存檔以 gzip 過濾處理" + +#: src/tar.c:602 +msgid "filter the archive through compress" +msgstr "保存檔以 compress 過濾處理" + +#: src/tar.c:605 +#, fuzzy +msgid "filter the archive through lzma" +msgstr "保存檔以 gzip 過濾處理" + +#: src/tar.c:606 +msgid "PROG" +msgstr "程式" + +#: src/tar.c:607 +msgid "filter through PROG (must accept -d)" +msgstr "以 PROG 過濾處理 (必須接受 -d)" + +#: src/tar.c:612 +msgid "Local file selection:" +msgstr "本機檔案選擇:" + +#: src/tar.c:615 +msgid "add given FILE to the archive (useful if its name starts with a dash)" +msgstr "" + +#: src/tar.c:616 +msgid "DIR" +msgstr "目錄" + +#: src/tar.c:617 +msgid "change to directory DIR" +msgstr "更改至目錄 DIR" + +#: src/tar.c:619 +#, fuzzy +msgid "get names to extract or create from FILE" +msgstr "從檔案 NAME 中取得要解開或建立的名稱" + +#: src/tar.c:621 +msgid "-T reads null-terminated names, disable -C" +msgstr "-T 讀取零值終結的名稱,停用 -C" + +#: src/tar.c:623 +msgid "unquote filenames read with -T (default)" +msgstr "" + +#: src/tar.c:625 +msgid "do not unquote filenames read with -T" +msgstr "" + +#: src/tar.c:626 tests/genfile.c:135 +msgid "PATTERN" +msgstr "樣式" + +#: src/tar.c:627 +msgid "exclude files, given as a PATTERN" +msgstr "排除給定樣式的檔案" + +#: src/tar.c:629 +msgid "exclude patterns listed in FILE" +msgstr "排除 FILE 中所列出的樣式" + +#: src/tar.c:631 +#, fuzzy +msgid "" +"exclude contents of directories containing CACHEDIR.TAG, except for the tag " +"file itself" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:634 +#, fuzzy +msgid "exclude everything under directories containing CACHEDIR.TAG" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:637 +#, fuzzy +msgid "exclude directories containing CACHEDIR.TAG" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:639 +#, fuzzy +msgid "exclude contents of directories containing FILE, except for FILE itself" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:642 +#, fuzzy +msgid "exclude everything under directories containing FILE" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:644 +#, fuzzy +msgid "exclude directories containing FILE" +msgstr "排除包含了快取標記的目錄" + +#: src/tar.c:646 +msgid "exclude version control system directories" +msgstr "" + +#: src/tar.c:648 +msgid "avoid descending automatically in directories" +msgstr "避免自動在目錄中下降" + +#: src/tar.c:650 +msgid "stay in local file system when creating archive" +msgstr "建立保存檔時保持在本地檔案系統中" + +#: src/tar.c:652 +msgid "recurse into directories (default)" +msgstr "遞迴進入目錄 (預設)" + +#: src/tar.c:654 +msgid "don't strip leading `/'s from file names" +msgstr "不要從檔案名稱中截去前導的 '/'" + +#: src/tar.c:656 +msgid "follow symlinks; archive and dump the files they point to" +msgstr "" + +#: src/tar.c:658 +msgid "follow hard links; archive and dump the files they refer to" +msgstr "" + +#: src/tar.c:659 +msgid "MEMBER-NAME" +msgstr "成員-名稱" + +#: src/tar.c:660 +msgid "begin at member MEMBER-NAME in the archive" +msgstr "從保存檔中名為 MEMBER-NAME 的成員開始" + +#: src/tar.c:662 +msgid "only store files newer than DATE-OR-FILE" +msgstr "只儲存比 DATE-OF-FILE 還新的檔案" + +#: src/tar.c:664 +msgid "DATE" +msgstr "日期" + +#: src/tar.c:665 +msgid "compare date and time when data changed only" +msgstr "只有當資料變更時才比較日期和時間" + +#: src/tar.c:666 +msgid "CONTROL" +msgstr "控制" + +#: src/tar.c:667 +msgid "backup before removal, choose version CONTROL" +msgstr "移除前先備份,選擇版本 CONTROL" + +#: src/tar.c:668 src/tar.c:742 src/tar.c:744 tests/genfile.c:168 +msgid "STRING" +msgstr "字串" + +#: src/tar.c:669 +#, fuzzy +msgid "" +"backup before removal, override usual suffix ('~' unless overridden by " +"environment variable SIMPLE_BACKUP_SUFFIX)" +msgstr "" +"移除前先備份並覆蓋一般後置文字 '~',除非被環境變數 SIMPLE_BACKUP_SUFFIX 所覆" +"蓋" + +#: src/tar.c:674 +msgid "File name transformations:" +msgstr "" + +#: src/tar.c:676 +#, fuzzy +msgid "strip NUMBER leading components from file names on extraction" +msgstr "從檔案名稱中截去以 NUMBER 為首的成分" + +#: src/tar.c:678 +msgid "EXPRESSION" +msgstr "" + +#: src/tar.c:679 +msgid "use sed replace EXPRESSION to transform file names" +msgstr "" + +#: src/tar.c:684 +msgid "File name matching options (affect both exclude and include patterns):" +msgstr "" + +#: src/tar.c:687 +#, fuzzy +msgid "ignore case" +msgstr "排除時忽略大小寫" + +#: src/tar.c:689 +#, fuzzy +msgid "patterns match file name start" +msgstr "排除樣式會比對檔案名稱開頭" + +#: src/tar.c:691 +#, fuzzy +msgid "patterns match after any `/' (default for exclusion)" +msgstr "排除樣式會比對任一 '/' 後端 (預設)" + +#: src/tar.c:693 +#, fuzzy +msgid "case sensitive matching (default)" +msgstr "排除樣式忽略大小寫" + +#: src/tar.c:695 +msgid "use wildcards (default for exclusion)" +msgstr "" + +#: src/tar.c:697 +msgid "verbatim string matching" +msgstr "" + +#: src/tar.c:699 +#, fuzzy +msgid "wildcards do not match `/'" +msgstr "排除樣式之萬用字元不會符合 '/'" + +#: src/tar.c:701 +#, fuzzy +msgid "wildcards match `/' (default for exclusion)" +msgstr "排除樣式之萬用字元會符合 '/' (預設)" + +#: src/tar.c:706 +msgid "Informative output:" +msgstr "富含資訊的輸出:" + +#: src/tar.c:709 +msgid "verbosely list files processed" +msgstr "詳細列出處理過的檔案" + +#: src/tar.c:711 +#, fuzzy +msgid "display progress messages every NUMBERth record (default 10)" +msgstr "每 10 項紀錄顯示一次進度訊息" + +#: src/tar.c:713 +msgid "ACTION" +msgstr "" + +#: src/tar.c:714 +msgid "execute ACTION on each checkpoint" +msgstr "" + +#: src/tar.c:717 +msgid "print a message if not all links are dumped" +msgstr "如果並非所有連結都被傾印則印出一條訊息" + +#: src/tar.c:718 +msgid "SIGNAL" +msgstr "" + +#: src/tar.c:719 +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:724 +msgid "print file modification dates in UTC" +msgstr "以 UTC 格式印出檔案修改日期" + +#: src/tar.c:726 +msgid "send verbose output to FILE" +msgstr "將詳細輸出送至 FILE" + +#: src/tar.c:728 +msgid "show block number within archive with each message" +msgstr "每則訊息附帶顯示在保存檔中的區塊號碼" + +#: src/tar.c:730 +msgid "ask for confirmation for every action" +msgstr "任何動作都要求確認" + +#: src/tar.c:733 +#, fuzzy +msgid "show tar defaults" +msgstr "顯示 tar 預設值" + +#: src/tar.c:735 +#, fuzzy +msgid "" +"when listing or extracting, list each directory that does not match search " +"criteria" +msgstr "當表列或解開時,列出每一個不符合搜尋條件的目錄" + +#: src/tar.c:737 +msgid "show file or archive names after transformation" +msgstr "" + +#: src/tar.c:740 +msgid "STYLE" +msgstr "" + +#: src/tar.c:741 +msgid "set name quoting style; see below for valid STYLE values" +msgstr "" + +#: src/tar.c:743 +msgid "additionally quote characters from STRING" +msgstr "" + +#: src/tar.c:745 +msgid "disable quoting for characters from STRING" +msgstr "" + +#: src/tar.c:750 +msgid "Compatibility options:" +msgstr "相容性選項:" + +#: src/tar.c:753 +#, fuzzy +msgid "" +"when creating, same as --old-archive; when extracting, same as --no-same-" +"owner" +msgstr "當建立時,等同於 --old-archive。當解開時,等同於 --no-same-owner" + +#: src/tar.c:758 +msgid "Other options:" +msgstr "其他選項:" + +#: src/tar.c:761 +msgid "disable use of some potentially harmful options" +msgstr "" + +#: src/tar.c:899 +msgid "You may not specify more than one `-Acdtrux' option" +msgstr "不可指定‘-Acdtrux’當中多於一個的選項" + +#: src/tar.c:909 +msgid "Conflicting compression options" +msgstr "有關壓縮的選項互相抵觸" + +#: src/tar.c:965 +#, fuzzy, c-format +msgid "Unknown signal name: %s" +msgstr "不明的檔案類型 %s\n" + +#: src/tar.c:989 +#, fuzzy +msgid "Date sample file not found" +msgstr "找不到用作擷取時間資料的檔案" + +#: src/tar.c:997 +#, c-format +msgid "Substituting %s for unknown date format %s" +msgstr "以 %s 代替不明的日期格式 %s" + +#: src/tar.c:1022 +#, fuzzy, c-format +msgid "Option %s: Treating date `%s' as %s" +msgstr "以 %2$s + %3$ld 柰秒的格式來處理日期 '%1$s'" + +#: src/tar.c:1096 +#, fuzzy, c-format +msgid "%s: file list already read" +msgstr "%s:這個檔案是保存檔;未傾印" + +#: src/tar.c:1159 +#, c-format +msgid "%s: file name read contains nul character" +msgstr "" + +#: src/tar.c:1224 +msgid "Valid arguments for --quoting-style options are:" +msgstr "" + +#: src/tar.c:1227 +msgid "" +"\n" +"*This* tar defaults to:\n" +msgstr "" +"\n" +"*這個* tar 預設為:\n" + +#: src/tar.c:1264 +msgid "Invalid blocking factor" +msgstr "無效的分區因素" + +#: src/tar.c:1340 +msgid "Warning: the -I option is not supported; perhaps you meant -j or -T?" +msgstr "警告:不再支援 -I 選項;也許你是指 -j 或 -T 選項?" + +#: src/tar.c:1373 +msgid "Invalid tape length" +msgstr "無效的磁帶長度" + +#: src/tar.c:1409 +msgid "More than one threshold date" +msgstr "一個以上的限定日期" + +#: src/tar.c:1464 src/tar.c:1467 +msgid "Invalid sparse version value" +msgstr "" + +#: src/tar.c:1552 +msgid "--atime-preserve='system' is not supported on this platform" +msgstr "" + +#: src/tar.c:1577 +msgid "--checkpoint value is not an integer" +msgstr "" + +#: src/tar.c:1678 +#, c-format +msgid "%s: Invalid group" +msgstr "%s:無效的群組" + +#: src/tar.c:1685 +msgid "Invalid mode given on option" +msgstr "選項中的模式無效" + +#: src/tar.c:1738 +msgid "Invalid number" +msgstr "無效的號碼" + +#: src/tar.c:1760 +msgid "Invalid owner" +msgstr "無效的擁有者" + +#: src/tar.c:1794 +msgid "Invalid record size" +msgstr "無效的紀錄大小" + +#: src/tar.c:1797 +#, c-format +msgid "Record size must be a multiple of %d." +msgstr "紀錄大小必須是 %d 的倍數。" + +#: src/tar.c:1834 +msgid "Invalid number of elements" +msgstr "無效的元素號碼" + +#: src/tar.c:1854 +msgid "Only one --to-command option allowed" +msgstr "" + +#: src/tar.c:1930 +#, fuzzy, c-format +msgid "Malformed density argument: %s" +msgstr "未成形的密度引數: '%s'" + +#: src/tar.c:1956 +#, fuzzy, c-format +msgid "Unknown density: `%c'" +msgstr "未知的密度: '%c'" + +#: src/tar.c:1973 +#, c-format +msgid "Options `-[0-7][lmh]' not supported by *this* tar" +msgstr "此版本的 tar 不支援‘-[0-7][lmh]’選項" + +#: src/tar.c:2008 +msgid "[FILE]..." +msgstr "[FILE]..." + +#: src/tar.c:2114 +#, c-format +msgid "Old option `%c' requires an argument." +msgstr "舊式的選項‘%c’需要引數。" + +#: src/tar.c:2196 +msgid "--occurrence is meaningless without a file list" +msgstr "若無檔案列表,--occurrence 便不具意義" + +#: src/tar.c:2202 +msgid "--occurrence cannot be used in the requested operation mode" +msgstr "--occurrence 不可使用於要求的作業模式" + +#: src/tar.c:2232 +msgid "Multiple archive files require `-M' option" +msgstr "指定多個保存檔時需要‘-M’選項" + +#: src/tar.c:2237 +msgid "Cannot combine --listed-incremental with --newer" +msgstr "無法同時使用 --listed-incremental 及 --newer 選項" + +#: src/tar.c:2254 +#, 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:2267 +msgid "Cannot verify multi-volume archives" +msgstr "無法檢驗多重卷冊的保存檔" + +#: src/tar.c:2269 +msgid "Cannot verify compressed archives" +msgstr "無法檢驗壓縮的保存檔" + +#: src/tar.c:2275 +msgid "Cannot use multi-volume compressed archives" +msgstr "無法使用多重卷冊的壓縮保存檔" + +#: src/tar.c:2281 +#, fuzzy +msgid "Cannot concatenate compressed archives" +msgstr "無法更新壓縮的保存檔" + +#: src/tar.c:2293 +msgid "--pax-option can be used only on POSIX archives" +msgstr "--pax-option 只能用於 POSIX 保存檔" + +#: src/tar.c:2318 +msgid "Cowardly refusing to create an empty archive" +msgstr "拒絕建立空白的保存檔" + +#: src/tar.c:2343 +msgid "Options `-Aru' are incompatible with `-f -'" +msgstr "‘-Aru’及‘-f -’選項互不兼容" + +#: src/tar.c:2432 +msgid "You must specify one of the `-Acdtrux' options" +msgstr "必須指定‘-Acdtrux’選項的其中一個" + +#: src/tar.c:2483 +#, 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 "未成形的擴充標頭:缺少等號" + +#: src/checkpoint.c:107 +#, fuzzy, c-format +msgid "%s: not a valid timeout" +msgstr "%s:無效的群組" + +#: src/checkpoint.c:112 +#, c-format +msgid "%s: unknown checkpoint action" +msgstr "" + +#: src/checkpoint.c:132 +msgid "write" +msgstr "" + +#: src/checkpoint.c:132 +msgid "read" +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/checkpoint.c:222 +#, 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/checkpoint.c:228 +#, fuzzy, c-format +msgid "Read checkpoint %u" +msgstr "讀入檢查點 %d" + +#: tests/genfile.c:111 +msgid "" +"genfile manipulates data files for GNU paxutils test suite.\n" +"OPTIONS are:\n" +msgstr "" + +#: tests/genfile.c:126 +#, fuzzy +msgid "File creation options:" +msgstr "其他選項:" + +#: tests/genfile.c:127 tests/genfile.c:138 +msgid "SIZE" +msgstr "" + +#: tests/genfile.c:128 +#, fuzzy +msgid "Create file of the given SIZE" +msgstr "以給定格式建立保存檔。" + +#: tests/genfile.c:130 +#, fuzzy +msgid "Write to file NAME, instead of standard output" +msgstr "解開檔案至標準輸出" + +#: tests/genfile.c:132 +#, fuzzy +msgid "Read file names from FILE" +msgstr "讀取 %s 位元組自 %s " + +#: tests/genfile.c:134 +#, fuzzy +msgid "-T reads null-terminated names" +msgstr "-T 讀取零值終結的名稱,停用 -C" + +#: tests/genfile.c:136 +msgid "Fill the file with the given PATTERN. PATTERN is 'default' or 'zeros'" +msgstr "" + +#: tests/genfile.c:139 +msgid "Size of a block for sparse file" +msgstr "" + +#: tests/genfile.c:141 +msgid "Generate sparse file. Rest of the command line gives the file map." +msgstr "" + +#: tests/genfile.c:143 +msgid "OFFSET" +msgstr "" + +#: tests/genfile.c:144 +#, fuzzy +msgid "Seek to the given offset before writing data" +msgstr "嘗試在寫入之後驗證保存檔" + +#: tests/genfile.c:150 +msgid "File statistics options:" +msgstr "" + +#: tests/genfile.c:153 +msgid "Print contents of struct stat for each given file. Default FORMAT is: " +msgstr "" + +#: tests/genfile.c:160 +msgid "Synchronous execution options:" +msgstr "" + +#: tests/genfile.c:163 +msgid "" +"Execute given COMMAND. Useful with --checkpoint and one of --cut, --append, " +"--touch" +msgstr "" + +#: tests/genfile.c:166 +msgid "Perform given action (see below) upon reaching checkpoint NUMBER" +msgstr "" + +#: tests/genfile.c:169 +msgid "Set date for next --touch option" +msgstr "" + +#: tests/genfile.c:172 +msgid "Display executed checkpoints and exit status of COMMAND" +msgstr "" + +#: tests/genfile.c:177 +msgid "" +"Synchronous execution actions. These are executed when checkpoint number " +"given by --checkpoint option is reached." +msgstr "" + +#: tests/genfile.c:180 +msgid "" +"Truncate FILE to the size specified by previous --length option (or 0, if it " +"is not given)" +msgstr "" + +#: tests/genfile.c:184 +msgid "Append SIZE bytes to FILE. SIZE is given by previous --length option." +msgstr "" + +#: tests/genfile.c:187 +msgid "Update the access and modification times of FILE" +msgstr "" + +#: tests/genfile.c:190 +#, fuzzy +msgid "Execute COMMAND" +msgstr "命令" + +#: tests/genfile.c:240 +#, fuzzy, c-format +msgid "Invalid size: %s" +msgstr "無效的時間標記" + +#: tests/genfile.c:245 +#, fuzzy, c-format +msgid "Number out of allowed range: %s" +msgstr "Inode 號碼超出範圍以外" + +#: tests/genfile.c:248 +#, c-format +msgid "Negative size: %s" +msgstr "" + +#: tests/genfile.c:261 tests/genfile.c:560 +#, c-format +msgid "stat(%s) failed" +msgstr "" + +#: tests/genfile.c:355 +#, c-format +msgid "Error parsing number near `%s'" +msgstr "" + +#: tests/genfile.c:361 +#, fuzzy, c-format +msgid "Unknown date format" +msgstr "不明的系統錯誤" + +#: tests/genfile.c:384 +msgid "[ARGS...]" +msgstr "" + +#: tests/genfile.c:421 tests/genfile.c:461 tests/genfile.c:514 +#: tests/genfile.c:664 tests/genfile.c:678 +#, c-format +msgid "cannot open `%s'" +msgstr "" + +#: tests/genfile.c:427 +#, fuzzy +msgid "cannot seek" +msgstr "close 程序失敗" + +#: tests/genfile.c:444 +#, c-format +msgid "file name contains null character" +msgstr "" + +#: tests/genfile.c:509 +#, c-format +msgid "cannot generate sparse files on standard output, use --file option" +msgstr "" + +#: tests/genfile.c:587 +#, c-format +msgid "incorrect mask (near `%s')" +msgstr "" + +#: tests/genfile.c:593 tests/genfile.c:626 +#, fuzzy, c-format +msgid "Unknown field `%s'" +msgstr "不明的檔案類型 %s\n" + +#: tests/genfile.c:653 +#, fuzzy, c-format +msgid "cannot set time on `%s'" +msgstr "%s:無法搜尋至 %s" + +#: tests/genfile.c:807 +#, c-format +msgid "Command exited successfully\n" +msgstr "" + +#: tests/genfile.c:809 +#, fuzzy, c-format +msgid "Command failed with status %d\n" +msgstr "副程序因訊號 %d 而突然終止" + +#: tests/genfile.c:813 +#, c-format +msgid "Command terminated on signal %d\n" +msgstr "" + +#: tests/genfile.c:815 +#, c-format +msgid "Command stopped on signal %d\n" +msgstr "" + +#: tests/genfile.c:818 +#, c-format +msgid "Command dumped core\n" +msgstr "" + +#: tests/genfile.c:821 +#, c-format +msgid "Command terminated\n" +msgstr "" + +#: tests/genfile.c:853 +#, fuzzy, c-format +msgid "--stat requires file names" +msgstr "--損毀的檔案名稱--\n" + +#: tests/genfile.c:866 +#, c-format +msgid "too many arguments" +msgstr "" + +#~ msgid "block size" +#~ 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 "" +#~ "此軟體在法律允許的限度之下不附帶任何保證。你可以根據 GNU General Public\n" +#~ "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 "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 "排除樣式會使用萬用字元 (預設)" + +#~ 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 與 Jay 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 是自由軟體, 您可以在自由軟體基金會所出版的 GNU\n" +#~ " 一般公用授權書的規範下加以重新散發或且修改; 不管是第二\n" +#~ " 或 (你認為的) 更後面的版本皆可.\n" +#~ "\n" +#~ " GNU tar 的散發只是希望它能有所用途而不附有任何的保證!\n" +#~ " 甚至也不暗示它有商品價值或能合用於特定的目的. 細節請見\n" +#~ " GNU 一般公用授權書.\n" +#~ "\n" +#~ " 正常情況下, 您在收到這個軟體的同時, 也應該收到 GNU\n" +#~ " 一般公用授權書, 如果沒有, 請連絡自由軟體基金會, 地址是:\n" +#~ " 59 Temple Place - Suite 330, Boston, MA 02111-1307,\n" +#~ " USA.\n" +#~ "\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 "Cannot dup" +#~ msgstr "dup 程序失敗" + +#~ msgid "Cannot use compressed or remote archives" +#~ msgstr "無法使用壓縮或遠端保存檔" + +#~ msgid "Child returned status %d" +#~ msgstr "副程序回傳值為 %d" + +#~ 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 only append files newer than copy in archive\n" +#~ " -A, --catenate 在保存檔後加上 tar 檔案\n" +#~ " --concatenate 等於 -A\n" +#~ " --delete 由保存檔中刪除檔案 (不是由磁帶刪除)\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 "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 "Obsolete option name replaced by --backup" +#~ msgstr "此過時的選項名稱已由 --backup 代替" + +#~ msgid "Written by John Gilmore and Jay Fenlason." +#~ msgstr "由 John Gilmore 及 Jay Fenlason 編寫。" + +#~ msgid "" +#~ "Copyright (C) %s Free Software Foundation, Inc.\n" +#~ "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 "" +#~ "版權所有 (C) %s Free Software Foundation, Inc.\n" +#~ "這是自由軟體;請參考原始碼的版權聲明。本軟體不提供任何保證,甚至不會包括\n" +#~ "可售性或適用於任何特定目的的保證。\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 "" +#~ "這是自由軟體;請參考原始碼的版權聲明。本軟體不提供任何保證,甚至不會包括\n" +#~ "可售性或適用於任何特定目的的保證。\n" + +#~ msgid "" +#~ "This program 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, or (at your option)\n" +#~ "any later version.\n" +#~ "\n" +#~ msgstr "" +#~ "本程式是自由軟體;你可以根據 Free Software Foundation 所公佈的 GNU\n" +#~ "General Public License 第二版或(自由選擇)較新的版本中的條款去重新\n" +#~ "散佈及/或修改本軟體。\n" +#~ "\n" + +#~ msgid "" +#~ "This program is distributed in the hope that it will be useful,\n" +#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +#~ "GNU General Public License for more details.\n" +#~ "\n" +#~ msgstr "" +#~ "發佈本軟體是希望它會有用,但不會提供任何保證,甚至不會包括可售性或\n" +#~ "適用於任何特定目的的保證。詳情請參考 GNU General Public License。\n" +#~ "\n" + +#~ msgid "" +#~ "You should have received a copy of the GNU General Public License\n" +#~ "along with this program; if not, write to the Free Software Foundation,\n" +#~ "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" +#~ msgstr "" +#~ "你應該已經隨本軟體收到一份 GNU General Public License;否則請寄信至\n" +#~ "Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n" +#~ "MA 02111-1307, USA.\n" 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..45889c5 --- /dev/null +++ b/rmt/Makefile.in @@ -0,0 +1,799 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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.@am__isrc@ -I$(top_builddir) +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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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 &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; nonemtpy = 1; } \ + END { if (nonempty) { 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; nonempty = 1; } \ + END { if (nonempty) { 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=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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..a043dd0 --- /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, 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +#include +#include +#include +#include +#define obstack_chunk_alloc malloc +#define obstack_chunk_free free +#include +#include +#include + +#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..7576c17 --- /dev/null +++ b/scripts/Makefile.am @@ -0,0 +1,49 @@ +# Copyright (C) 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 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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..268cee7 --- /dev/null +++ b/scripts/Makefile.in @@ -0,0 +1,772 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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, 2007 Free Software Foundation, Inc. + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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 &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 &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..47d4f16 --- /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, 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 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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 - <&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 <&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 - <. +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 - < $LOGFILE <&1 | tee -a "${LOGFILE}" + +# EOF diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..c22a568 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,48 @@ +# Makefile for GNU tar sources. + +# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 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 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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\ + checkpoint.c\ + compare.c\ + create.c\ + delete.c\ + extract.c\ + xheader.c\ + incremen.c\ + list.c\ + misc.c\ + names.c\ + sparse.c\ + suffix.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..d97b1c6 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,846 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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, +# 2007 Free Software Foundation, Inc. + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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) checkpoint.$(OBJEXT) \ + compare.$(OBJEXT) create.$(OBJEXT) delete.$(OBJEXT) \ + extract.$(OBJEXT) xheader.$(OBJEXT) incremen.$(OBJEXT) \ + list.$(OBJEXT) misc.$(OBJEXT) names.$(OBJEXT) sparse.$(OBJEXT) \ + suffix.$(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.@am__isrc@ -I$(top_builddir) +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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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\ + checkpoint.c\ + compare.c\ + create.c\ + delete.c\ + extract.c\ + xheader.c\ + incremen.c\ + list.c\ + misc.c\ + names.c\ + sparse.c\ + suffix.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 &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)/checkpoint.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)/suffix.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; nonemtpy = 1; } \ + END { if (nonempty) { 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; nonempty = 1; } \ + END { if (nonempty) { 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=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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..bcd1c0a --- /dev/null +++ b/src/arith.h @@ -0,0 +1,27 @@ +/* Long integers, for GNU tar. + Copyright 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, 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..8f8b43f --- /dev/null +++ b/src/buffer.c @@ -0,0 +1,1676 @@ +/* Buffer management for tar. + + 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 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include + +#include + +#include +#include +#include +#include + +#include "common.h" +#include + +/* 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; + +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, + ct_lzma +}; + +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" }, + { ct_lzma, 6, "\xFFLZMA", "lzma", "--lzma" }, /* FIXME: ???? */ +}; + +#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 (bool *pshort) +{ + struct zip_magic const *p; + bool sfr; + bool temp; + + if (!pshort) + pshort = &temp; + + /* 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 */ + *pshort = find_next_block () == 0; + + /* 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) + { + bool shortfile; + enum compress_type type = check_compressed_archive (&shortfile); + + if (type == ct_none) + { + if (shortfile) + ERROR ((0, 0, _("This does not look like a tar archive"))); + 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 (¤t_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: + { + bool shortfile; + enum compress_type type; + + archive = STDIN_FILENO; + + type = check_compressed_archive (&shortfile); + if (type != ct_none) + FATAL_ERROR ((0, 0, + _("Archive is compressed. Use %s option"), + compress_option (type))); + if (shortfile) + ERROR ((0, 0, _("This does not look like a tar archive"))); + } + 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 (NULL) != 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; + } +} + +/* Perform a write to flush the buffer. */ +ssize_t +_flush_write (void) +{ + ssize_t status; + + checkpoint_run (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_error (*archive_name_cursor); + + sys_wait_for_child (child_pid); + + tar_stat_destroy (¤t_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_error (*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; + enum access_mode acc; + + switch (subcommand_option) + { + case APPEND_SUBCOMMAND: + case CAT_SUBCOMMAND: + case UPDATE_SUBCOMMAND: + acc = ACCESS_UPDATE; + break; + + default: + acc = ACCESS_READ; + break; + } + + if (!new_volume (acc)) + 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 (¤t_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 (¤t_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 (¤t_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 */ + + checkpoint_run (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 */ + + checkpoint_run (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/checkpoint.c b/src/checkpoint.c new file mode 100644 index 0000000..cde5e59 --- /dev/null +++ b/src/checkpoint.c @@ -0,0 +1,270 @@ +/* Checkpoint management for 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program. If not, see . */ + +#include +#include "common.h" + +enum checkpoint_opcode + { + cop_dot, + cop_bell, + cop_echo, + cop_ttyout, + cop_sleep, + cop_exec + }; + +struct checkpoint_action +{ + struct checkpoint_action *next; + enum checkpoint_opcode opcode; + union + { + time_t time; + char *command; + } v; +}; + +/* Checkpointing counter */ +static unsigned checkpoint; + +/* List of checkpoint actions */ +static struct checkpoint_action *checkpoint_action, *checkpoint_action_tail; + +static struct checkpoint_action * +alloc_action (enum checkpoint_opcode opcode) +{ + struct checkpoint_action *p = xzalloc (sizeof *p); + if (checkpoint_action_tail) + checkpoint_action_tail->next = p; + else + checkpoint_action = p; + checkpoint_action_tail = p; + p->opcode = opcode; + return p; +} + +static char * +copy_string_unquote (const char *str) +{ + char *output = xstrdup (str); + size_t len = strlen (output); + if ((*output == '"' || *output == '\'') + && output[len-1] == *output) + { + memmove (output, output+1, len-2); + output[len-2] = 0; + } + unquote_string (output); + return output; +} + +void +checkpoint_compile_action (const char *str) +{ + struct checkpoint_action *act; + + if (strcmp (str, ".") == 0 || strcmp (str, "dot") == 0) + alloc_action (cop_dot); + if (strcmp (str, "bell") == 0) + alloc_action (cop_bell); + else if (strcmp (str, "echo") == 0) + alloc_action (cop_echo); + else if (strncmp (str, "echo=", 5) == 0) + { + act = alloc_action (cop_echo); + act->v.command = copy_string_unquote (str + 5); + } + else if (strncmp (str, "exec=", 5) == 0) + { + act = alloc_action (cop_exec); + act->v.command = copy_string_unquote (str + 5); + } + else if (strncmp (str, "ttyout=", 7) == 0) + { + act = alloc_action (cop_ttyout); + act->v.command = copy_string_unquote (str + 7); + } + else if (strncmp (str, "sleep=", 6) == 0) + { + char *p; + time_t n = strtoul (str+6, &p, 10); + if (*p) + FATAL_ERROR ((0, 0, _("%s: not a valid timeout"), str)); + act = alloc_action (cop_sleep); + act->v.time = n; + } + else + FATAL_ERROR ((0, 0, _("%s: unknown checkpoint action"), str)); +} + +void +checkpoint_finish_compile () +{ + if (checkpoint_option) + { + if (!checkpoint_action) + /* Provide a historical default */ + checkpoint_compile_action ("echo"); + } + else if (checkpoint_action) + /* Otherwise, set default checkpoint rate */ + checkpoint_option = DEFAULT_CHECKPOINT; +} + +char * +expand_checkpoint_string (const char *input, bool do_write, unsigned cpn) +{ + const char *opstr = do_write ? gettext ("write") : gettext ("read"); + size_t opstrlen = strlen (opstr); + char uintbuf[UINTMAX_STRSIZE_BOUND]; + char *cps = STRINGIFY_BIGINT (cpn, uintbuf); + size_t cpslen = strlen (cps); + const char *ip; + char *op; + char *output; + size_t outlen = strlen (input); /* Initial guess */ + + /* Fix the initial length guess */ + for (ip = input; (ip = strchr (ip, '%')) != NULL; ) + { + switch (ip[1]) + { + case 'u': + outlen += cpslen - 2; + break; + + case 's': + outlen += opstrlen - 2; + } + ip++; + } + + output = xmalloc (outlen + 1); + for (ip = input, op = output; *ip; ) + { + if (*ip == '%') + { + switch (*++ip) + { + case 'u': + op = stpcpy (op, cps); + break; + + case 's': + op = stpcpy (op, opstr); + break; + + default: + *op++ = '%'; + *op++ = *ip; + break; + } + ip++; + } + else + *op++ = *ip++; + } + *op = 0; + return output; +} + +static void +run_checkpoint_actions (bool do_write) +{ + struct checkpoint_action *p; + FILE *tty = NULL; + + for (p = checkpoint_action; p; p = p->next) + { + switch (p->opcode) + { + case cop_dot: + fputc ('.', stdlis); + fflush (stdlis); + break; + + case cop_bell: + if (!tty) + tty = fopen ("/dev/tty", "w"); + if (tty) + { + fputc ('\a', tty); + fflush (tty); + } + break; + + case cop_echo: + { + char *tmp; + const char *str = p->v.command; + if (!str) + { + if (do_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'' */ + str = gettext ("Write checkpoint %u"); + 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'' */ + str = gettext ("Read checkpoint %u"); + } + tmp = expand_checkpoint_string (str, do_write, checkpoint); + WARN ((0, 0, "%s", tmp)); + free (tmp); + } + break; + + case cop_ttyout: + if (!tty) + tty = fopen ("/dev/tty", "w"); + if (tty) + { + char *tmp = expand_checkpoint_string (p->v.command, do_write, + checkpoint); + fprintf (tty, "%s", tmp); + fflush (tty); + free (tmp); + } + break; + + case cop_sleep: + sleep (p->v.time); + break; + + case cop_exec: + sys_exec_checkpoint_script (p->v.command, + archive_name_cursor[0], + checkpoint); + break; + } + } + if (tty) + fclose (tty); +} + +void +checkpoint_run (bool do_write) +{ + if (checkpoint_option && !(++checkpoint % checkpoint_option)) + run_checkpoint_actions (do_write); +} + diff --git a/src/common.h b/src/common.h new file mode 100644 index 0000000..f43673b --- /dev/null +++ b/src/common.h @@ -0,0 +1,759 @@ +/* Common declarations for the tar program. + + Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +#include +#include +#include +#include +#include +#include +#include +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free +#include + +#include + +/* 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; +#define DEFAULT_CHECKPOINT 10 + +/* Specified name of compression program, or "gzip" as implied by -z. */ +GLOBAL const char *use_compress_program_option; + +GLOBAL bool dereference_option; +GLOBAL bool hard_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; +/* Check device numbers when doing incremental dumps. */ +GLOBAL bool check_device_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); +void exclusion_tag_warning (const char *dirname, const char *tagname, + const char *message); +enum exclusion_tag_type check_exclusion_tags (char *dirname, + const char **tag_file_name); + +#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. */ +typedef struct dumpdir *dumpdir_t; +typedef struct dumpdir_iter *dumpdir_iter_t; + +dumpdir_t dumpdir_create0 (const char *contents, const char *cmask); +dumpdir_t dumpdir_create (const char *contents); +void dumpdir_free (dumpdir_t); +char *dumpdir_locate (dumpdir_t dump, const char *name); +char *dumpdir_next (dumpdir_iter_t itr); +char *dumpdir_first (dumpdir_t dump, int all, dumpdir_iter_t *pitr); + + +const 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); +void sys_exec_checkpoint_script (const char *script_name, + const char *archive_name, + int checkpoint_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 *); + +/* Module suffix.c */ +void set_comression_program_by_suffix (const char *name, const char *defprog); + +/* Module checkpoint.c */ +void checkpoint_compile_action (const char *str); +void checkpoint_finish_compile (void); +void checkpoint_run (bool do_write); diff --git a/src/compare.c b/src/compare.c new file mode 100644 index 0000000..66205cb --- /dev/null +++ b/src/compare.c @@ -0,0 +1,623 @@ +/* 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include + +#if HAVE_LINUX_FD_H +# include +#endif + +#include "common.h" +#include +#include +#include + +/* 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 (¤t_stat_info, NULL); + } + else + { + report_difference (¤t_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 (¤t_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 (¤t_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 (¤t_stat_info, _("File type differs")); + else if ((current_stat_info.stat.st_mode & MODE_ALL) != + (stat_data.st_mode & MODE_ALL)) + report_difference (¤t_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 (¤t_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 (¤t_stat_info, _("Mode differs")); + + if (!sys_compare_uid (&stat_data, ¤t_stat_info.stat)) + report_difference (¤t_stat_info, _("Uid differs")); + if (!sys_compare_gid (&stat_data, ¤t_stat_info.stat)) + report_difference (¤t_stat_info, _("Gid differs")); + + if (tar_timespec_cmp (get_stat_mtime (&stat_data), + current_stat_info.mtime)) + report_difference (¤t_stat_info, _("Mod time differs")); + if (current_header->header.typeflag != GNUTYPE_SPARSE + && stat_data.st_size != current_stat_info.stat.st_size) + { + report_difference (¤t_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 (¤t_stat_info, NULL); + } + else + { + int status; + + if (current_stat_info.is_sparse) + sparse_diff_file (diff_handle, ¤t_stat_info); + else + read_and_process (¤t_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 (¤t_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 (¤t_stat_info, NULL); + } + else if (status != len + || strncmp (current_stat_info.link_name, linkbuf, len) != 0) + report_difference (¤t_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 (¤t_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 (¤t_stat_info, _("Device number differs")); + return; + } + + if ((current_stat_info.stat.st_mode & MODE_ALL) != + (stat_data.st_mode & MODE_ALL)) + report_difference (¤t_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) +{ + const char *dumpdir_buffer; + dev_t dev = 0; + struct stat stat_data; + + if (deref_stat (true, current_stat_info.file_name, &stat_data)) + { + if (errno == ENOENT) + stat_warn (current_stat_info.file_name); + else + stat_error (current_stat_info.file_name); + } + else + dev = stat_data.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 (¤t_stat_info, _("Contents differ")); + } + else + read_and_process (¤t_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 (¤t_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 (¤t_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 (¤t_stat_info, NULL); + skip_member (); + return; + } + + if (lseek (fd, offset, SEEK_SET) < 0) + { + seek_error_details (current_stat_info.file_name, offset); + report_difference (¤t_stat_info, NULL); + return; + } + + read_and_process (¤t_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, ¤t_stat_info, ¤t_format, 1); + + /* Print the block from current_header and current_stat_info. */ + + if (verbose_option) + { + if (now_verifying) + fprintf (stdlis, _("Verify ")); + print_header (¤t_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 (¤t_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_END_OF_FILE) + break; + if (status == HEADER_ZERO_BLOCK) + { + 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))); + } + } + + diff_archive (); + tar_stat_destroy (¤t_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..413115c --- /dev/null +++ b/src/create.c @@ -0,0 +1,1791 @@ +/* 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include + +#include "common.h" +#include + +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; +} + +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)); +} + +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); + int addslash = dirname[dlen-1] != '/'; + char *nptr = NULL; + + for (tag = exclusion_tags; tag; tag = tag->next) + { + size_t size = dlen + addslash + tag->length + 1; + if (size > tagsize) + { + tagsize = size; + tagname = xrealloc (tagname, tagsize); + } + + if (!nptr) + { + strcpy (tagname, dirname); + nptr = tagname + dlen; + if (addslash) + *nptr++ = '/'; + } + 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; + 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_all: + /* Handled in dump_file0 */ + break; + + case exclusion_tag_none: + { + 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 (hard_dereference_option) + return; + 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 (); + file_count_links (st); + break; + + case dump_status_fail: + break; + + case dump_status_not_implemented: + abort (); + } + + 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); + transform_name (&st->link_name); + 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, st->link_name, 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..d59a857 --- /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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include + +#include "common.h" +#include + +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 (¤t_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..0d938e6 --- /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, 2007 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include +#include +#include + +#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, + ¤t_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 + */ + || 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, ¤t_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 sb; + sb.stat.st_mode = data->mode; + sb.stat.st_uid = data->uid; + sb.stat.st_gid = data->gid; + sb.atime = data->atime; + sb.mtime = data->mtime; + set_stat (data->file_name, &sb, 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, ¤t_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, ¤t_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', ¤t_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 (¤t_stat_info); + if (current_stat_info.is_sparse) + sparse_extract_file (fd, ¤t_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, ¤t_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 (¤t_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 (¤t_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, ¤t_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, ¤t_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, ¤t_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, ¤t_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, ¤t_stat_info, ¤t_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 (¤t_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 (¤t_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..372061d --- /dev/null +++ b/src/incremen.c @@ -0,0 +1,1625 @@ +/* GNU dump extensions to tar. + + Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include +#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) + +struct dumpdir /* Dump directory listing */ +{ + char *contents; /* Actual contents */ + size_t total; /* Total number of elements */ + size_t elc; /* Number of D/N/Y elements. */ + char **elv; /* Array of D/N/Y elements */ +}; + +/* 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 */ + struct dumpdir *dump; /* Directory contents */ + struct dumpdir *idump; /* 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 */ + const char *tagfile; /* Tag file, if the directory falls under + exclusion_tag_under */ + char name[1]; /* file name of directory */ + }; + +struct dumpdir * +dumpdir_create0 (const char *contents, const char *cmask) +{ + struct dumpdir *dump; + size_t i, total, ctsize, len; + const char *p; + + for (i = 0, total = 0, ctsize = 1, p = contents; *p; total++, p += len) + { + len = strlen (p) + 1; + ctsize += len; + if (!cmask || strchr (cmask, *p)) + i++; + } + dump = xmalloc (sizeof (*dump) + ctsize); + dump->contents = (char*)(dump + 1); + memcpy (dump->contents, contents, ctsize); + dump->total = total; + dump->elc = i; + dump->elv = xcalloc (i + 1, sizeof (dump->elv[0])); + + for (i = 0, p = dump->contents; *p; p += strlen (p) + 1) + { + if (!cmask || strchr (cmask, *p)) + dump->elv[i++] = p + 1; + } + dump->elv[i] = NULL; + return dump; +} + +struct dumpdir * +dumpdir_create (const char *contents) +{ + return dumpdir_create0 (contents, "YND"); +} + +void +dumpdir_free (struct dumpdir *dump) +{ + free (dump->elv); + free (dump); +} + +static int +compare_dirnames (const void *first, const void *second) +{ + char const *const *name1 = first; + char const *const *name2 = second; + return strcmp (*name1, *name2); +} + +/* Locate NAME in the dumpdir array DUMP. + Return pointer to the slot in DUMP->contents, or NULL if not found */ +char * +dumpdir_locate (struct dumpdir *dump, const char *name) +{ + char **ptr; + if (!dump) + return NULL; + + ptr = bsearch (&name, dump->elv, dump->elc, sizeof (dump->elv[0]), + compare_dirnames); + return ptr ? *ptr - 1: NULL; +} + +struct dumpdir_iter +{ + struct dumpdir *dump; /* Dumpdir being iterated */ + int all; /* Iterate over all entries, not only D/N/Y */ + size_t next; /* Index of the next element */ +}; + +char * +dumpdir_next (struct dumpdir_iter *itr) +{ + size_t cur = itr->next; + char *ret = NULL; + + if (itr->all) + { + ret = itr->dump->contents + cur; + if (*ret == 0) + return NULL; + itr->next += strlen (ret) + 1; + } + else if (cur < itr->dump->elc) + { + ret = itr->dump->elv[cur] - 1; + itr->next++; + } + + return ret; +} + +char * +dumpdir_first (struct dumpdir *dump, int all, struct dumpdir_iter **pitr) +{ + struct dumpdir_iter *itr = xmalloc (sizeof (*itr)); + itr->dump = dump; + itr->all = all; + itr->next = 0; + *pitr = itr; + return dumpdir_next (itr); +} + +/* 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 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->dump = directory->idump = NULL; + directory->orig = NULL; + directory->flags = false; + strcpy (directory->name, name); + if (namelen && ISSLASH (directory->name[namelen - 1])) + directory->name[namelen - 1] = 0; + directory->tagfile = NULL; + 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, + const 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) + directory->dump = dumpdir_create (contents); + else + directory->dump = 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, + char *entry) +{ + 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 (! ((!check_device_option + || (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); + + { + const char *tag_file_name; + + switch (check_exclusion_tags (name_buffer, &tag_file_name)) + { + case exclusion_tag_all: + /* This warning can be duplicated by code in dump_file0, but only + in case when the topmost directory being archived contains + an exclusion tag. */ + exclusion_tag_warning (name_buffer, tag_file_name, + _("directory not dumped")); + if (entry) + *entry = 'N'; + directory->children = NO_CHILDREN; + break; + + case exclusion_tag_contents: + exclusion_tag_warning (name_buffer, tag_file_name, + _("contents not dumped")); + directory->children = NO_CHILDREN; + break; + + case exclusion_tag_under: + exclusion_tag_warning (name_buffer, tag_file_name, + _("contents not dumped")); + directory->tagfile = tag_file_name; + break; + + case exclusion_tag_none: + break; + } + } + + return directory; +} + +/* 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->dump->contents must be sorted + alphabetically. + + DIRECTORY->dump 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; + struct dumpdir *dump; + + if (directory->children == ALL_CHILDREN) + dump = NULL; + else if (DIR_IS_RENAMED (directory)) + dump = directory->orig->idump ? + directory->orig->idump : directory->orig->dump; + else + dump = directory->dump; + + /* 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) + { + if (directory->tagfile) + *new_dump_ptr = strcmp (directory->tagfile, array[i]) == 0 ? + ' ' : 'I'; + else + *new_dump_ptr = ' '; + new_dump_ptr++; + } + else if (directory->tagfile) + *new_dump_ptr++ = strcmp (directory->tagfile, array[i]) == 0 ? + ' ' : 'I'; + else + *new_dump_ptr++ = 'Y'; /* New entry */ + + /* Copy the file name */ + for (p = array[i]; (*new_dump_ptr++ = *p++); ) + ; + } + *new_dump_ptr = 0; + directory->idump = directory->dump; + directory->dump = dumpdir_create0 (new_dump, NULL); + free (array); +} + +/* Recursively scan the given directory. */ +static const char * +scan_directory (char *dir, dev_t device) +{ + char *dirp = savedir (dir); /* 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_buffer_size = strlen (dir) + NAME_FIELD_SIZE; + name_buffer = xmalloc (name_buffer_size + 2); + strcpy (name_buffer, dir); + if (! ISSLASH (dir[strlen (dir) - 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, + NULL); + + if (dirp && directory->children != NO_CHILDREN) + { + char *entry; /* directory entry being scanned */ + size_t entrylen; /* length of directory entry */ + dumpdir_iter_t itr; + + makedumpdir (directory, dirp); + + for (entry = dumpdir_first (directory->dump, 1, &itr); + entry; + entry = dumpdir_next (itr)) + { + entrylen = strlen (entry); + 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 (*entry == 'I') /* Ignored entry */ + *entry = 'N'; + else 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)) + { + *entry = 'D'; + procdir (name_buffer, &stat_data, device, + directory->children, + verbose_option, entry); + } + + 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 (itr); + } + + free (name_buffer); + if (dirp) + free (dirp); + + return directory->dump ? directory->dump->contents : NULL; +} + +const char * +get_directory_contents (char *dir, dev_t device) +{ + return scan_directory (dir, device); +} + + +static void +obstack_code_rename (struct obstack *stk, char *from, char *to) +{ + char *s; + + s = from[0] == 0 ? from : + safer_name_suffix (from, false, absolute_names_option); + obstack_1grow (stk, 'R'); + obstack_grow (stk, s, strlen (s) + 1); + + s = to[0] == 0 ? to: + safer_name_suffix (to, false, absolute_names_option); + obstack_1grow (stk, 'T'); + obstack_grow (stk, s, strlen (s) + 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->dump) + { + const char *p; + dumpdir_iter_t itr; + + for (p = dumpdir_first (directory->dump, 0, &itr); + p; + p = dumpdir_next (itr)) + fwrite (p, strlen (p) + 1, 1, fp); + free (itr); + } + 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; + struct dumpdir *dump; + + if (!is_dumpdir (¤t_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; + + /* Ensure that neither source nor destination are absolute file + names (unless permitted by -P option), and that they do not + contain dubious parts (e.g. ../). + + This is an extra safety precaution. Besides, it might be + necessary to extract from archives created with tar versions + prior to 1.19. */ + + if (*src) + src = safer_name_suffix (src, false, absolute_names_option); + if (*dst) + dst = safer_name_suffix (dst, false, absolute_names_option); + + 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 */ + dump = dumpdir_create (current_stat_info.dumpdir); + 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 (dump, 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); + dumpdir_free (dump); + + 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..b17f604 --- /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, 2007 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include + +#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 (¤t_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, + ¤t_stat_info, ¤t_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 (¤t_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, ¤t_stat_info, ¤t_format, 0); + if (verbose_option) + print_header (¤t_stat_info, block_ordinal); + + if (incremental_option) + { + if (verbose_option > 2) + { + if (is_dumpdir (¤t_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 = 0; + size_t next_long_link_blocks = 0; + + 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 = ¤t_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, ¤t_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 (¤t_stat_info); + + if (current_stat_info.is_sparse) + sparse_skip_file (¤t_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..951449e --- /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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include "common.h" +#include +#include +#include +#include +#include + +#if HAVE_STROPTS_H +# include +#endif +#if HAVE_SYS_FILIO_H +# include +#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..73b8741 --- /dev/null +++ b/src/names.c @@ -0,0 +1,1021 @@ +/* Various processing of names. + + Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include +#include +#include + +#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; + const 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? */ + const 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; + + while (! ISSLASH (*p)) + { + if (! *p++) + return 0; + } + } +} diff --git a/src/sparse.c b/src/sparse.c new file mode 100644 index 0000000..9fde508 --- /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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include +#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/suffix.c b/src/suffix.c new file mode 100644 index 0000000..fcf2297 --- /dev/null +++ b/src/suffix.c @@ -0,0 +1,78 @@ +/* This file is part of GNU tar. + Copyright (C) 2007 Free Software Foundation, Inc. + + Written by Sergey Poznyakoff. + + 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 3, 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, see . */ + +#include +#include "common.h" + +struct compression_suffix +{ + const char *suffix; + size_t length; + const char *program; +}; + +struct compression_suffix compression_suffixes[] = { +#define S(s,p) #s, sizeof (#s) - 1, #p + { S(gz, gzip) }, + { S(tgz, gzip) }, + { S(taz, gzip) }, + { S(Z, compress) }, + { S(taZ, compress) }, + { S(bz2, bzip2) }, + { S(tbz, bzip2) }, + { S(tbz2, bzip2) }, + { S(tz2, bzip2) }, + { S(lzma, lzma) }, + { S(tlz, lzma) }, +#undef S +}; + +int nsuffixes = sizeof (compression_suffixes) / + sizeof (compression_suffixes[0]); + +static const char * +find_compression_program (const char *name, const char *defprog) +{ + char *suf = strrchr (name, '.'); + + if (suf) + { + int i; + size_t len; + + suf++; + len = strlen (suf); + + for (i = 0; i < nsuffixes; i++) + { + if (compression_suffixes[i].length == len + && memcmp (compression_suffixes[i].suffix, suf, len) == 0) + return compression_suffixes[i].program; + } + } + return defprog; +} + +void +set_comression_program_by_suffix (const char *name, const char *defprog) +{ + const char *program = find_compression_program (name, defprog); + if (program) + use_compress_program_option = program; +} + diff --git a/src/system.c b/src/system.c new file mode 100644 index 0000000..e57e6da --- /dev/null +++ b/src/system.c @@ -0,0 +1,894 @@ +/* System-dependent calls 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include "common.h" +#include +#include + +#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 global_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); + global_pid = xfork (); + + if (global_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 (global_pid < 0) + return; + + signal (SIGPIPE, pipe_handler); + while (waitpid (global_pid, &status, 0) == -1) + if (errno != EINTR) + { + global_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) global_pid, WEXITSTATUS (status))); + } + else if (WIFSIGNALED (status)) + { + WARN ((0, 0, _("%lu: Child terminated on signal %d"), + (unsigned long) global_pid, WTERMSIG (status))); + } + else + ERROR ((0, 0, _("%lu: Child terminated on unknown reason"), + (unsigned long) global_pid)); + + global_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]; + static RETSIGTYPE (*saved_handler) (int sig); + + xpipe (p); + saved_handler = signal (SIGPIPE, SIG_IGN); + + pid = xfork (); + + if (pid != 0) + { + /* Master */ + + int rc; + int status; + char *buf = NULL; + 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) + { + signal (SIGPIPE, saved_handler); + waitpid_error (info_script_option); + return -1; + } + + signal (SIGPIPE, saved_handler); + + 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_BLOCKING_FACTOR", + STRINGIFY_BIGINT (blocking_factor, 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); +} + +void +sys_exec_checkpoint_script (const char *script_name, + const char *archive_name, + int checkpoint_number) +{ + pid_t pid; + char *argv[4]; + char uintbuf[UINTMAX_STRSIZE_BOUND]; + + pid = xfork (); + + if (pid != 0) + { + /* Master */ + + int status; + + while (waitpid (pid, &status, 0) == -1) + if (errno != EINTR) + { + waitpid_error (script_name); + break; + } + + return; + } + + /* Child */ + setenv ("TAR_VERSION", PACKAGE_VERSION, 1); + setenv ("TAR_ARCHIVE", archive_name, 1); + setenv ("TAR_CHECKPOINT", STRINGIFY_BIGINT (checkpoint_number, uintbuf), 1); + setenv ("TAR_BLOCKING_FACTOR", + STRINGIFY_BIGINT (blocking_factor, 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); + argv[0] = "/bin/sh"; + argv[1] = "-c"; + argv[2] = (char*) script_name; + argv[3] = NULL; + + execv (argv[0], argv); + + exec_fatal (script_name); +} + +#endif /* not MSDOS */ diff --git a/src/tar.c b/src/tar.c new file mode 100644 index 0000000..4a58a74 --- /dev/null +++ b/src/tar.c @@ -0,0 +1,2525 @@ +/* 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include +#include +#include +#include + +#include +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* 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, + CHECK_DEVICE_OPTION, + CHECKPOINT_OPTION, + CHECKPOINT_ACTION_OPTION, + DELAY_DIRECTORY_RESTORE_OPTION, + HARD_DEREFERENCE_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, + EXCLUDE_VCS_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, + LZMA_OPTION, + MODE_OPTION, + MTIME_OPTION, + NEWER_MTIME_OPTION, + NO_ANCHORED_OPTION, + NO_CHECK_DEVICE_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 eqy. 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 }, + {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0, + N_("do not check device numbers when creating incremental archives"), + GRID+1 }, + {"check-device", CHECK_DEVICE_OPTION, NULL, 0, + N_("check device numbers when creating incremental archives (default)"), + 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 }, +#undef GRID + +#define GRID 90 + {NULL, 0, NULL, 0, + N_("Compression options:"), GRID }, + {"auto-compress", 'a', 0, 0, + N_("use archive suffix to determine the compression program"), GRID+1 }, + {"bzip2", 'j', 0, 0, + N_("filter the archive through bzip2"), GRID+1 }, + {"gzip", 'z', 0, 0, + N_("filter the archive through gzip"), GRID+1 }, + {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, + {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, + {"compress", 'Z', 0, 0, + N_("filter the archive through compress"), GRID+1 }, + {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, + {"lzma", LZMA_OPTION, 0, 0, + N_("filter the archive through lzma"), GRID+1 }, + {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0, + N_("filter through PROG (must accept -d)"), GRID+1 }, +#undef GRID + +#define GRID 100 + {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 }, + {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0, + N_("exclude version control system directories"), 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 }, + {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0, + N_("follow hard links; archive and dump the files they refer 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 110 + {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 120 + {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 130 + {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 }, + {"checkpoint-action", CHECKPOINT_ACTION_OPTION, N_("ACTION"), 0, + N_("execute ACTION on each checkpoint"), + 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 140 + {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 150 + {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 */ + int compress_autodetect; /* True if compression autodetection should + be attempted when creating archives */ +}; + + +#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) + +void +exclude_vcs_files () +{ + int i; + static char *vcs_file[] = { + /* CVS: */ + "CVS", + ".cvsignore", + /* RCS: */ + "RCS", + /* SCCS: */ + "SCCS", + /* SVN: */ + ".svn", + /* git: */ + ".git", + ".gitignore", + /* Arch: */ + ".arch-ids", + "{arch}", + "=RELEASE-ID", + "=meta-update", + "=update", + NULL + }; + + for (i = 0; vcs_file[i]; i++) + add_exclude (excluded, vcs_file[i], 0); +} + + +#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 'a': + args->compress_autodetect = true; + 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 HARD_DEREFERENCE_OPTION: + hard_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 LZMA_OPTION: + set_use_compress_program_option ("lzma"); + 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 CHECK_DEVICE_OPTION: + check_device_option = true; + break; + + case NO_CHECK_DEVICE_OPTION: + check_device_option = false; + break; + + case CHECKPOINT_OPTION: + if (arg) + { + char *p; + + if (*arg == '.') + { + checkpoint_compile_action ("."); + arg++; + } + checkpoint_option = strtoul (arg, &p, 0); + if (*p) + FATAL_ERROR ((0, 0, + _("--checkpoint value is not an integer"))); + } + else + checkpoint_option = DEFAULT_CHECKPOINT; + break; + + case CHECKPOINT_ACTION_OPTION: + checkpoint_compile_action (arg); + 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 EXCLUDE_VCS_OPTION: + exclude_vcs_files (); + 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 *o, int letter) +{ + for (; + !(o->name == NULL + && o->key == 0 + && o->arg == 0 + && o->flags == 0 + && o->doc == NULL); o++) + if (o->key == letter) + return o; + return NULL; +} + +static void +decode_options (int argc, char **argv) +{ + int idx; + 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; + args.compress_autodetect = 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; + + check_device_option = true; + + /* 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, + &idx, &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 (; idx < argc; idx++) + { + name_add_name (argv[idx], 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"))); + if (args.compress_autodetect && archive_names + && strcmp (archive_name_array[0], "-")) + set_comression_program_by_suffix (archive_name_array[0], + use_compress_program_option); + 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; + } + + checkpoint_finish_compile (); + + 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..7f72f3e --- /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, 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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..fc3eb48 --- /dev/null +++ b/src/transform.c @@ -0,0 +1,567 @@ +/* This file is part of GNU tar. + Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include "common.h" + +enum transform_type + { + transform_first, + transform_global + }; + +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; +}; + +struct transform +{ + struct transform *next; + enum transform_type transform_type; + unsigned match_number; + regex_t regex; + /* Compiled replacement expression */ + struct replace_segm *repl_head, *repl_tail; + size_t segm_count; /* Number of elements in the above list */ +}; + + +static struct transform *transform_head, *transform_tail; + +static struct transform * +new_transform () +{ + struct transform *p = xzalloc (sizeof *p); + if (transform_tail) + transform_tail->next = p; + else + transform_head = p; + transform_tail = p; + return p; +} + +static struct replace_segm * +add_segment (struct transform *tf) +{ + struct replace_segm *segm = xmalloc (sizeof *segm); + segm->next = NULL; + if (tf->repl_tail) + tf->repl_tail->next = segm; + else + tf->repl_head = segm; + tf->repl_tail = segm; + tf->segm_count++; + return segm; +} + +static void +add_literal_segment (struct transform *tf, char *str, char *end) +{ + size_t len = end - str; + if (len) + { + struct replace_segm *segm = add_segment (tf); + 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 (struct transform *tf, int chr) +{ + struct replace_segm *segm = add_segment (tf); + 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 (struct transform *tf, size_t ref) +{ + struct replace_segm *segm = add_segment (tf); + segm->type = segm_backref; + segm->v.ref = ref; +} + +static void +add_case_ctl_segment (struct transform *tf, enum case_ctl_type ctl) +{ + struct replace_segm *segm = add_segment (tf); + segm->type = segm_case_ctl; + segm->v.ctl = ctl; +} + +static const char * +parse_transform_expr (const char *expr) +{ + int delim; + int i, j, rc; + char *str, *beg, *cur; + const char *p; + int cflags = 0; + struct transform *tf = new_transform (); + + 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 */ + tf->transform_type = transform_first; + for (p = expr + j + 1; *p && *p != ';'; p++) + switch (*p) + { + case 'g': + tf->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': + tf->match_number = strtoul (p, (char**) &p, 0); + p--; + break; + + default: + USAGE_ERROR ((0, 0, _("Unknown flag in transform expression: %c"), + *p)); + } + + if (*p == ';') + p++; + + /* Extract and compile regex */ + str = xmalloc (i - 1); + memcpy (str, expr + 2, i - 2); + str[i - 2] = 0; + + rc = regcomp (&tf->regex, str, cflags); + + if (rc) + { + char errbuf[512]; + regerror (rc, &tf->regex, errbuf, sizeof (errbuf)); + USAGE_ERROR ((0, 0, _("Invalid transform expression: %s"), errbuf)); + } + + if (str[0] == '^' || str[strlen (str) - 1] == '$') + tf->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 (tf, 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 > tf->regex.re_nsub) + USAGE_ERROR ((0, 0, _("Invalid transform replacement: back reference out of range"))); + add_backref_segment (tf, n); + break; + + case '\\': + add_char_segment (tf, '\\'); + cur++; + break; + + case 'a': + add_char_segment (tf, '\a'); + cur++; + break; + + case 'b': + add_char_segment (tf, '\b'); + cur++; + break; + + case 'f': + add_char_segment (tf, '\f'); + cur++; + break; + + case 'n': + add_char_segment (tf, '\n'); + cur++; + break; + + case 'r': + add_char_segment (tf, '\r'); + cur++; + break; + + case 't': + add_char_segment (tf, '\t'); + cur++; + break; + + case 'v': + add_char_segment (tf, '\v'); + cur++; + break; + + case '&': + add_char_segment (tf, '&'); + cur++; + break; + + case 'L': + /* Turn the replacement to lowercase until a `\U' or `\E' + is found, */ + add_case_ctl_segment (tf, ctl_locase); + cur++; + break; + + case 'l': + /* Turn the next character to lowercase, */ + add_case_ctl_segment (tf, ctl_locase_next); + cur++; + break; + + case 'U': + /* Turn the replacement to uppercase until a `\L' or `\E' + is found, */ + add_case_ctl_segment (tf, ctl_upcase); + cur++; + break; + + case 'u': + /* Turn the next character to uppercase, */ + add_case_ctl_segment (tf, ctl_upcase_next); + cur++; + break; + + case 'E': + /* Stop case conversion started by `\L' or `\U'. */ + add_case_ctl_segment (tf, ctl_stop); + cur++; + break; + + default: + /* Try to be nice */ + { + char buf[2]; + buf[0] = '\\'; + buf[1] = *cur; + add_literal_segment (tf, buf, buf + 2); + } + cur++; + break; + } + beg = cur; + } + else if (*cur == '&') + { + add_literal_segment (tf, beg, cur); + add_backref_segment (tf, 0); + beg = ++cur; + } + else + cur++; + } + add_literal_segment (tf, beg, cur); + + return p; +} + +void +set_transform_expr (const char *expr) +{ + while (*expr) + expr = parse_transform_expr (expr); +} + +/* 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; +} + + +static struct obstack stk; +static bool stk_init; + +void +_single_transform_name_to_obstack (struct transform *tf, 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; \ + } + + rmp = xmalloc ((tf->regex.re_nsub + 1) * sizeof (*rmp)); + + while (*input) + { + size_t disp; + char *ptr; + + rc = regexec (&tf->regex, input, tf->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 (tf->match_number && nmatches < tf->match_number) + { + obstack_grow (&stk, input, disp); + input += disp; + continue; + } + + for (segm = tf->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 (tf->transform_type == transform_first) + { + obstack_grow (&stk, input, strlen (input)); + break; + } + } + + obstack_1grow (&stk, 0); + free (rmp); +} + +bool +_transform_name_to_obstack (char *input, char **output) +{ + struct transform *tf; + + if (!stk_init) + { + obstack_init (&stk); + stk_init = true; + } + + for (tf = transform_head; tf; tf = tf->next) + { + _single_transform_name_to_obstack (tf, input); + input = obstack_finish (&stk); + } + *output = input; + return transform_head != NULL; +} + +bool +transform_name_fp (char **pinput, char *(*fun)(char *, void *), void *dat) +{ + char *str; + bool ret = _transform_name_to_obstack (*pinput, &str); + if (ret) + { + assign_string (pinput, fun ? fun (str, dat) : str); + obstack_free (&stk, str); + } + else if (fun) + { + *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..fa16193 --- /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, 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, 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 +#include +#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, ¤t_stat_info, + ¤t_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 (¤t_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..c9836d6 --- /dev/null +++ b/src/utf8.c @@ -0,0 +1,97 @@ +/* Charset handling for GNU tar. + + Copyright (C) 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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include +#include +#include +#include "common.h" +#ifdef HAVE_ICONV_H +# include +#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 (*p & ~0x7f) + return false; + return true; +} diff --git a/src/xheader.c b/src/xheader.c new file mode 100644 index 0000000..9be0a2f --- /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 3, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include +#include +#include +#include + +#include "common.h" + +#include + +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..729bdd9 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,163 @@ +# 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 , 1988. +# Sergey Poznyakoff , 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 3, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, 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\ + shortfile.at\ + shortupd.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..e486e3e --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,885 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 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 , 1988. +# Sergey Poznyakoff , 2004. +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@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/alloca.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/environ.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/fseeko.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/include_next.m4 $(top_srcdir)/m4/inline.m4 \ + $(top_srcdir)/m4/intlmacosx.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/lseek.m4 $(top_srcdir)/m4/lstat.m4 \ + $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \ + $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/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/realloc.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/snprintf.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/strings_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/xsize.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.@am__isrc@ -I$(top_builddir) +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) +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@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@ +GNULIB_CHOWN = @GNULIB_CHOWN@ +GNULIB_DUP2 = @GNULIB_DUP2@ +GNULIB_ENVIRON = @GNULIB_ENVIRON@ +GNULIB_FCHDIR = @GNULIB_FCHDIR@ +GNULIB_FFLUSH = @GNULIB_FFLUSH@ +GNULIB_FOPEN = @GNULIB_FOPEN@ +GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@ +GNULIB_FREOPEN = @GNULIB_FREOPEN@ +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_GETDELIM = @GNULIB_GETDELIM@ +GNULIB_GETLINE = @GNULIB_GETLINE@ +GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@ +GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@ +GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@ +GNULIB_IMAXABS = @GNULIB_IMAXABS@ +GNULIB_IMAXDIV = @GNULIB_IMAXDIV@ +GNULIB_LCHOWN = @GNULIB_LCHOWN@ +GNULIB_LSEEK = @GNULIB_LSEEK@ +GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@ +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_MBSNLEN = @GNULIB_MBSNLEN@ +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_OPEN = @GNULIB_OPEN@ +GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@ +GNULIB_PUTENV = @GNULIB_PUTENV@ +GNULIB_READLINK = @GNULIB_READLINK@ +GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@ +GNULIB_SETENV = @GNULIB_SETENV@ +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_STRERROR = @GNULIB_STRERROR@ +GNULIB_STRNDUP = @GNULIB_STRNDUP@ +GNULIB_STRNLEN = @GNULIB_STRNLEN@ +GNULIB_STRPBRK = @GNULIB_STRPBRK@ +GNULIB_STRSEP = @GNULIB_STRSEP@ +GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@ +GNULIB_STRSTR = @GNULIB_STRSTR@ +GNULIB_STRTOD = @GNULIB_STRTOD@ +GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@ +GNULIB_STRTOK_R = @GNULIB_STRTOK_R@ +GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@ +GNULIB_UNSETENV = @GNULIB_UNSETENV@ +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@ +GNULIB_WCWIDTH = @GNULIB_WCWIDTH@ +GREP = @GREP@ +HAVE_CALLOC_POSIX = @HAVE_CALLOC_POSIX@ +HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@ +HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@ +HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@ +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_STRERROR = @HAVE_DECL_STRERROR@ +HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@ +HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@ +HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@ +HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@ +HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@ +HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@ +HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@ +HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@ +HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@ +HAVE_DUP2 = @HAVE_DUP2@ +HAVE_FSEEKO = @HAVE_FSEEKO@ +HAVE_FTELLO = @HAVE_FTELLO@ +HAVE_FTRUNCATE = @HAVE_FTRUNCATE@ +HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@ +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_MALLOC_POSIX = @HAVE_MALLOC_POSIX@ +HAVE_MEMPCPY = @HAVE_MEMPCPY@ +HAVE_MKDTEMP = @HAVE_MKDTEMP@ +HAVE_OS_H = @HAVE_OS_H@ +HAVE_READLINK = @HAVE_READLINK@ +HAVE_REALLOC_POSIX = @HAVE_REALLOC_POSIX@ +HAVE_SETENV = @HAVE_SETENV@ +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_STRTOD = @HAVE_STRTOD@ +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_PARAM_H = @HAVE_SYS_PARAM_H@ +HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@ +HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@ +HAVE_UNISTD_H = @HAVE_UNISTD_H@ +HAVE_UNSETENV = @HAVE_UNSETENV@ +HAVE_UNSIGNED_LONG_LONG_INT = @HAVE_UNSIGNED_LONG_LONG_INT@ +HAVE_VASPRINTF = @HAVE_VASPRINTF@ +HAVE_WCHAR_H = @HAVE_WCHAR_H@ +HAVE_WCTYPE_H = @HAVE_WCTYPE_H@ +HAVE_WINT_T = @HAVE_WINT_T@ +HAVE__BOOL = @HAVE__BOOL@ +INCLUDE_NEXT = @INCLUDE_NEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@ +INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +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@ +LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEXT_DIRENT_H = @NEXT_DIRENT_H@ +NEXT_FCNTL_H = @NEXT_FCNTL_H@ +NEXT_FLOAT_H = @NEXT_FLOAT_H@ +NEXT_INTTYPES_H = @NEXT_INTTYPES_H@ +NEXT_STDARG_H = @NEXT_STDARG_H@ +NEXT_STDINT_H = @NEXT_STDINT_H@ +NEXT_STDIO_H = @NEXT_STDIO_H@ +NEXT_STDLIB_H = @NEXT_STDLIB_H@ +NEXT_STRINGS_H = @NEXT_STRINGS_H@ +NEXT_STRING_H = @NEXT_STRING_H@ +NEXT_SYSEXITS_H = @NEXT_SYSEXITS_H@ +NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@ +NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@ +NEXT_TIME_H = @NEXT_TIME_H@ +NEXT_UNISTD_H = @NEXT_UNISTD_H@ +NEXT_WCHAR_H = @NEXT_WCHAR_H@ +NEXT_WCTYPE_H = @NEXT_WCTYPE_H@ +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_FOPEN = @REPLACE_FOPEN@ +REPLACE_FPRINTF = @REPLACE_FPRINTF@ +REPLACE_FREOPEN = @REPLACE_FREOPEN@ +REPLACE_FSEEK = @REPLACE_FSEEK@ +REPLACE_FSEEKO = @REPLACE_FSEEKO@ +REPLACE_FTELL = @REPLACE_FTELL@ +REPLACE_FTELLO = @REPLACE_FTELLO@ +REPLACE_GETCWD = @REPLACE_GETCWD@ +REPLACE_GETLINE = @REPLACE_GETLINE@ +REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@ +REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@ +REPLACE_LCHOWN = @REPLACE_LCHOWN@ +REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@ +REPLACE_LSEEK = @REPLACE_LSEEK@ +REPLACE_MEMMEM = @REPLACE_MEMMEM@ +REPLACE_MKSTEMP = @REPLACE_MKSTEMP@ +REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@ +REPLACE_OPEN = @REPLACE_OPEN@ +REPLACE_PRINTF = @REPLACE_PRINTF@ +REPLACE_PUTENV = @REPLACE_PUTENV@ +REPLACE_SNPRINTF = @REPLACE_SNPRINTF@ +REPLACE_SPRINTF = @REPLACE_SPRINTF@ +REPLACE_STRCASESTR = @REPLACE_STRCASESTR@ +REPLACE_STRERROR = @REPLACE_STRERROR@ +REPLACE_STRPTIME = @REPLACE_STRPTIME@ +REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@ +REPLACE_STRSTR = @REPLACE_STRSTR@ +REPLACE_STRTOD = @REPLACE_STRTOD@ +REPLACE_TIMEGM = @REPLACE_TIMEGM@ +REPLACE_VASPRINTF = @REPLACE_VASPRINTF@ +REPLACE_VFPRINTF = @REPLACE_VFPRINTF@ +REPLACE_VPRINTF = @REPLACE_VPRINTF@ +REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@ +REPLACE_VSPRINTF = @REPLACE_VSPRINTF@ +REPLACE_WCWIDTH = @REPLACE_WCWIDTH@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@ +SIZE_T_SUFFIX = @SIZE_T_SUFFIX@ +STDARG_H = @STDARG_H@ +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@ +UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@ +UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VOID_UNSETENV = @VOID_UNSETENV@ +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@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +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@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_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\ + shortfile.at\ + shortupd.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; nonemtpy = 1; } \ + END { if (nonempty) { 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; nonempty = 1; } \ + END { if (nonempty) { 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=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + 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..6aa0ded --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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 diff --git a/tests/T-null.at b/tests/T-null.at new file mode 100644 index 0000000..c45dab6 --- /dev/null +++ b/tests/T-null.at @@ -0,0 +1,48 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 T-null]) + +AT_DATA([expout],[jeden\ndwa +trzy +]) + +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], +[expout], +[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..7bf9a22 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..18348e1 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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), +# 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..0986e51 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..c9f2743 --- /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, 2007 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 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + 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 + +#include + +/* + * 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], "e); + + 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..48637fb --- /dev/null +++ b/tests/argcv.h @@ -0,0 +1,50 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 1999, 2000, 2001, 2007 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 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + 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 +#include +#include +#include + +#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..380cac0 --- /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=ftp://ftp.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..9b806c0 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..cd56a20 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..76ee2cb --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..ec99c67 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..d2823b7 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..f1155d9 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..d4880b8 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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: +# +# 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..689aa11 --- /dev/null +++ b/tests/exclude.at @@ -0,0 +1,163 @@ +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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([ +AT_SORT_PREREQ + +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +done +], +[0], +[OPTION exclude-caches +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +OPTION exclude-caches-under +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +OPTION exclude-caches-all +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; directory not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +OPTION exclude-tag +dir/ +dir/blues +dir/folk/ +dir/folk/tagfile +dir/jazz +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/folk/ +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +dir/rock/file +OPTION exclude-tag-under +dir/ +dir/blues +dir/folk/ +dir/jazz +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/folk/ +dir/jazz +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..5b1a2de --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..d5d641f --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..9566b5e --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..49a199e --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..a0f7c70 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# +# 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..9f3fdb9 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# +# 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..1c45e97 --- /dev/null +++ b/tests/extrac07.at @@ -0,0 +1,59 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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 + +chmod +w dir + +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..91cf5b4 --- /dev/null +++ b/tests/genfile.c @@ -0,0 +1,885 @@ +/* Generate a file containing some preset patterns. + Print statistics for existing files. + + Copyright (C) 1995, 1996, 1997, 2001, 2003, 2004, 2005, 2006, 2007, + 2008 Free Software Foundation, Inc. + + François Pinard , 1995. + Sergey Poznyakoff , 2004, 2005, 2006, 2007, 2008. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define obstack_chunk_alloc malloc +#define obstack_chunk_free free +#include + +#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 ? "rb+" : "wb"); + if (!fp) + error (EXIT_FAILURE, errno, _("cannot open `%s'"), filename); + } + else + fp = stdout; + + if (fseeko (fp, seek_offset, 0)) + error (EXIT_FAILURE, errno, "%s", _("cannot seek")); + + 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, "rb") : 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 | O_BINARY; + + 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, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (fd < 0) + error (EXIT_FAILURE, errno, _("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, "ab"); + 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 | O_BINARY); + 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], "rb"); + 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..6f71cc9 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..f3a4a86 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..f1d9d33 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..8f0be14 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..c054253 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..08421bb --- /dev/null +++ b/tests/incr03.at @@ -0,0 +1,80 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 + +sleep 1 + +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..885b0ef --- /dev/null +++ b/tests/incr04.at @@ -0,0 +1,65 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 . 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 - + +sleep 1 + +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..bab0beb --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..6d445f3 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..2bec558 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# +# 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..56584f2 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..3ab19a8 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..d01195e --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..e8eae5a --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..f50a9ab --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 || AT_SKIP_TEST +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..7f683d8 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..3ff0f10 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..5c37e03 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..88eb92a --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# +# +# 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..27d0a28 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 < ../expout <). + +# 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); }' +# 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..7e4374e --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..8428f64 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..bec145f --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..7fc4edd --- /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.20]) +m4_define([AT_PACKAGE_STRING], [GNU tar 1.20]) +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..efca65b --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..0420733 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..4e2a6aa --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..2c8ca0d --- /dev/null +++ b/tests/rename02.at @@ -0,0 +1,104 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 + +sleep 1 + +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..d08c9fc --- /dev/null +++ b/tests/rename03.at @@ -0,0 +1,128 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU tar. +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 + +sleep 1 + +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..d339dfa --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..e3f7b34 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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/shortfile.at b/tests/shortfile.at new file mode 100644 index 0000000..dbebc50 --- /dev/null +++ b/tests/shortfile.at @@ -0,0 +1,41 @@ +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# Tar 1.18 in reading mode silently ignored any invalid files smaller than 512 +# Reported by: Ian on Thu, 23 Aug 2007 15:15:51 -0400 +# References: +# http://lists.gnu.org/archive/html/bug-tar/2007-08/msg00038.html + +AT_SETUP([short input files]) +AT_KEYWORDS([shortfile shortfile0]) + +AT_TAR_CHECK([ +genfile --length 511 --file foo || exit 5 +tar tf foo +], +[2], +[], +[tar: This does not look like a tar archive +tar: Error exit delayed from previous errors +], +[],[],[gnu]) + +AT_CLEANUP + diff --git a/tests/shortrec.at b/tests/shortrec.at new file mode 100644 index 0000000..3e009fd --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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/shortupd.at b/tests/shortupd.at new file mode 100644 index 0000000..33f3570 --- /dev/null +++ b/tests/shortupd.at @@ -0,0 +1,39 @@ +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Fixing improper small file recognition in version 1.18 (see shortfile.at +# and ChangeLog:2007-08-24), introduced another bug: when updating a +# non-existing archive, tar-1.19 complained about its not being a tar archive +# and exited immediately, leaving the created zero-sized file after it. +# +# This bug was fixed on 2007-12-05. +# +# Reported by: Ozan @,{C}a@v{g}layan +# References: <4755A82A.9060607@gmail.com> + +AT_SETUP([updating short archives]) +AT_KEYWORDS([shortfile shortfile1 shortupd]) + +AT_TAR_CHECK([ +touch foo +tar uf archive foo +], +[0]) + +AT_CLEANUP + diff --git a/tests/sparse01.at b/tests/sparse01.at new file mode 100644 index 0000000..465031f --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..bd0016d --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..6ab46a0 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..a0d375e --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..2674813 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..eb460cc --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..0451cbf --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..5a4ad26 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..e247ff4 --- /dev/null +++ b/tests/star/README @@ -0,0 +1,71 @@ +This directory contains scripts for testing GNU tar using +star "test archives". The archives themselves can be obtained +from ftp://ftp.berlios.de/pub/star/testscripts. + +These tests are disabled by default. There are two ways to run +them. The simplest is by `make check-full' command. It requires wget +and GNU md5sum to be installed. If you don't have these utilities, +download the test archives manually and set the environment variable +STAR_TESTSCRIPTS to point to the directory where they reside, for +example: + + 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/testscripts 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 verify the 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..5f41cc1 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..c0ce544 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..2b351d1 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..f37d2f0 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..01b8e12 --- /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, 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 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..a5bee73 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..49a05c0 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..1a9f12a --- /dev/null +++ b/tests/testsuite @@ -0,0 +1,27979 @@ +#! /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 more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +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 + + + + +# 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 /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 +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(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 + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 73 74' +# 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 T-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;shortfile.at:26;short input files;shortfile shortfile0; +66;shortupd.at:29;updating short archives;shortfile shortfile1 shortupd; +67;truncate.at:29;truncate;truncate filechange; +68;grow.at:24;grow;grow filechange; +69;gtarfail.at:21;gtarfail;star gtarfail; +70;gtarfail2.at:21;gtarfail2;star gtarfail2; +71;multi-fail.at:21;multi-fail;star multivolume multiv multi-fail; +72;ustar-big-2g.at:21;ustar-big-2g;star ustar-big-2g; +73;ustar-big-8g.at:21;ustar-big-8g;star ustar-big-8g; +74;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 . +_ATEOF + exit 0 +fi + +# List of tests. +if $at_list_p; then + cat <<_ATEOF +GNU tar 1.20 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.20)" + 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.20 test suite. ## +## ------------------------ ## +_ASBOX +{ + cat <<\_ASBOX +## ------------------------ ## +## GNU tar 1.20 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.20 +" | $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 + + + +cat >expout <<'_ATEOF' +jeden\ndwa +trzy +_ATEOF + + + + + $at_traceoff +echo "$at_srcdir/T-null.at:28: +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: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 * + + +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=: +$at_diff expout "$at_stdout" || at_failed=: +case $at_status in + 77) echo 77 > "$at_status_file"; exit 77;; + 0) ;; + *) echo "$at_srcdir/T-null.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 + + # 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 * + + +test -z "`sort < /dev/null 2>&1`" || exit 77 + + +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 * + + +test -z "`sort < /dev/null 2>&1`" || exit 77 + + +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 * + + +test -z "`sort < /dev/null 2>&1`" || exit 77 + + +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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 | sort + cat err + echo ARCHIVE + tar tf archive.tar | sort +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/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +OPTION exclude-caches-under +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; contents not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +dir/rock/ +OPTION exclude-caches-all +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +tar: dir/rock/: contains a cache directory tag CACHEDIR.TAG; directory not dumped +ARCHIVE +dir/ +dir/blues +dir/folk/ +dir/folk/sanjuan +dir/folk/tagfile +dir/jazz +OPTION exclude-tag +dir/ +dir/blues +dir/folk/ +dir/folk/tagfile +dir/jazz +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/folk/ +dir/folk/tagfile +dir/jazz +dir/rock/ +dir/rock/CACHEDIR.TAG +dir/rock/file +OPTION exclude-tag-under +dir/ +dir/blues +dir/folk/ +dir/jazz +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/folk/ +dir/jazz +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +chmod +w dir + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 || exit 77 +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 - + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 + +sleep 1 + +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 || exit 77 +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 < ../expout <"$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 < ../expout <"$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 < ../expout <"$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 < ../expout <"$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 < ../expout <"$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 < ../expout <"$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); }' "$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); }' "$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); }' "$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); }' "$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); }' "$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); }' "$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. shortfile.at:26: short input files + at_setup_line='shortfile.at:26' + at_desc="short input files" + $at_quiet $ECHO_N " 65: short input files $ECHO_C" + at_xfail=no + test -f $XFAILFILE && at_xfail=yes + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "65. shortfile.at:26: testing ..." + $at_traceon + + + + + + $at_traceoff +echo "$at_srcdir/shortfile.at:29: +mkdir gnu +(cd gnu +TEST_TAR_FORMAT=gnu +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H gnu\" +export TAR_OPTIONS +rm -rf * + +genfile --length 511 --file foo || exit 5 +tar tf foo +)" +echo shortfile.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 --length 511 --file foo || exit 5 +tar tf 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 --length 511 --file foo || exit 5 +tar tf foo +) ) >"$at_stdout" 2>"$at_stderr" + at_status=$? +fi + +at_failed=false +echo >>"$at_stderr"; echo "tar: This does not look like a tar archive +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/shortfile.at:29: 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"` + ;; + + 66 ) # 66. shortupd.at:29: updating short archives + at_setup_line='shortupd.at:29' + at_desc="updating short archives" + $at_quiet $ECHO_N " 66: updating short archives $ECHO_C" + at_xfail=no + test -f $XFAILFILE && at_xfail=yes + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "66. shortupd.at:29: testing ..." + $at_traceon + + + + + + $at_traceoff +echo "$at_srcdir/shortupd.at:32: +mkdir v7 +(cd v7 +TEST_TAR_FORMAT=v7 +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H v7\" +export TAR_OPTIONS +rm -rf * + +touch foo +tar uf archive foo +)" +echo shortupd.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 * + +touch foo +tar uf archive 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 * + +touch foo +tar uf archive foo +) ) >"$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/shortupd.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/shortupd.at:32: +mkdir oldgnu +(cd oldgnu +TEST_TAR_FORMAT=oldgnu +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H oldgnu\" +export TAR_OPTIONS +rm -rf * + +touch foo +tar uf archive foo +)" +echo shortupd.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 * + +touch foo +tar uf archive 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 * + +touch foo +tar uf archive foo +) ) >"$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/shortupd.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/shortupd.at:32: +mkdir ustar +(cd ustar +TEST_TAR_FORMAT=ustar +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H ustar\" +export TAR_OPTIONS +rm -rf * + +touch foo +tar uf archive foo +)" +echo shortupd.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 * + +touch foo +tar uf archive 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 * + +touch foo +tar uf archive foo +) ) >"$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/shortupd.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/shortupd.at:32: +mkdir posix +(cd posix +TEST_TAR_FORMAT=posix +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H posix\" +export TAR_OPTIONS +rm -rf * + +touch foo +tar uf archive foo +)" +echo shortupd.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 * + +touch foo +tar uf archive 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 * + +touch foo +tar uf archive foo +) ) >"$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/shortupd.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/shortupd.at:32: +mkdir gnu +(cd gnu +TEST_TAR_FORMAT=gnu +export TEST_TAR_FORMAT +TAR_OPTIONS=\"-H gnu\" +export TAR_OPTIONS +rm -rf * + +touch foo +tar uf archive foo +)" +echo shortupd.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 * + +touch foo +tar uf archive 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 * + +touch foo +tar uf archive foo +) ) >"$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/shortupd.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"` + ;; + + 67 ) # 67. truncate.at:29: truncate + at_setup_line='truncate.at:29' + at_desc="truncate" + $at_quiet $ECHO_N " 67: truncate $ECHO_C" + at_xfail=no + test -f $XFAILFILE && at_xfail=yes + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "67. 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"` + ;; + + 68 ) # 68. grow.at:24: grow + at_setup_line='grow.at:24' + at_desc="grow" + $at_quiet $ECHO_N " 68: grow $ECHO_C" + at_xfail=no + test -f $XFAILFILE && at_xfail=yes + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "68. 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"` + ;; + + 69 ) # 69. gtarfail.at:21: gtarfail + at_setup_line='gtarfail.at:21' + at_desc="gtarfail" + $at_quiet $ECHO_N " 69: gtarfail $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "69. 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"` + ;; + + 70 ) # 70. gtarfail2.at:21: gtarfail2 + at_setup_line='gtarfail2.at:21' + at_desc="gtarfail2" + $at_quiet $ECHO_N " 70: gtarfail2 $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "70. 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"` + ;; + + 71 ) # 71. multi-fail.at:21: multi-fail + at_setup_line='multi-fail.at:21' + at_desc="multi-fail" + $at_quiet $ECHO_N " 71: multi-fail $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "71. 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"` + ;; + + 72 ) # 72. 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 " 72: ustar-big-2g $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "72. 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"` + ;; + + 73 ) # 73. 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 " 73: ustar-big-8g $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "73. 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"` + ;; + + 74 ) # 74. 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 " 74: pax-big-10g $ECHO_C" + at_xfail=no + echo "# -*- compilation -*-" >> "$at_group_log" + ( + echo "74. 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 . +_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: " + echo " Subject: [GNU tar 1.20] $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..5b63354 --- /dev/null +++ b/tests/testsuite.at @@ -0,0 +1,196 @@ +# 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 dnl +m4_if([$2],,,&& genfile --file [$1]/[$2]) || AT_SKIP_TEST]) + +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([shortfile.at]) +m4_include([shortupd.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..8ff2f34 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..cec70f0 --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..b2bd6ad --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..60da2c0 --- /dev/null +++ b/tests/version.at @@ -0,0 +1,35 @@ +# Checking tar version -*- Autotest -*- +# Copyright (C) 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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..c2bf12a --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +# 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..30b405f --- /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, 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 3, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, 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 +