diff options
Diffstat (limited to 'gnu/dist/diffutils')
193 files changed, 75165 insertions, 258 deletions
diff --git a/gnu/dist/diffutils/ABOUT-NLS b/gnu/dist/diffutils/ABOUT-NLS new file mode 100644 index 00000000000..022965c6ac5 --- /dev/null +++ b/gnu/dist/diffutils/ABOUT-NLS @@ -0,0 +1,396 @@ +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 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 at translations should 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. + +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'. + +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 GNU `gettext' own +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 be not what is 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 have usually 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. + +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 country 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'. + + 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. + +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 skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of March +2002. 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 bg ca cs da de el en eo es et fi fr + +-------------------------------------+ + a2ps | [] [] [] [] | + bash | [] [] [] [] | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] | + clisp | [] [] [] [] | + cpio | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + enscript | [] [] | + error | [] [] | + fetchmail | () [] [] [] () | + fileutils | [] [] [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] | + gas | [] [] | + gawk | [] [] | + gcal | [] [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gnupg | [] [] [] [] [] [] | + gprof | [] [] | + grep | [] [] [] [] [] [] | + hello | [] [] [] [] [] [] [] [] | + id-utils | [] [] [] | + indent | [] [] [] [] [] | + jpilot | () [] [] [] | + jwhois | [] [] | + kbd | [] [] | + ld | [] [] | + libc | [] [] [] [] [] [] [] | + lilypond | [] [] | + lynx | [] [] [] [] | + m4 | [] [] [] [] [] | + make | [] [] [] [] | + mysecretdiary | [] [] | + nano | [] () [] [] [] [] | + nano_1_0 | [] () [] [] [] [] | + opcodes | [] [] [] | + parted | [] [] [] [] | + ptx | [] [] [] [] [] | + python | | + recode | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] [] | + sharutils | [] [] [] [] [] [] | + sketch | () [] () | + soundtracker | [] [] [] | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] [] | + textutils | [] [] [] [] [] | + util-linux | [] [] [] [] | + vorbis-tools | | + wdiff | [] [] [] [] [] | + wget | [] [] [] [] [] [] [] [] | + +-------------------------------------+ + bg ca cs da de el en eo es et fi fr + 1 12 11 31 36 9 1 8 39 15 1 50 + + gl he hr hu id it ja ko lv nb nl nn + +-------------------------------------+ + a2ps | () () [] | + bash | | + bfd | [] | + binutils | [] | + bison | [] [] | + clisp | [] | + cpio | [] [] [] | + diffutils | [] [] [] | + enscript | [] | + error | [] | + fetchmail | | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] | + flex | [] | + gas | | + gawk | [] | + gcal | | + gcc | | + gettext | [] | + gnupg | [] [] [] | + gprof | | + grep | [] | + hello | [] [] [] [] [] [] [] [] [] [] | + id-utils | [] | + indent | [] [] [] | + jpilot | () () | + jwhois | | + kbd | | + ld | | + libc | [] [] [] [] | + lilypond | [] [] | + lynx | [] [] | + m4 | [] [] [] [] | + make | [] [] [] [] | + mysecretdiary | | + nano | [] [] [] () [] () [] | + nano_1_0 | [] [] [] () [] () [] | + opcodes | [] | + parted | [] [] [] | + ptx | [] [] [] [] | + python | | + recode | [] [] [] | + sed | [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] | + sharutils | [] [] [] | + sketch | () | + soundtracker | [] | + sp | | + tar | [] [] [] | + texinfo | [] [] | + textutils | [] [] | + util-linux | () [] | + vorbis-tools | | + wdiff | | + wget | [] [] [] [] [] | + +-------------------------------------+ + gl he hr hu id it ja ko lv nb nl nn + 19 7 0 4 6 11 22 9 1 8 19 4 + + no pl pt pt_BR ru sk sl sv tr uk zh_TW + +----------------------------------------+ + a2ps | () () () [] [] [] () | 8 + bash | | 4 + bfd | [] [] | 5 + binutils | [] | 4 + bison | [] [] [] | 8 + clisp | | 5 + cpio | [] [] [] [] | 11 + diffutils | [] [] [] [] [] | 14 + enscript | [] [] [] | 6 + error | [] [] [] | 6 + fetchmail | () () [] | 4 + fileutils | [] [] [] [] | 12 + findutils | [] [] [] [] [] [] [] | 18 + flex | [] [] [] | 8 + gas | [] | 3 + gawk | [] [] | 5 + gcal | [] [] | 4 + gcc | [] | 3 + gettext | [] [] [] [] | 10 + gnupg | [] [] [] | 12 + gprof | [] [] | 4 + grep | [] [] [] | 10 + hello | [] [] [] [] [] [] [] | 25 + id-utils | [] [] | 6 + indent | [] [] [] [] | 12 + jpilot | () () | 3 + jwhois | () () [] | 3 + kbd | [] [] | 4 + ld | [] [] | 4 + libc | [] [] [] [] [] [] | 17 + lilypond | [] | 5 + lynx | [] [] [] | 9 + m4 | [] [] [] | 12 + make | [] [] [] [] | 12 + mysecretdiary | [] [] | 4 + nano | () [] [] [] [] | 14 + nano_1_0 | () [] [] [] | 13 + opcodes | [] [] | 6 + parted | [] [] [] | 10 + ptx | [] [] [] [] [] [] | 15 + python | | 0 + recode | [] [] [] [] | 13 + sed | [] [] [] [] [] [] | 21 + sh-utils | [] [] [] [] [] [] [] [] [] | 22 + sharutils | [] [] [] | 12 + sketch | [] () | 3 + soundtracker | [] | 5 + sp | | 0 + tar | [] [] [] [] [] [] [] | 16 + texinfo | [] [] [] | 10 + textutils | [] [] [] [] | 11 + util-linux | [] [] [] | 8 + vorbis-tools | [] | 1 + wdiff | [] [] [] [] | 9 + wget | [] [] [] [] [] [] [] | 20 + +----------------------------------------+ + 35 teams no pl pt pt_BR ru sk sl sv tr uk zh_TW + 55 domains 5 13 2 12 25 11 11 41 34 4 7 489 + + 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 March 2002 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'. + +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 +to 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/gnu/dist/diffutils/AUTHORS b/gnu/dist/diffutils/AUTHORS new file mode 100644 index 00000000000..f5f0e90b323 --- /dev/null +++ b/gnu/dist/diffutils/AUTHORS @@ -0,0 +1,112 @@ +Authors of GNU diffutils. + + Copyright 2001 Free Software Foundation, Inc. + + This file is part of GNU diffutils. + + GNU diffutils is free software; you can redistribute it and/or modify + it under the 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 diffutils is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 diffutils; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +The following contributions warranted legal paper exchanges with the +Free Software Foundation. Also see files ChangeLog and THANKS. + +DIFFUTILS Leonard H. Tower Jr. US 1949 1987-03-09 +Assigns diff (diff.c, initial version). + +DIFFUTILS Torbjorn Granlund Sweden 1961 1988-01-11 +Assigns cmp. +tege@matematik.su.se + +DIFFUTILS Mike Haertel US 1967 1988-09-16 +Assigns changes to diff. + +DIFFUTILS David S. Hayes US ? 1988-01-12 +Assigns changes to diff. + +DIFFUTILS Randall Smith US 1964 1988-09-21 +Assigns diff3. + +DIFFUTILS Richard Stallman US 1953 1988-01-15 +Assigns changes to GNU Diff. + +DIFFUTILS F. Thomas May US 1965 1989-08-22 +Assigns changes to diff (for -D). + +DIFFUTILS Optimal Solutions, Inc. 1989-08-14 +Disclaims changes by Thomas May to diff. + +DIFFUTILS Wayne Davison 1990-09-10 +Disclaims changes to diff. + +DIFFUTILS Digital Research Inc. 1990-09-13 +Disclaims changes by Wayne Davison to diff. + +DIFFUTILS Paul Eggert 1990-03-16 +Disclaims changes to diff. +eggert@twinsun.com + +DIFFUTILS Paul Eggert 1990-08-14 +Disclaims changes to GNU Diff. +eggert@twinsun.com + +DIFFUTILS Twin Sun Inc. 1990-03-16 +Disclaims changes to GNU Diff by Paul Eggert. + +DIFFUTILS Twin Sun Inc. 1990-08-14 +Disclaims changes to GNU Diff by Paul Eggert. + +DIFFUTILS Chip Rosenthal US 1959 1990-03-06 +Assigns changes to diff. +chip@chinacat.Unicom.COM + +DIFFUTILS Unicom Systems Development 1990-03-06 +Disclaims changes by Chip Rosenthal to diff. + +GCC DIFFUTILS Paul Eggert and Twin Sun Inc. 1992-03-11 +Disclaims changes by Paul Eggert to gcc and diff. +eggert@twinsun.com + +DIFF Wayne Davison 1993-06-20 +Disclaims diffcvt.c. + +DIFFUTILS Francois Pinard Canada 1949 1993-01-15 +Assigns wdiff and future changes submitted to the FSF. +pinard@iro.umontreal.ca + +DIFFUTILS Patrick D'Cruze Australia 1971 1994-11-10 +Assigns changes (makefile.in, analyze.c, cmp.c, error.c, diff.c, +diff3.c, getopt.c, getopt1.c, regex.c, sdiff.c, util.c, xmalloc.c; +new file: language.++) + +DIFFUTILS Paul R. Eggert US 1954 1997-04-07 +Assigns past and future changes. +eggert@twinsun.com + +DIFFUTILS Paul R. Eggert US 1954 1997-04-07 +Assigns past and future changes to manual. +eggert@twinsun.com + +ANY DIFFUTILS GNATS Cyclic Software 1997-11-11 +Assigns past and future works (work for hire by Tim Pierce (diffutils) and +Abe Feldman (GNATS)). +kingdon@cyclic.com + +WEBPAGES Gregory B. Harvey Canada 1976 1998-02-14 +Assigns web pages describing GNU Diffutils and future changes. + +DIFFUTILS Olga Nikulin Russia 1965 2001-01-11 +Assigns changes to diff. (diffutils-2.7.2/analyze.c, context.c, diff.[ch], +ed.c, ifdef.c, io.c, normal.c, side.c, util.c) +onikulin@yahoo.com diff --git a/gnu/dist/diffutils/COPYING b/gnu/dist/diffutils/COPYING index a43ea2126fb..d60c31a97a5 100644 --- a/gnu/dist/diffutils/COPYING +++ b/gnu/dist/diffutils/COPYING @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -279,7 +279,7 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - Appendix: How to Apply These Terms to Your New Programs + 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 @@ -291,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> + Copyright (C) <year> <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -305,14 +305,15 @@ the "copyright" line and a pointer to where the full notice is found. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/gnu/dist/diffutils/INSTALL b/gnu/dist/diffutils/INSTALL index 5c9d013aca4..62ea076c1f7 100644 --- a/gnu/dist/diffutils/INSTALL +++ b/gnu/dist/diffutils/INSTALL @@ -1,3 +1,9 @@ +Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation, +Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + Basic Installation ================== @@ -8,20 +14,27 @@ 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, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). +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 at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. +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.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only 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: @@ -43,34 +56,44 @@ The simplest way to compile this package is: documentation. 5. You can remove the program binaries and object files from the - source 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'. + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Using a Different Build Directory -================================= - - You can compile the package in a different directory from the one -containing the source code. Doing so allows you to compile it on more -than one kind of computer at the same time. To do this, you must use a -version of `make' that supports the `VPATH' variable, such as 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 `..'. +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 variables by setting +them in the environment. You can do that on the command line like this: + + ./configure CC=c89 CFLAGS=-O2 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 must use a version of `make' that +supports the `VPATH' variable, such as 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 `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have 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 ================== @@ -78,25 +101,18 @@ Installation Names By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. Alternately, you can do so by consistently -giving a value for the `prefix' variable when you run `make', e.g., - make prefix=/usr/gnu - make prefix=/usr/gnu install +option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH' or set the `make' -variable `exec_prefix' to PATH, the package will use PATH as the prefix -for installing programs and libraries. Documentation and other data -files will still use the regular prefix. - - If you use an unusual directory layout in which some of the -installation directory names are not based on a single prefix, you can -set the individual variables `bindir', `libdir', etc. on the `make' -command line: - make bindir=/bin libdir=/usr/lib +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. -Check the `Makefile.in' files to see which variables each package uses. + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' 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 @@ -120,22 +136,35 @@ you can use the `configure' options `--x-includes=DIR' and Specifying the System Type ========================== - There may be some features `configure' can not figure out + There may be some features `configure' cannot figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: +a message saying it cannot guess the host 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 -See the file `config.sub' for the possible values of each field. If +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 host type. - If you are building compiler tools for cross-compiling, you can also + If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. +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'. In this case, you should also specify the +build platform with `--build=TYPE', because, in this case, it may not +be possible to guess the build platform (it sometimes involves +compiling and running simple test programs, and this can't be done if +the compiler is a cross compiler). Sharing Defaults ================ @@ -143,37 +172,60 @@ 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/lib/config.site' if it exists, then -`EXEC_PREFIX/lib/config.site' if it exists. Or, you can set the +`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. -Operation Controls +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 + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + `configure' recognizes the following options to control how it operates. -`--cache-file=FILE' - Save the results of the tests in FILE instead of `config.cache'. - Set FILE to `/dev/null' to disable caching, for debugging - `configure'. - `--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. + 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. -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/gnu/dist/diffutils/INSTALLME b/gnu/dist/diffutils/INSTALLME new file mode 100644 index 00000000000..eab41194c35 --- /dev/null +++ b/gnu/dist/diffutils/INSTALLME @@ -0,0 +1,53 @@ +Installation instructions specific to GNU Diffutils + + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + This file is part of GNU Diffutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + +Please send comments and problem reports to <bug-gnu-utils@gnu.org>. + +If you have a problem with internationalization, you might be able to +work around it as described in ABOUT-NLS by invoking `./configure +--disable-nls'. Many of the problems arise from dynamic linking +issues on non-GNU platforms (e.g. with the iconv library). Such +problems tend to be shared by other GNU applications on these +platforms, and can usually be fixed by carefully tweaking your non-GNU +installation. If you have an older version of libiconv, please +upgrade to the latest one, preferably libiconv-1.8 or newer. +(libiconv-1.8 is not yet available as of this writing, but it should +be out soon.) If the problem seems isolated to diffutils, though, +please report a bug. + +This program requires a Standard C compiler (C89 or later); if you +have an older K&R compiler, please install GCC first. + +If you make changes to the source code, you may need recent test +versions of GNU build tools to regenerate the intermediate files. The +following versions were used to generate the intermediate files in +this distribution: + +* GNU Autoconf 2.53 <ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.53.tar.gz> + +* GNU Automake 1.6 <ftp://ftp.gnu.org/gnu/automake/automake-1.6.tar.gz> + +* GNU gettext 0.11.1 <ftp://ftp.gnu.org/gnu/gettext/gettext-0.11.1.tar.gz> + +* GNU help2man 1.27 <ftp://ftp.gnu.org/gnu/help2man/help2man-1.27.tar.gz> + +* GNU texinfo 4.2 <ftp://ftp.gnu.org/gnu/texinfo/texinfo-4.2.tar.gz> diff --git a/gnu/dist/diffutils/Makefile.am b/gnu/dist/diffutils/Makefile.am new file mode 100644 index 00000000000..a579b1d5aa6 --- /dev/null +++ b/gnu/dist/diffutils/Makefile.am @@ -0,0 +1,23 @@ +# Main Automakefile for GNU diffutils. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +EXTRA_DIST = config/config.rpath exgettext INSTALLME +SUBDIRS = doc lib m4 ms src man po + +ACLOCAL_AMFLAGS = -I m4 diff --git a/gnu/dist/diffutils/Makefile.in b/gnu/dist/diffutils/Makefile.in index e8543ad6e4f..75304fd68ac 100644 --- a/gnu/dist/diffutils/Makefile.in +++ b/gnu/dist/diffutils/Makefile.in @@ -1,198 +1,455 @@ -# Makefile for GNU DIFF -# Copyright (C) 1988,1989,1991,1992,1993,1994 Free Software Foundation, Inc. -# -# This file is part of GNU DIFF. -# -# GNU DIFF is free software; you can redistribute it and/or modify -# it under the 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 DIFF is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 DIFF; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -#### Start of system configuration section. #### +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ -srcdir = @srcdir@ -VPATH = @srcdir@ +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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. -CC = @CC@ -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -MAKEINFO = makeinfo -TEXI2DVI = texi2dvi +# 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. -CPPFLAGS = @CPPFLAGS@ -DEFS = @DEFS@ -CFLAGS = @CFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -LIBOBJS = @LIBOBJS@ +@SET_MAKE@ -# Some System V machines do not come with libPW. -# If this is true for you, use the GNU alloca.o here. -ALLOCA = @ALLOCA@ +# Main Automakefile for GNU diffutils. +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ -edit_program_name = sed '@program_transform_name@' - -bindir = $(exec_prefix)/bin - -infodir = $(prefix)/info - -DEFAULT_EDITOR_PROGRAM = ed -DIFF_PROGRAM = $(bindir)/`echo diff | $(edit_program_name)` -NULL_DEVICE = /dev/null -PR_PROGRAM = /bin/pr - -#### End of system configuration section. #### - -SHELL = /bin/sh - -# The source files for all of the programs. -srcs=diff.c analyze.c cmpbuf.c cmpbuf.h io.c context.c ed.c normal.c ifdef.c \ - util.c dir.c memchr.c waitpid.c \ - version.c diff.h regex.c regex.h side.c system.h \ - diff3.c sdiff.c cmp.c error.c xmalloc.c getopt.c getopt1.c getopt.h \ - fnmatch.c fnmatch.h alloca.c -distfiles = $(srcs) README INSTALL NEWS diagmeet.note Makefile.in \ - stamp-h.in config.hin configure configure.in COPYING ChangeLog \ - diff.texi diff.info* texinfo.tex \ - install-sh mkinstalldirs - -PROGRAMS = cmp diff diff3 sdiff - -all: $(PROGRAMS) info - -COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) -I. -I$(srcdir) $(CFLAGS) - -.c.o: - $(COMPILE) $< - -diff_o = diff.o analyze.o cmpbuf.o dir.o io.o util.o \ - context.o ed.o ifdef.o normal.o side.o \ - fnmatch.o getopt.o getopt1.o regex.o version.o $(ALLOCA) $(LIBOBJS) -diff: $(diff_o) - $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(diff_o) $(LIBS) - -diff3_o = diff3.o getopt.o getopt1.o version.o $(LIBOBJS) -diff3: $(diff3_o) - $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(diff3_o) $(LIBS) -sdiff_o = sdiff.o getopt.o getopt1.o version.o $(LIBOBJS) -sdiff: $(sdiff_o) - $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(sdiff_o) $(LIBS) - -cmp_o = cmp.o cmpbuf.o error.o getopt.o getopt1.o xmalloc.o version.o $(LIBOBJS) -cmp: $(cmp_o) - $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(cmp_o) $(LIBS) - -info: diff.info -diff.info: diff.texi - $(MAKEINFO) $(srcdir)/diff.texi --output=$@ - -dvi: diff.dvi -diff.dvi: diff.texi - $(TEXI2DVI) $(srcdir)/diff.texi - -$(diff_o): diff.h system.h -cmp.o diff3.o sdiff.o: system.h -context.o diff.o regex.o: regex.h -cmp.o diff.o diff3.o sdiff.o getopt.o getopt1.o: getopt.h -diff.o fnmatch.o: fnmatch.h -analyze.o cmpbuf.o cmp.o: cmpbuf.h - -cmp.o: cmp.c - $(COMPILE) -DNULL_DEVICE=\"$(NULL_DEVICE)\" $(srcdir)/cmp.c - -diff3.o: diff3.c - $(COMPILE) -DDIFF_PROGRAM=\"$(DIFF_PROGRAM)\" $(srcdir)/diff3.c - -sdiff.o: sdiff.c - $(COMPILE) -DDEFAULT_EDITOR_PROGRAM=\"$(DEFAULT_EDITOR_PROGRAM)\" \ - -DDIFF_PROGRAM=\"$(DIFF_PROGRAM)\" $(srcdir)/sdiff.c - -util.o: util.c - $(COMPILE) -DPR_PROGRAM=\"$(PR_PROGRAM)\" $(srcdir)/util.c - -TAGS: $(srcs) - etags $(srcs) - -clean: - rm -f *.o $(PROGRAMS) core - rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log - rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs - -mostlyclean: clean - -distclean: clean - rm -f Makefile config.cache config.h config.log config.status stamp-h - -realclean: distclean - rm -f TAGS *.info* - -install: all installdirs - for p in $(PROGRAMS); do \ - $(INSTALL_PROGRAM) $$p $(bindir)/`echo $$p | $(edit_program_name)`; \ - done - { test -f diff.info || cd $(srcdir); } && \ - for f in diff.info*; do \ - $(INSTALL_DATA) $$f $(infodir)/$$f; \ +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +EXTRA_DIST = config/config.rpath exgettext INSTALLME +SUBDIRS = doc lib m4 ms src man po + +ACLOCAL_AMFLAGS = -I m4 +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = + +RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ + uninstall-info-recursive all-recursive install-data-recursive \ + install-exec-recursive installdirs-recursive install-recursive \ + uninstall-recursive check-recursive installcheck-recursive +DIST_COMMON = README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL \ + Makefile.am Makefile.in NEWS THANKS aclocal.m4 config.hin \ + config/config.guess config/config.rpath config/config.sub \ + config/depcomp config/install-sh config/mdate-sh config/missing \ + config/mkinstalldirs config/texinfo.tex configure configure.ac +DIST_SUBDIRS = $(SUBDIRS) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe) + +$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +$(ACLOCAL_M4): configure.ac m4/c-bs-a.m4 m4/c-stack.m4 m4/check-decl.m4 m4/codeset.m4 m4/dos.m4 m4/error.m4 m4/fnmatch.m4 m4/gettext.m4 m4/glibc21.m4 m4/gnu-source.m4 m4/iconv.m4 m4/inttypes.m4 m4/jm-glibc-io.m4 m4/lcmessage.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/longlong.m4 m4/malloc.m4 m4/mbrtowc.m4 m4/mbstate_t.m4 m4/prereq.m4 m4/progtest.m4 m4/realloc.m4 m4/regex.m4 m4/setmode.m4 m4/st_mtim.m4 m4/stdbool.m4 m4/strftime.m4 m4/vararrays.m4 m4/xstrtoumax.m4 + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) 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: $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + touch $(srcdir)/config.hin + +distclean-hdr: + -rm -f config.h +uninstall-info-am: + +# 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): + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done -installdirs: - $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) - -# We need more tests. -check: - ./cmp cmp cmp - ./diff diff diff - ./diff3 diff3 diff3 diff3 - ./sdiff sdiff sdiff - -uninstall: - for p in $(PROGRAMS); do \ - rm -f $(bindir)/`echo $$p | $(edit_program_name)`; \ +ETAGS = etags +ETAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_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 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = . +distdir = $(PACKAGE)-$(VERSION) + +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } + +GZIP_ENV = --best +distcleancheck_listfiles = find . -type f -print + +distdir: $(DISTFILES) + @if sed 15q $(srcdir)/NEWS | fgrep -e "$(VERSION)" >/dev/null; \ + then :; else \ + echo "NEWS not updated; not releasing" 1>&2; \ + exit 1; \ + fi + $(am__remove_distdir) + mkdir $(distdir) + $(mkinstalldirs) $(distdir)/config $(distdir)/po + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir)$$dir \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ done - rm -f $(infodir)/diff.info* - -configure: configure.in - cd $(srcdir) && autoconf - -# autoheader might not change config.hin. -config.hin: stamp-h.in -stamp-h.in: configure.in - cd $(srcdir) && autoheader - date > $(srcdir)/stamp-h.in - -config.status: configure - ./config.status --recheck - -# config.status might not change config.h, but it changes stamp-h. -config.h: stamp-h -stamp-h: config.hin config.status - ./config.status -Makefile: Makefile.in config.status - ./config.status - -dist: $(distfiles) - echo diffutils-`sed -e '/version_string/!d' -e 's/[^0-9]*\([0-9a-z.]*\).*/\1/' -e q version.c` > .fname - rm -rf `cat .fname` - mkdir `cat .fname` - -ln $(distfiles) `cat .fname` - for file in $(distfiles); do \ - [ -r `cat .fname`/$$file ] || cp -p $$file `cat .fname` || exit; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ done - tar -chf - `cat .fname` | gzip >`cat .fname`.tar.gz - rm -rf `cat .fname` .fname + -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 $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist dist-all: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.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 + $(am__remove_distdir) + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - + 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` \ + && cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + --with-included-gettext \ + $(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 \ + && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + find $$dc_install_base -type f -print ; \ + exit 1; } >&2 ) \ + && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \ + && rm -f $(distdir).tar.gz \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @echo "$(distdir).tar.gz is ready for distribution" | \ + sed 'h;s/./=/g;p;x;p;x' +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 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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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 config.status config.cache config.log +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ + clean-generic clean-recursive dist dist-all dist-gzip distcheck \ + distclean distclean-generic distclean-hdr distclean-recursive \ + distclean-tags distcleancheck distdir dvi dvi-am dvi-recursive \ + info info-am info-recursive install install-am install-data \ + install-data-am install-data-recursive install-exec \ + install-exec-am install-exec-recursive install-info \ + install-info-am install-info-recursive install-man \ + install-recursive install-strip installcheck installcheck-am \ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-recursive tags tags-recursive uninstall \ + uninstall-am uninstall-info-am uninstall-info-recursive \ + uninstall-recursive -# Prevent GNU make v3 from overflowing arg limit on SysV. +# 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/gnu/dist/diffutils/THANKS b/gnu/dist/diffutils/THANKS new file mode 100644 index 00000000000..4fc388c2c9d --- /dev/null +++ b/gnu/dist/diffutils/THANKS @@ -0,0 +1,22 @@ +Thanks to all the following for their contributions to GNU diffutils: + +Thomas Bushnell <tb@becket.net> +Wayne Davison <wayned@users.sourceforge.net> +Ulrich Drepper <drepper@redhat.com> +Paul Eggert <eggert@twinsun.com> +Jay Fenlason <hack@gnu.org> +John Gilmore <gnu@cygnus.com> +Torbjorn Granlund <tege@swox.com> +Mike Haertel <mike@ichips.intel.com> +Bruno Haible <haible@ilog.fr> +Chris Hanson <cph@gnu.org> +Jim Kingdon <kingdon@panix.com> +Tom Lord <lord@gnu.org> +David J. MacKenzie <djm@gnu.org> +Roland McGrath <roland@gnu.org> +Jim Meyering <meyering@lucent.com> +Eugene W. Myers <gene@cs.arizona.edu> +Randy Smith <randy@gnu.org> +Richard Stallman <rms@gnu.org> +Leonard H. Tower Jr. <tower@ai.mit.edu> +Eli Zaretskii <eliz@is.elta.co.il> diff --git a/gnu/dist/diffutils/aclocal.m4 b/gnu/dist/diffutils/aclocal.m4 new file mode 100644 index 00000000000..60288022349 --- /dev/null +++ b/gnu/dist/diffutils/aclocal.m4 @@ -0,0 +1,3633 @@ +# aclocal.m4 generated automatically by aclocal 1.6 -*- Autoconf -*- + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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. + +# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*- + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_PREREQ([2.52]) + +# serial 6 + +# 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. We must strip everything past the first ":", +# and everything past the last "/". + +# _AM_DIRNAME(PATH) +# ----------------- +# Like AS_DIRNAME, only do it during macro expansion +AC_DEFUN([_AM_DIRNAME], + [m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1, + m4_if(regexp([$1], [^//\([^/]\|$\)]), -1, + m4_if(regexp([$1], [^/.*]), -1, + [.], + patsubst([$1], [^\(/\).*], [\1])), + patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])), + patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl +])# _AM_DIRNAME + + +# The stamp files are numbered to have different names. +# We could number them on a directory basis, but that's additional +# complications, let's have a unique counter. +m4_define([_AM_STAMP_Count], [0]) + + +# _AM_STAMP(HEADER) +# ----------------- +# The name of the stamp file for HEADER. +AC_DEFUN([_AM_STAMP], +[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl +AS_ESCAPE(_AM_DIRNAME(patsubst([$1], + [:.*])))/stamp-h[]_AM_STAMP_Count]) + + +# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS) +# ------------------------------------------------------------ +# We used to try to get a real timestamp in stamp-h. But the fear is that +# that will cause unnecessary cvs conflicts. +AC_DEFUN([_AM_CONFIG_HEADER], +[# Add the stamp file to the list of files AC keeps track of, +# along with our hook. +AC_CONFIG_HEADERS([$1], + [# update the timestamp +echo 'timestamp for $1' >"_AM_STAMP([$1])" +$2], + [$3]) +])# _AM_CONFIG_HEADER + + +# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS) +# -------------------------------------------------------------- +AC_DEFUN([AM_CONFIG_HEADER], +[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])]) +])# AM_CONFIG_HEADER + +# Do all the work for Automake. -*- Autoconf -*- + +# 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. + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 8 + +# 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... + + +AC_PREREQ([2.52]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# 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_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# 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 + 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_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# 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 + +_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 +]) +]) + +# Copyright 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# 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. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.6])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _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])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# 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)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# 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 +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 +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# 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. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# 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="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + +# Copyright 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# 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], 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 + + 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 + # 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. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}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=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + 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_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST([DEPDIR]) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --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]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _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/:.*$//'` + if (sed 1q $mf | fgrep 'generated by automake') > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # 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 -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //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"]) +]) + +# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*- + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +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 | fgrep -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 +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +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])]) + +# isc-posix.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# 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"]) + ] +) + + +# Copyright 1996, 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# @defmac AC_PROG_CC_STDC +# @maindex PROG_CC_STDC +# @ovindex CC +# If the C compiler in not in ANSI C mode by default, try to add an option +# to output variable @code{CC} to make it so. This macro tries various +# options that select ANSI C on some system or another. It considers the +# compiler to be in ANSI C mode if it handles function prototypes correctly. +# +# If you use this macro, you should check after calling it whether the C +# compiler has been set to accept ANSI C; if not, the shell variable +# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source +# code in ANSI C, you can make an un-ANSIfied copy of it by using the +# program @code{ansi2knr}, which comes with Ghostscript. +# @end defmac + +AC_DEFUN([AM_PROG_CC_STDC], +[AC_REQUIRE([AC_PROG_CC]) +AC_BEFORE([$0], [AC_C_INLINE]) +AC_BEFORE([$0], [AC_C_CONST]) +dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require +dnl a magic option to avoid problems with ANSI preprocessor commands +dnl like #elif. +dnl FIXME: can't do this because then AC_AIX won't work due to a +dnl circular dependency. +dnl AC_BEFORE([$0], [AC_PROG_CPP]) +AC_MSG_CHECKING([for ${CC-cc} option to accept ANSI C]) +AC_CACHE_VAL(am_cv_prog_cc_stdc, +[am_cv_prog_cc_stdc=no +ac_save_CC="$CC" +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + AC_TRY_COMPILE( +[#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +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; +], [ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +], +[am_cv_prog_cc_stdc="$ac_arg"; break]) +done +CC="$ac_save_CC" +]) +if test -z "$am_cv_prog_cc_stdc"; then + AC_MSG_RESULT([none needed]) +else + AC_MSG_RESULT([$am_cv_prog_cc_stdc]) +fi +case "x$am_cv_prog_cc_stdc" in + x|xno) ;; + *) CC="$CC $am_cv_prog_cc_stdc" ;; +esac +]) + +#serial 3 +# Make sure _GNU_SOURCE is defined where necessary: as early as possible +# for configure-time tests, as well as for every source file that includes +# config.h. + +# From Jim Meyering. + +AC_DEFUN([AC__GNU_SOURCE], +[ + # Make sure that _GNU_SOURCE is defined for all subsequent + # configure-time compile tests. + # This definition must be emitted (into confdefs.h) before any + # test that involves compilation. + cat >>confdefs.h <<\EOF +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +EOF + + # Emit this code into config.h.in. + # The ifndef is to avoid redefinition warnings. + AH_VERBATIM([_GNU_SOURCE], [#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif]) +]) + +# Check for variable-length arrays. + +#serial 1 + +# From Paul Eggert + +# Copyright (C) 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_C_VARARRAYS], +[ + AC_CACHE_CHECK([for variable-length arrays], + ac_cv_c_vararrays, + [AC_TRY_COMPILE( + [], + [static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0];], + ac_cv_c_vararrays=yes, + ac_cv_c_vararrays=no)]) + if test $ac_cv_c_vararrays = yes; then + AC_DEFINE(HAVE_C_VARARRAYS, 1, + [Define to 1 if C supports variable-length arrays.]) + fi +]) + +# Check for stdbool.h that conforms to C99. + +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_HEADER_STDBOOL], + [AC_CACHE_CHECK([for stdbool.h that conforms to C99], + [ac_cv_header_stdbool_h], + [AC_TRY_COMPILE( + [ + #include <stdbool.h> + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #ifndef true + "error: false is not defined" + #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]; + char e[(bool) &s == true ? 1 : -1]; + char f[(_Bool) -0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + ], + [ return !a + !b + !c + !d + !e + !f + !g + !h + !i; ], + [ac_cv_header_stdbool_h=yes], + [ac_cv_header_stdbool_h=no])]) + 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]) + +#serial 6 + +dnl From Paul Eggert. + +AC_PREREQ(2.52) + +# Define intmax_t to long or long long if <inttypes.h> doesn't define. + +AC_DEFUN([jm_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + AC_CHECK_TYPE(intmax_t, , + [test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to widest signed type if <inttypes.h> doesn't define.])]) +]) + +# Define uintmax_t to unsigned long or unsigned long long +# if <inttypes.h> doesn't define. + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + AC_CHECK_TYPE(uintmax_t, , + [test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to widest unsigned type if <inttypes.h> doesn't define.])]) +]) + +#serial 2 + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the long long type.]) + fi +]) + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the unsigned long long type.]) + fi +]) + +# gettext.m4 serial 13 (gettext-0.11.1) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2002. + +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. +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], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + 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]) + + 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) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + 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. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-ngettext], 2, 1)) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "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_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_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 test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; 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. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + 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 "$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 + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "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; 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) + AC_SUBST(INTLOBJS) + + 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 Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 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 Search for GNU xgettext 0.11 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= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /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 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 >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + 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 + 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" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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 "$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" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|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, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + AM_LC_MESSAGES + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) + +# lib-prefix.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + 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*) 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/lib"; 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/lib"; 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" +]) + +# lib-link.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +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. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L, +dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. +AC_DEFUN([AC_LIB_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" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" +]) + +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. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + 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= + 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= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + 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//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + 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 "X$found_dir" = "X/usr/lib"; 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 "$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 "$hardcode_libdir_flag_spec" && test "$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 "$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 $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 + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + 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*) 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/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) 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 + ;; + -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 "$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:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$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=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) + +# lib-ld.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +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. +if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +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. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + 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 +]) + +# iconv.m4 serial AM3 (gettext-0.11) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +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). + + 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]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + 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], +[ + AC_REQUIRE([AM_ICONV_LINK]) + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) + +# progtest.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1996. + +# 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], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include <features.h> +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) + +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include <langinfo.h>], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have <langinfo.h> and nl_langinfo(CODESET).]) + fi +]) + +# lcmessage.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995. + +# Check whether LC_MESSAGES is available in <locale.h>. + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your <locale.h> file defines LC_MESSAGES.]) + fi + fi]) + +#serial 5 + +dnl From Paul Eggert. + +# Define ST_MTIM_NSEC to be the nanoseconds member of struct stat's st_mtim, +# if it exists. + +AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC], + [AC_CACHE_CHECK([for nanoseconds member of struct stat.st_mtim], + ac_cv_struct_st_mtim_nsec, + [ac_save_CPPFLAGS="$CPPFLAGS" + ac_cv_struct_st_mtim_nsec=no + # tv_nsec -- the usual case + # _tv_nsec -- Solaris 2.6, if + # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 + # && !defined __EXTENSIONS__) + # st__tim.tv_nsec -- UnixWare 2.1.2 + for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do + CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" + AC_TRY_COMPILE([#include <sys/types.h> +#include <sys/stat.h>], [struct stat s; s.st_mtim.ST_MTIM_NSEC;], + [ac_cv_struct_st_mtim_nsec=$ac_val; break]) + done + CPPFLAGS="$ac_save_CPPFLAGS"]) + + if test $ac_cv_struct_st_mtim_nsec != no; then + AC_DEFINE_UNQUOTED(ST_MTIM_NSEC, $ac_cv_struct_st_mtim_nsec, + [Define to be the nanoseconds member of struct stat's st_mtim, + if it exists.]) + fi + ] +) + +#serial 7 -*- autoconf -*- + +dnl From Jim Meyering. +dnl +dnl See if the glibc *_unlocked I/O macros are available. +dnl Use only those *_unlocked macros that are declared. +dnl + +AC_DEFUN([jm_FUNC_GLIBC_UNLOCKED_IO], + [AC_CHECK_DECLS( + [clearerr_unlocked, feof_unlocked, ferror_unlocked, + fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked, + fread_unlocked, fwrite_unlocked, getc_unlocked, + getchar_unlocked, putc_unlocked, putchar_unlocked])]) + +#serial 17 + +dnl This macro is intended to be used solely in this file. +dnl These are the prerequisite macros for GNU's strftime.c replacement. +AC_DEFUN([_jm_STRFTIME_PREREQS], +[ + dnl strftime.c uses localtime_r and the underyling system strftime + dnl if they exist. + AC_CHECK_FUNCS(localtime_r strftime) + + AC_CHECK_HEADERS(limits.h) + AC_CHECK_FUNCS(bcopy tzset mempcpy memcpy memset) + + # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE. + AC_STRUCT_TIMEZONE + + AC_CHECK_FUNCS(mblen mbrlen) + + AC_CHECK_MEMBER([struct tm.tm_gmtoff], + [AC_DEFINE(HAVE_TM_GMTOFF, 1, + [Define if struct tm has the tm_gmtoff member.])], + , + [#include <time.h>]) +]) + +dnl From Jim Meyering. +dnl +AC_DEFUN([jm_FUNC_GNU_STRFTIME], +[AC_REQUIRE([AC_HEADER_TIME])dnl + + _jm_STRFTIME_PREREQS + + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_CHECK_HEADERS(sys/time.h) + AC_DEFINE([my_strftime], [nstrftime], + [Define to the name of the strftime replacement function.]) +]) + +AC_DEFUN([jm_FUNC_STRFTIME], +[ + _jm_STRFTIME_PREREQS +]) + +#serial 5 + +dnl From Jim Meyering. +dnl Determine whether malloc accepts 0 as its argument. +dnl If it doesn't, arrange to use the replacement function. +dnl + +AC_DEFUN([jm_FUNC_MALLOC], +[ + dnl xmalloc.c requires that this symbol be defined so it doesn't + dnl mistakenly use a broken malloc -- as it might if this test were omitted. + AC_DEFINE(HAVE_DONE_WORKING_MALLOC_CHECK, 1, + [Define if the malloc check has been performed. ]) + + AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc, + [AC_TRY_RUN([ + char *malloc (); + int + main () + { + exit (malloc (0) ? 0 : 1); + } + ], + jm_cv_func_working_malloc=yes, + jm_cv_func_working_malloc=no, + dnl When crosscompiling, assume malloc is broken. + jm_cv_func_working_malloc=no) + ]) + if test $jm_cv_func_working_malloc = no; then + AC_LIBOBJ(malloc) + AC_DEFINE(malloc, rpl_malloc, + [Define to rpl_malloc if the replacement function should be used.]) + fi +]) + +#serial 5 + +dnl From Jim Meyering. +dnl Determine whether realloc works when both arguments are 0. +dnl If it doesn't, arrange to use the replacement function. +dnl + +AC_DEFUN([jm_FUNC_REALLOC], +[ + dnl xmalloc.c requires that this symbol be defined so it doesn't + dnl mistakenly use a broken realloc -- as it might if this test were omitted. + AC_DEFINE(HAVE_DONE_WORKING_REALLOC_CHECK, 1, + [Define if the realloc check has been performed. ]) + + AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc, + [AC_TRY_RUN([ + char *realloc (); + int + main () + { + exit (realloc (0, 0) ? 0 : 1); + } + ], + jm_cv_func_working_realloc=yes, + jm_cv_func_working_realloc=no, + dnl When crosscompiling, assume realloc is broken. + jm_cv_func_working_realloc=no) + ]) + if test $jm_cv_func_working_realloc = no; then + AC_LIBOBJ(realloc) + AC_DEFINE(realloc, rpl_realloc, + [Define to rpl_realloc if the replacement function should be used.]) + fi +]) + +# Check prerequisites for compiling lib/c-stack.c. + +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], + [# for STACK_DIRECTION + AC_REQUIRE([AC_FUNC_ALLOCA]) + + AC_CACHE_CHECK([for working C stack overflow detection], + ac_cv_sys_xsi_stack_overflow_heuristic, + [AC_TRY_RUN( + [ + #include <signal.h> + #include <ucontext.h> + + static union + { + char buffer[SIGSTKSZ]; + long double ld; + uintmax_t u; + void *p; + } alternate_signal_stack; + + #if STACK_DIRECTION + # define find_stack_direction(ptr) STACK_DIRECTION + #else + static int + find_stack_direction (char const *addr) + { + char dummy; + return (! addr ? find_stack_direction (&dummy) + : addr < &dummy ? 1 : -1); + } + #endif + + static void + segv_handler (int signo, siginfo_t *info, void *context) + { + if (0 < info->si_code) + { + ucontext_t const *user_context = context; + char const *stack_min = user_context->uc_stack.ss_sp; + size_t stack_size = user_context->uc_stack.ss_size; + char const *faulting_address = info->si_addr; + size_t s = faulting_address - stack_min; + size_t page_size = sysconf (_SC_PAGESIZE); + if (find_stack_direction (0) < 0) + s += page_size; + if (s < stack_size + page_size) + _exit (0); + } + + _exit (1); + } + + static int + c_stack_action (void) + { + stack_t st; + struct sigaction act; + int r; + + st.ss_flags = 0; + st.ss_sp = alternate_signal_stack.buffer; + st.ss_size = sizeof alternate_signal_stack.buffer; + r = sigaltstack (&st, 0); + if (r != 0) + return r; + + sigemptyset (&act.sa_mask); + act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; + act.sa_sigaction = segv_handler; + return sigaction (SIGSEGV, &act, 0); + } + + static int + recurse (char *p) + { + char array[500]; + array[0] = 1; + return *p + recurse (array); + } + + int + main (void) + { + c_stack_action (); + return recurse ("\1"); + } + ], + [ac_cv_sys_xsi_stack_overflow_heuristic=yes], + [ac_cv_sys_xsi_stack_overflow_heuristic=no], + [ac_cv_sys_xsi_stack_overflow_heuristic=cross-compiling])]) + + if test $ac_cv_sys_xsi_stack_overflow_heuristic = yes; then + AC_DEFINE(HAVE_XSI_STACK_OVERFLOW_HEURISTIC, 1, + [Define to 1 if extending the stack slightly past the limit causes + a SIGSEGV, and an alternate stack can be established with sigaltstack, + and the signal handler is passed a context that specifies the + run time stack. This behavior is defined by POSIX 1003.1-2001 + with the X/Open System Interface (XSI) option + and is a standardized way to implement a SEGV-based stack + overflow detection heuristic.]) + fi]) + + +AC_DEFUN([jm_PREREQ_C_STACK], + [AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) + AC_REQUIRE([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC]) + + # for STACK_DIRECTION + AC_REQUIRE([AC_FUNC_ALLOCA]) + + AC_CHECK_HEADERS(unistd.h) + + AC_CHECK_TYPES([siginfo_t, stack_t], , , [#include <signal.h>])]) + +#serial 4 + +dnl FIXME: put these prerequisite-only *.m4 files in a separate +dnl directory -- otherwise, they'll conflict with existing files. + +dnl These are the prerequisite macros for GNU's error.c file. +AC_DEFUN([jm_PREREQ_ERROR], +[ + AC_CHECK_FUNCS(strerror vprintf doprnt) + AC_CHECK_DECLS([strerror]) + AC_FUNC_STRERROR_R + AC_HEADER_STDC +]) + +#serial 22 + +dnl These are the prerequisite macros for files in the lib/ +dnl directories of the fileutils, sh-utils, and textutils packages. + +AC_DEFUN([jm_PREREQ], +[ + jm_PREREQ_ADDEXT + jm_PREREQ_CANON_HOST + jm_PREREQ_DIRNAME + jm_PREREQ_ERROR + jm_PREREQ_EXCLUDE + jm_PREREQ_GETPAGESIZE + jm_PREREQ_HARD_LOCALE + jm_PREREQ_HASH + jm_PREREQ_HUMAN + jm_PREREQ_MBSWIDTH + jm_PREREQ_MEMCHR + jm_PREREQ_PHYSMEM + jm_PREREQ_POSIXVER + jm_PREREQ_QUOTEARG + jm_PREREQ_READUTMP + jm_PREREQ_REGEX + jm_PREREQ_TEMPNAME # called by mkstemp + jm_PREREQ_XGETCWD + jm_PREREQ_XREADLINK +]) + +AC_DEFUN([jm_PREREQ_ADDEXT], +[ + dnl For addext.c. + AC_SYS_LONG_FILE_NAMES + AC_CHECK_FUNCS(pathconf) + AC_CHECK_HEADERS(limits.h string.h unistd.h) +]) + +AC_DEFUN([jm_PREREQ_CANON_HOST], +[ + dnl Add any libraries as early as possible. + dnl In particular, inet_ntoa needs -lnsl at least on Solaris5.5.1, + dnl so we have to add -lnsl to LIBS before checking for that function. + AC_SEARCH_LIBS(gethostbyname, [inet nsl]) + + dnl These come from -lnsl on Solaris5.5.1. + AC_CHECK_FUNCS(gethostbyname gethostbyaddr inet_ntoa) + + AC_CHECK_FUNCS(gethostbyname gethostbyaddr inet_ntoa) + AC_CHECK_HEADERS(unistd.h string.h netdb.h sys/socket.h \ + netinet/in.h arpa/inet.h) +]) + +AC_DEFUN([jm_PREREQ_DIRNAME], +[ + AC_HEADER_STDC + AC_CHECK_HEADERS(string.h) +]) + +AC_DEFUN([jm_PREREQ_EXCLUDE], +[ + jm_FUNC_FNMATCH + AC_HEADER_STDBOOL +]) + +AC_DEFUN([jm_PREREQ_GETPAGESIZE], +[ + AC_CHECK_FUNCS(getpagesize) + AC_CHECK_HEADERS(OS.h unistd.h) +]) + +AC_DEFUN([jm_PREREQ_HARD_LOCALE], +[ + AC_C_PROTOTYPES + AC_CHECK_FUNCS(setlocale) + AC_CHECK_HEADERS(locale.h stdlib.h string.h) +]) + +AC_DEFUN([jm_PREREQ_HASH], +[ + AC_CHECK_HEADERS(stdlib.h) + AC_HEADER_STDBOOL + AC_REQUIRE([jm_CHECK_DECLS]) +]) + +# If you use human.c, you need the following files: +# inttypes.m4 ulonglong.m4 +AC_DEFUN([jm_PREREQ_HUMAN], +[ + AC_CHECK_HEADERS(limits.h stdlib.h string.h) + AC_CHECK_DECLS([getenv]) + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) +]) + +AC_DEFUN([jm_PREREQ_MEMCHR], +[ + AC_CHECK_HEADERS(limits.h stdlib.h bp-sym.h) +]) + +AC_DEFUN([jm_PREREQ_PHYSMEM], +[ + AC_CHECK_HEADERS(sys/pstat.h unistd.h) + AC_CHECK_FUNCS(pstat_getstatic pstat_getdynamic) +]) + +AC_DEFUN([jm_PREREQ_POSIXVER], +[ + AC_CHECK_HEADERS(unistd.h) + AC_CHECK_DECLS([getenv]) +]) + +AC_DEFUN([jm_PREREQ_QUOTEARG], +[ + AC_CHECK_FUNCS(isascii iswprint) + jm_FUNC_MBRTOWC + AC_CHECK_HEADERS(limits.h stddef.h stdlib.h string.h wchar.h wctype.h) + AC_HEADER_STDC + AC_C_BACKSLASH_A + AC_MBSTATE_T + AM_C_PROTOTYPES +]) + +AC_DEFUN([jm_PREREQ_REGEX], +[ + dnl FIXME: Maybe provide a btowc replacement someday: solaris-2.5.1 lacks it. + dnl FIXME: Check for wctype and iswctype, and and add -lw if necessary + dnl to get them. + AC_CHECK_FUNCS(bzero bcopy isascii btowc) + AC_CHECK_HEADERS(alloca.h libintl.h wctype.h wchar.h) + AC_HEADER_STDC + AC_FUNC_ALLOCA +]) + +AC_DEFUN([jm_PREREQ_TEMPNAME], +[ + AC_HEADER_STDC + AC_HEADER_STAT + AC_CHECK_HEADERS(fcntl.h sys/time.h stdint.h unistd.h) + AC_CHECK_FUNCS(__secure_getenv gettimeofday) + AC_CHECK_DECLS([getenv]) +]) + +AC_DEFUN([jm_PREREQ_XGETCWD], +[ + AC_C_PROTOTYPES + AC_CHECK_HEADERS(limits.h stdlib.h sys/param.h unistd.h) + AC_CHECK_FUNCS(getcwd) + AC_FUNC_GETCWD_NULL +]) + +AC_DEFUN([jm_PREREQ_XREADLINK], +[ + AC_C_PROTOTYPES + AC_CHECK_HEADERS(limits.h stdlib.h sys/types.h unistd.h) +]) + +#serial 18 + +dnl This is just a wrapper function to encapsulate this kludge. +dnl Putting it in a separate file like this helps share it between +dnl different packages. +AC_DEFUN([jm_CHECK_DECLS], +[ + AC_REQUIRE([_jm_DECL_HEADERS]) + AC_REQUIRE([AC_HEADER_TIME]) + headers=' +#include <stdio.h> +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#else +# if HAVE_STRINGS_H +# include <strings.h> +# endif +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include <sys/types.h> +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + +#if HAVE_UTMP_H +# include <utmp.h> +#endif + +#if HAVE_GRP_H +# include <grp.h> +#endif + +#if HAVE_PWD_H +# include <pwd.h> +#endif +' + + AC_CHECK_DECLS([ + free, + getenv, + geteuid, + getgrgid, + getlogin, + getpwuid, + getuid, + getutent, + lseek, + malloc, + memchr, + memrchr, + nanosleep, + realloc, + stpcpy, + strndup, + strnlen, + strstr, + strtoul, + strtoull, + ttyname], , , $headers) +]) + +dnl FIXME: when autoconf has support for it. +dnl This is a little helper so we can require these header checks. +AC_DEFUN([_jm_DECL_HEADERS], +[ + AC_REQUIRE([AC_HEADER_STDC]) + AC_CHECK_HEADERS(grp.h memory.h pwd.h string.h strings.h stdlib.h \ + unistd.h sys/time.h utmp.h utmpx.h) +]) + +#serial 4 + +dnl From Paul Eggert + +AC_DEFUN([jm_FUNC_MBRTOWC], +[ + AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], + jm_cv_func_mbrtowc, + [AC_TRY_LINK( + [#include <wchar.h>], + [mbstate_t state; return ! (sizeof state && mbrtowc);], + jm_cv_func_mbrtowc=yes, + jm_cv_func_mbrtowc=no)]) + if test $jm_cv_func_mbrtowc = yes; then + AC_DEFINE(HAVE_MBRTOWC, 1, + [Define to 1 if mbrtowc and mbstate_t are properly declared.]) + fi +]) + +#serial 4 + +dnl From Paul Eggert. + +AC_DEFUN([AC_C_BACKSLASH_A], +[ + AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a, + [AC_TRY_COMPILE([], + [ +#if '\a' == 'a' + syntax error; +#endif + char buf['\a' == 'a' ? -1 : 1]; + buf[0] = '\a'; + return buf[0] != "\a"[0]; + ], + ac_cv_c_backslash_a=yes, + ac_cv_c_backslash_a=no)]) + if test $ac_cv_c_backslash_a = yes; then + AC_DEFINE(HAVE_C_BACKSLASH_A, 1, + [Define if backslash-a works in C strings.]) + fi +]) + +# serial 9 + +# From Paul Eggert. + +# BeOS 5 has <wchar.h> but does not define mbstate_t, +# so you can't declare an object of that type. +# Check for this incompatibility with Standard C. + +# Include stdlib.h first, because otherwise this test would fail on Linux +# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits +# a syntax error in wchar.h due to the use of undefined __int32_t. + +AC_DEFUN([AC_MBSTATE_T], + [ + AC_CHECK_HEADERS(stdlib.h) + + AC_CACHE_CHECK([for mbstate_t], ac_cv_type_mbstate_t, + [AC_TRY_COMPILE([ +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#include <wchar.h>], + [mbstate_t x; return sizeof x;], + ac_cv_type_mbstate_t=yes, + ac_cv_type_mbstate_t=no)]) + if test $ac_cv_type_mbstate_t = no; then + AC_DEFINE(mbstate_t, int, + [Define to a type if <wchar.h> does not define.]) + fi]) + + +# Copyright 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +AC_DEFUN([AM_C_PROTOTYPES], +[AC_REQUIRE([AM_PROG_CC_STDC]) +AC_REQUIRE([AC_PROG_CPP]) +AC_MSG_CHECKING([for function prototypes]) +if test "$am_cv_prog_cc_stdc" != no; then + AC_MSG_RESULT(yes) + AC_DEFINE(PROTOTYPES,1,[Define if compiler has function prototypes]) + U= ANSI2KNR= +else + AC_MSG_RESULT(no) + U=_ ANSI2KNR=./ansi2knr +fi +# Ensure some checks needed by ansi2knr itself. +AC_HEADER_STDC +AC_CHECK_HEADERS(string.h) +AC_SUBST(U)dnl +AC_SUBST(ANSI2KNR)dnl +]) + +#serial 4 + +# autoconf tests required for use of xstrtoumax.c + +AC_DEFUN([jm_AC_PREREQ_XSTRTOUMAX], +[ + AC_REQUIRE([jm_AC_TYPE_INTMAX_T]) + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + AC_CHECK_DECLS([strtol, strtoul, strtoull, strtoimax, strtoumax]) + AC_CHECK_HEADERS(limits.h stdlib.h inttypes.h) + + AC_CACHE_CHECK([whether <inttypes.h> defines strtoumax as a macro], + jm_cv_func_strtoumax_macro, + AC_EGREP_CPP([inttypes_h_defines_strtoumax], [#include <inttypes.h> +#ifdef strtoumax + inttypes_h_defines_strtoumax +#endif], + jm_cv_func_strtoumax_macro=yes, + jm_cv_func_strtoumax_macro=no)) + + if test "$jm_cv_func_strtoumax_macro" != yes; then + AC_REPLACE_FUNCS(strtoumax) + fi + + dnl Only the replacement strtoumax invokes strtoul and strtoull, + dnl so we need the replacements only if strtoumax does not exist. + case "$jm_cv_func_strtoumax_macro,$ac_cv_func_strtoumax" in + no,no) + AC_REPLACE_FUNCS(strtoul) + + dnl We don't need (and can't compile) the replacement strtoull + dnl unless the type `unsigned long long' exists. + if test "$ac_cv_type_unsigned_long_long" = yes; then + AC_REPLACE_FUNCS(strtoull) + fi + ;; + esac +]) + +# Check for fnmatch. + +# This is a modified version of autoconf's AC_FUNC_FNMATCH; +# it also checks for FNM_CASEFOLD or FNM_IGNORECASE. + +# Copyright (C) 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# AC_FUNC_FNMATCH +# --------------- +# We look for fnmatch.h to avoid that the test fails in C++. +AC_DEFUN([AC_FUNC_FNMATCH], +[AC_CACHE_CHECK([for working GNU-style fnmatch], + [ac_cv_func_fnmatch_works], +# Some versions of Solaris, SCO, and the GNU C Library +# have a broken or incompatible fnmatch. +# So we run a test program. If we are cross-compiling, take no chance. +# Thanks to John Oleynick, Franc,ois Pinard, and Paul Eggert for this test. +[AC_RUN_IFELSE([AC_LANG_PROGRAM([@%:@include <fnmatch.h>], + [exit (fnmatch ("a*", "abc", 0) != 0 + || fnmatch ("xxXX", "xXxX", FNM_CASEFOLD) != 0 + || fnmatch ("d*/*1", "d/s/1", FNM_FILE_NAME) != FNM_NOMATCH + || fnmatch ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR) != 0 + || fnmatch ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR) != 0 + || fnmatch ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR) != 0);])], + [ac_cv_func_fnmatch_works=yes], + [ac_cv_func_fnmatch_works=no], + [ac_cv_func_fnmatch_works=no])]) +if test $ac_cv_func_fnmatch_works = yes; then + AC_DEFINE(HAVE_FNMATCH, 1, + [Define to 1 if your system has a working `fnmatch' function.]) +fi +])# AC_FUNC_FNMATCH + +#serial 12 + +dnl Initially derived from code in GNU grep. +dnl Mostly written by Jim Meyering. + +dnl Usage: jm_INCLUDED_REGEX([lib/regex.c]) +dnl +AC_DEFUN([jm_INCLUDED_REGEX], + [ + dnl Even packages that don't use regex.c can use this macro. + dnl Of course, for them it doesn't do anything. + + # Assume we'll default to using the included regex.c. + ac_use_included_regex=yes + + # However, if the system regex support is good enough that it passes the + # 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. The first failing regular expression is from `Spencer ere + # test #75' in grep-2.3. + AC_CACHE_CHECK([for working re_compile_pattern], + jm_cv_func_working_re_compile_pattern, + AC_TRY_RUN( +[#include <stdio.h> +#include <regex.h> + int + main () + { + static struct re_pattern_buffer regex; + const char *s; + struct re_registers regs; + re_set_syntax (RE_SYNTAX_POSIX_EGREP); + [s = re_compile_pattern ("a[[:@:>@:]]b\n", 9, ®ex);] + /* This should fail with _Invalid character class name_ error. */ + if (!s) + exit (1); + + /* This should succeed, but doesn't for e.g. glibc-2.1.3. */ + s = re_compile_pattern ("{1", 2, ®ex); + + if (s) + exit (1); + + /* The following example is derived from a problem report + against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ + s = re_compile_pattern ("[[anù]]*n", 7, ®ex); + if (s) + exit (1); + + /* This should match, but doesn't for e.g. glibc-2.2.1. */ + if (re_match (®ex, "an", 2, 0, ®s) != 2) + exit (1); + + exit (0); + } + ], + jm_cv_func_working_re_compile_pattern=yes, + jm_cv_func_working_re_compile_pattern=no, + dnl When crosscompiling, assume it's broken. + jm_cv_func_working_re_compile_pattern=no)) + if test $jm_cv_func_working_re_compile_pattern = yes; then + ac_use_included_regex=no + fi + + test -n "$1" || AC_MSG_ERROR([missing argument]) + m4_syscmd([test -f $1]) + ifelse(m4_sysval, 0, + [ + AC_ARG_WITH(included-regex, + [ --without-included-regex don't compile regex; this is the default on + systems with version 2 of the GNU C library + (use with caution on other system)], + jm_with_regex=$withval, + jm_with_regex=$ac_use_included_regex) + if test "$jm_with_regex" = yes; then + AC_LIBOBJ(regex) + fi + ], + ) + ] +) + +#serial 5 + +# Define some macros required for proper operation of code in lib/*.c +# on MSDOS/Windows systems. + +# From Jim Meyering. + +AC_DEFUN([jm_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__ +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 + else + ac_fs_accepts_drive_letter_prefix=0 + ac_fs_backslash_is_file_name_separator=0 + fi + + AH_VERBATIM(FILESYSTEM_PREFIX_LEN, + [#if FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX +# define FILESYSTEM_PREFIX_LEN(Filename) \ + ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0) +#else +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_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 FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_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.]) + ]) + +# Check for setmode, DOS style. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_FUNC_SETMODE_DOS], + [AC_CHECK_HEADERS(fcntl.h unistd.h) + AC_CACHE_CHECK([for DOS-style setmode], + [ac_cv_func_setmode_dos], + [AC_TRY_LINK( + [#include <io.h> + #if HAVE_FCNTL_H + # include <fcntl.h> + #endif + #if HAVE_UNISTD_H + # include <unistd.h> + #endif], + [int ret = setmode && setmode (1, O_BINARY);], + [ac_cv_func_setmode_dos=yes], + [ac_cv_func_setmode_dos=no])]) + if test $ac_cv_func_setmode_dos = yes; then + AC_DEFINE(HAVE_SETMODE_DOS, 1, + [Define to 1 if you have the DOS-style `setmode' function.]) + fi]) + diff --git a/gnu/dist/diffutils/config/config.guess b/gnu/dist/diffutils/config/config.guess new file mode 100644 index 00000000000..ed2e03b7f2b --- /dev/null +++ b/gnu/dist/diffutils/config/config.guess @@ -0,0 +1,1321 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 c99 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/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 + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-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 + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # 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 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # 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. + cat <<EOF >$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + 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 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + 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 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + 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 0 ;; + 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 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + 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 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # 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 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + 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 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + 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 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + 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 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i386-pc-interix3 + exit 0 ;; + 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 i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + 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 | grep ^CPU=` + rm -f $dummy.c + test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + 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 0 ;; + 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 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + 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 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # 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 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + 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 0 ;; + 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 0 ;; + 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 0 ;; + i*86:*:5:[78]*) + 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 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + 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 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + 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 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*: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 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *: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 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + 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 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + 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 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# 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 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + ftp://ftp.gnu.org/pub/gnu/config/ + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/gnu/dist/diffutils/config/config.rpath b/gnu/dist/diffutils/config/config.rpath new file mode 100755 index 00000000000..5ead7586a7c --- /dev/null +++ b/gnu/dist/diffutils/config/config.rpath @@ -0,0 +1,513 @@ +#! /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-2002 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# 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. +# +# 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. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shlibext= + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix3* | aix4* | aix5*) + wl='-Wl,' + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6*) + wl='-Wl,' + ;; + linux*) + echo '__INTEL_COMPILER' > conftest.$ac_ext + if $CC -E conftest.$ac_ext >/dev/null | grep __INTEL_COMPILER >/dev/null + then + : + else + # Intel icc + wl='-Qoption,ld,' + fi + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + if test "x$host_vendor" = xsni; then + wl='-LD' + else + wl='-Wl,' + fi + ;; + esac +fi + +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 + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | egrep ': 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' + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + 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 + ;; + 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=yes + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9* | hpux10* | hpux11*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + ;; + irix5* | irix6*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + if test "x$host_vendor" = xsno; then + hardcode_direct=yes # is this really true??? + else + hardcode_direct=no # Motorola manual says yes, but my tests say they lie + fi + ;; + sysv4.3*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5uw7* | unixware7*) + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +libname_spec='lib$name' +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +case "$host_os" in + aix3*) + shlibext=so + ;; + aix4* | aix5*) + shlibext=so + ;; + amigaos*) + shlibext=ixlibrary + ;; + beos*) + shlibext=so + ;; + bsdi4*) + shlibext=so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + ;; + cygwin* | mingw* | pw32*) + case $GCC,$host_os in + yes,cygwin*) + shlibext=dll.a + ;; + yes,mingw*) + shlibext=dll + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + shlibext=dll + ;; + *) + shlibext=dll + ;; + esac + ;; + darwin* | rhapsody*) + shlibext=dylib + ;; + freebsd1*) + ;; + freebsd*) + shlibext=so + ;; + gnu*) + shlibext=so + ;; + hpux9* | hpux10* | hpux11*) + shlibext=sl + ;; + irix5* | irix6*) + shlibext=so + case "$host_os" in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 ") libsuff= shlibsuff= ;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + ;; + linux-gnu*) + shlibext=so + ;; + netbsd*) + shlibext=so + ;; + newsos6) + shlibext=so + ;; + openbsd*) + shlibext=so + ;; + os2*) + libname_spec='$name' + shlibext=dll + ;; + osf3* | osf4* | osf5*) + shlibext=so + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + sco3.2v5*) + shlibext=so + ;; + solaris*) + shlibext=so + ;; + sunos4*) + shlibext=so + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + shlibext=so + case "$host_vendor" in + motorola) + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + uts4*) + shlibext=so + ;; + dgux*) + shlibext=so + ;; + sysv4*MP*) + if test -d /usr/nec; then + shlibext=so + fi + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | 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"` +escaped_sys_lib_search_path_spec=`echo "X$sys_lib_search_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` +escaped_sys_lib_dlsearch_path_spec=`echo "X$sys_lib_dlsearch_path_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF + +# How to pass a linker flag through the compiler. +wl="$escaped_wl" + +# Static library suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally "so"). +shlibext="$shlibext" + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="$hardcode_libdir_separator" + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct="$hardcode_direct" + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L="$hardcode_minus_L" + +# Compile-time system search path for libraries +sys_lib_search_path_spec="$escaped_sys_lib_search_path_spec" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="$escaped_sys_lib_dlsearch_path_spec" + +EOF diff --git a/gnu/dist/diffutils/config/config.sub b/gnu/dist/diffutils/config/config.sub new file mode 100644 index 00000000000..f3657978c74 --- /dev/null +++ b/gnu/dist/diffutils/config/config.sub @@ -0,0 +1,1443 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-07' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 0;; + + * ) + 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* | storm-chaos* | os2-emx* | windows32-* | 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) + 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 + ;; + -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/'` + ;; + -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] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 | mipsisa64 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[34] | sh[34]eb | shbe | shle | sh64 \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | 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) + ;; + + # 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-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + 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 + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + 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 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + 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 + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + 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 + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-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-*) + basic_machine=i686-`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 + ;; + 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 + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + 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 + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + 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 + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + 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 + ;; + 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 + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + 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 + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-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* | -netbsd* | -openbsd* | -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* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -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 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -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 + ;; + -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 + ;; + -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 + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # 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 + ;; + 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 + ;; + *-ibm) + os=-aix + ;; + *-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 + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + 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 0 + +# 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/gnu/dist/diffutils/config/depcomp b/gnu/dist/diffutils/config/depcomp new file mode 100755 index 00000000000..368e3be93e0 --- /dev/null +++ b/gnu/dist/diffutils/config/depcomp @@ -0,0 +1,436 @@ +#! /bin/sh + +# depcomp - compile a program generating dependencies as side-effects +# Copyright 1999, 2000 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +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 +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi + +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. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + 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. 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. + stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + outname="$stripped.o" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + 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,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$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" + ;; + +tru64) + # The Tru64 AIX 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. + + base=`echo "$object" | sed -e 's/\.o$/.d/' -e 's/\.lo$/.d/'` + tmpdepfile1="$base.o.d" + tmpdepfile2="$base.d" + if test "$libtool" = yes; then + "$@" -Wc,-MD + else + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + else + tmpdepfile="$tmpdepfile2" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a space and a tab 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 proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + test -z "$dashmflag" && dashmflag=-M + ( IFS=" " + case " $* " in + *" --mode=compile "*) # this is libtool, let us make it quiet + for arg + do # cycle over the arguments + case "$arg" in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + 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) + # 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;; + -*) + ;; + *) + set fnord "$@" "$arg"; shift;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + 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 proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + 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 proprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + ( IFS=" " + case " $* " in + *" --mode=compile "*) + for arg + do # cycle over the arguments + case $arg in + "--mode=compile") + # insert --quiet before "--mode=compile" + set fnord "$@" --quiet + shift # fnord + ;; + esac + set fnord "$@" "$arg" + shift # fnord + shift # "$arg" + done + ;; + esac + 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" + ) & + proc=$! + "$@" + stat=$? + wait "$proc" + if test "$stat" != 0; then exit $stat; fi + 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 diff --git a/gnu/dist/diffutils/config/install-sh b/gnu/dist/diffutils/config/install-sh new file mode 100755 index 00000000000..398a88e1421 --- /dev/null +++ b/gnu/dist/diffutils/config/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# 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. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + : + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + : + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + : + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# 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 $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/gnu/dist/diffutils/config/mdate-sh b/gnu/dist/diffutils/config/mdate-sh new file mode 100755 index 00000000000..c079aed3e22 --- /dev/null +++ b/gnu/dist/diffutils/config/mdate-sh @@ -0,0 +1,97 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. +# Copyright 1995, 1996, 1997 Free Software Foundation, Inc. +# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# Prevent date giving response in another language. +LANG=C +export LANG +LC_ALL=C +export LC_ALL +LC_TIME=C +export LC_TIME + +# Get the extended ls output of the file or directory. +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +if ls -L /dev/null 1>/dev/null 2>&1; then + set - x`ls -L -l -d $1` +else + set - x`ls -l -d $1` +fi +# The month is at least the fourth argument +# (3 shifts here, the next inside the loop). +shift +shift +shift + +# Find the month. Next argument is day, followed by the year or time. +month= +until test $month +do + 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 + +day=$2 + +# 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 diff --git a/gnu/dist/diffutils/config/missing b/gnu/dist/diffutils/config/missing new file mode 100755 index 00000000000..dd583709f53 --- /dev/null +++ b/gnu/dist/diffutils/config/missing @@ -0,0 +1,336 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# 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 + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -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' + 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]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing 0.4 - GNU automake" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. + You can get \`$1Help2man' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. 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." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # 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 ${1+"$@"} && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar ${1+"$@"} && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" ${1+"$@"} && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" ${1+"$@"} && 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 you do not seem to have it handy on your + system. 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 prerequirements 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 diff --git a/gnu/dist/diffutils/config/mkinstalldirs b/gnu/dist/diffutils/config/mkinstalldirs new file mode 100644 index 00000000000..3f605fa6344 --- /dev/null +++ b/gnu/dist/diffutils/config/mkinstalldirs @@ -0,0 +1,101 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman <friedman@prep.ai.mit.edu> +# Created: 1993-05-16 +# Public domain + +# Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case "${1}" in + -h | --help | --h* ) # -h for help + echo "${usage}" 1>&2; exit 0 ;; + -m ) # -m PERM arg + shift + test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } + dirmode="${1}" + shift ;; + -- ) shift; break ;; # stop option processing + -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option + * ) break ;; # first non-opt arg + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in +0) exit 0 ;; +esac + +case $dirmode in +'') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi ;; +*) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + 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: 3 +# End: +# mkinstalldirs ends here diff --git a/gnu/dist/diffutils/config/texinfo.tex b/gnu/dist/diffutils/config/texinfo.tex new file mode 100644 index 00000000000..df62a127bb7 --- /dev/null +++ b/gnu/dist/diffutils/config/texinfo.tex @@ -0,0 +1,6364 @@ +% 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{2002-03-26.08} +% +% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, +% 2000, 01, 02 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2, or (at +% your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this texinfo.tex file; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +% Boston, MA 02111-1307, USA. +% +% In other words, you are welcome to use, share and improve this program. +% You are forbidden to forbid anyone else to use, share and improve +% what you give them. Help stamp out software-hoarding! +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% ftp://ftp.gnu.org/gnu/texinfo.tex +% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) +% ftp://texinfo.org/texinfo/texinfo.tex +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org), +% and /home/gd/gnu/doc/texinfo.tex on the GNU machines. +% +% The texinfo.tex in any given Texinfo distribution could well be out +% of date, so if that's what you're using, please check. +% +% Texinfo has a small home page at http://texinfo.org/ and also +% http://www.gnu.org/software/texinfo. +% +% 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. You can get +% the existing language-specific files from the full Texinfo distribution. + +\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} + +% Save some parts of plain tex 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\ptexi=\i +\let\ptexlbrace=\{ +\let\ptexrbrace=\} +\let\ptexstar=\* +\let\ptext=\t + +% We never want plain's outer \+ definition in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +\message{Basics,} +\chardef\other=12 + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% 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\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi +\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi + +% Ignore a token. +% +\def\gobble#1{} + +\hyphenation{ap-pen-dix} +\hyphenation{mini-buf-fer mini-buf-fers} +\hyphenation{eshell} +\hyphenation{white-space} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen \bindingoffset +\newdimen \normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% 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. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\ifx\eTeXversion\undefined +\def\loggingall{\tracingcommands2 \tracingstats2 + \tracingpages1 \tracingoutput1 \tracinglostchars1 + \tracingmacros2 \tracingparagraphs1 \tracingrestores1 + \showboxbreadth\maxdimen\showboxdepth\maxdimen +}% +\else +\def\loggingall{\tracingcommands3 \tracingstats2 + \tracingpages1 \tracingoutput1 \tracinglostchars1 + \tracingmacros2 \tracingparagraphs1 \tracingrestores1 + \tracingscantokens1 \tracingassigns1 \tracingifs1 + \tracinggroups1 \tracingnesting2 + \showboxbreadth\maxdimen\showboxdepth\maxdimen +}% +\fi + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \escapechar = `\\ % use backslash in output files. + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \turnoffactive + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg#1{% + \let\next = #1% + \begingroup + \obeylines + \futurelet\temp\parseargx +} + +% If the next token is an obeyed space (from an @example environment or +% the like), remove it and recurse. Otherwise, we're done. +\def\parseargx{% + % \obeyedspace is defined far below, after the definition of \sepspaces. + \ifx\obeyedspace\temp + \expandafter\parseargdiscardspace + \else + \expandafter\parseargline + \fi +} + +% Remove a single space (as the delimiter token to the macro call). +{\obeyspaces % + \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + % + % First remove any @c comment, then any @comment. + % Result of each macro is put in \toks0. + \argremovec #1\c\relax % + \expandafter\argremovecomment \the\toks0 \comment\relax % + % + % Call the caller's macro, saved as \next in \parsearg. + \expandafter\next\expandafter{\the\toks0}% + }% +} + +% Since all \c{,omment} does is throw away the argument, we can let TeX +% do that for us. The \relax here is matched by the \relax in the call +% in \parseargline; it could be more or less anything, its purpose is +% just to delimit the argument to the \c. +\def\argremovec#1\c#2\relax{\toks0 = {#1}} +\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} + +% \argremovec{,omment} might leave us with trailing spaces, though; e.g., +% @end itemize @c foo +% will have two active spaces as part of the argument with the +% `itemize'. Here we remove all active spaces from #1, and assign the +% result to \toks0. +% +% This loses if there are any *other* active characters besides spaces +% in the argument -- _ ^ +, for example -- since they get expanded. +% Fortunately, Texinfo does not define any such commands. (If it ever +% does, the catcode of the characters in questionwill have to be changed +% here.) But this means we cannot call \removeactivespaces as part of +% \argremovec{,omment}, since @c uses \parsearg, and thus the argument +% that \parsearg gets might well have any character at all in it. +% +\def\removeactivespaces#1{% + \begingroup + \ignoreactivespaces + \edef\temp{#1}% + \global\toks0 = \expandafter{\temp}% + \endgroup +} + +% Change the active space to expand to nothing. +% +\begingroup + \obeyspaces + \gdef\ignoreactivespaces{\obeyspaces\let =\empty} +\endgroup + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +%% These are used to keep @begin/@end levels from running away +%% Call \inENV within environments (after a \begingroup) +\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} +\def\ENVcheck{% +\ifENV\errmessage{Still within an environment; press RETURN to continue} +\endgroup\fi} % This is not perfect, but it should reduce lossage + +% @begin foo is the same as @foo, for now. +\newhelp\EMsimple{Press RETURN to continue.} + +\outer\def\begin{\parsearg\beginxxx} + +\def\beginxxx #1{% +\expandafter\ifx\csname #1\endcsname\relax +{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else +\csname #1\endcsname\fi} + +% @end foo executes the definition of \Efoo. +% +\def\end{\parsearg\endxxx} +\def\endxxx #1{% + \removeactivespaces{#1}% + \edef\endthing{\the\toks0}% + % + \expandafter\ifx\csname E\endthing\endcsname\relax + \expandafter\ifx\csname \endthing\endcsname\relax + % There's no \foo, i.e., no ``environment'' foo. + \errhelp = \EMsimple + \errmessage{Undefined command `@end \endthing'}% + \else + \unmatchedenderror\endthing + \fi + \else + % Everything's ok; the right environment has been started. + \csname E\endthing\endcsname + \fi +} + +% There is an environment #1, but it hasn't been started. Give an error. +% +\def\unmatchedenderror#1{% + \errhelp = \EMsimple + \errmessage{This `@end #1' doesn't have a matching `@#1'}% +} + +% Define the control sequence \E#1 to give an unmatched @end error. +% +\def\defineunmatchedend#1{% + \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% +} + + +% Single-spacing is done by various environments (specifically, in +% \nonfillstart and \quotations). +\newskip\singlespaceskip \singlespaceskip = 12.5pt +\def\singlespace{% + % Why was this kern here? It messes up equalizing space above and below + % environments. --karl, 6may93 + %{\advance \baselineskip by -\singlespaceskip + %\kern \baselineskip}% + \setleading\singlespaceskip +} + +%% 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 actual \{ & \} command in an index. + \catcode`\{ = 12 \catcode`\} = 12 + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\@ = 0 \catcode`\\ = 12 + @gdef@lbracecmd[\{]% + @gdef@rbracecmd[\}]% +@endgroup + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @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 +% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} + +% 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 +} + +% 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} + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=3000 } + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +\def\group{\begingroup + \ifnum\catcode13=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + % + % The \vtop we start below 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. (See p.82 of + % the TeXbook.) Thus, space below is not quite equal to space + % above. But it's pretty close. + \def\Egroup{% + \egroup % End the \vtop. + \endgroup % End the \group. + }% + % + \vtop\bgroup + % We have to put a strut on the last line in case the @group is in + % the midst of an example, rather than completely enclosing it. + % Otherwise, the interline space between the last line of the group + % and the first line afterwards is too small. But we can't put the + % strut in \Egroup, since there it would be on a line by itself. + % Hence this just inserts a strut at the beginning of each line. + \everypar = {\strut}% + % + % Since we have a strut on every line, we don't need any of TeX's + % normal interline spacing. + \offinterlineskip + % + % OK, but now we have to do something about blank + % lines in the input in @example-like environments, which normally + % just turn into \lisppar, which will insert no space now that we've + % turned off the interline space. Simplest is to make them be an + % empty paragraph. + \ifx\par\lisppar + \edef\par{\leavevmode \par}% + % + % Reset ^^M's definition to new definition of \par. + \obeylines + \fi + % + % 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 +} +% +% 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 + +\def\need{\parsearg\needx} + +% Old definition--didn't work. +%\def\needx #1{\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 +%}} + +\def\needx#1{% + % 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 + +\let\br = \par + +% @dots{} output an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in a typewriter +% font as three actual period characters. +% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil minus 0.25fil + .\hss.\hss.% + \hskip 0pt plus 0.5fil minus 0.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \leavevmode + \hbox to 2em{% + \hskip 0pt plus 0.25fil minus 0.25fil + .\hss.\hss.\hss.% + \hskip 0pt plus 0.5fil minus 0.5fil + }% + \spacefactor=3000 +} + + +% @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. +\def\exdent{\parsearg\exdentyyy} +\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} + +% This defn is used inside nofill environments such as @example. +\def\nofillexdent{\parsearg\nofillexdentyyy} +\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount +\leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% Allow normal characters that we make active in the argument (a file name). +\def\include{\begingroup + \catcode`\\=12 + \catcode`~=12 + \catcode`^=12 + \catcode`_=12 + \catcode`|=12 + \catcode`<=12 + \catcode`>=12 + \catcode`+=12 + \parsearg\includezzz} +% Restore active chars for included file. +\def\includezzz#1{\endgroup\begingroup + % Read the included file in a group so nested @include's work. + \def\thisfile{#1}% + \input\thisfile +\endgroup} + +\def\thisfile{} + +% @center line outputs that line, centered + +\def\center{\parsearg\centerzzz} +\def\centerzzz #1{{\advance\hsize by -\leftskip +\advance\hsize by -\rightskip +\centerline{#1}}} + +% @sp n outputs n lines of vertical space + +\def\sp{\parsearg\spxxx} +\def\spxxx #1{\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. +% We cannot implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\def\paragraphindent{\parsearg\doparagraphindent} +\def\doparagraphindent#1{% + \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. +\def\exampleindent{\parsearg\doexampleindent} +\def\doexampleindent#1{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% We don't use $'s directly in the definition of \math because we need +% to set catcodes according to plain TeX first, to allow for subscripts, +% superscripts, special math chars, etc. +% +% @math does not do math typesetting in section titles, index +% entries, and other such contexts where the catcodes are set before +% @math gets a chance to work. This could perhaps be fixed, but for now +% at least we can have real math in the main text, where it's needed most. +% +\let\implicitmath = $%$ font-lock fix +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ within @math be active (mathcode "8000), and distinguish by seeing +% if the current family is \slfam, which is what @var uses. +% +{\catcode95 = \active % 95 = _ +\gdef\mathunderscore{% + \catcode95=\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 + \mathcode`\_="8000 \mathunderscore + \let\\ = \mathbackslash + \implicitmath\finishmath} +\def\finishmath#1{#1\implicitmath\Etex} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{\implicitmath\ptexbullet\implicitmath} +\def\minus{\implicitmath-\implicitmath} + +% @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{% + \iflinks + \readauxfile + \fi % \openindices needs to do some work in any case. + \openindices + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \global\let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + % Just to be on the safe side, close the input stream before the \input. + \openin 1 texinfo.cnf + \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi + \closein1 + \temp + % + \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 + +\ifx\pdfoutput\undefined + \pdffalse + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\linkcolor = \relax + \let\pdfmakeoutlines = \relax +\else + \pdftrue + \pdfoutput = 1 + \input pdfcolor + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}} + \def\pdfmkpgn#1{#1} + \let\linkcolor = \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + \def\pdfmakeoutlines{{% + \openin 1 \jobname.toc + \ifeof 1\else\begingroup + \closein 1 + \indexnofonts + \def\tt{} + \let\_ = \normalunderscore + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + \def\chapentry ##1##2##3{} + \let\appendixentry = \chapentry + \def\unnumbchapentry ##1##2{} + \def\secentry ##1##2##3##4{\advancenumber{chap##2}} + \def\unnumbsecentry ##1##2##3{\advancenumber{chap##2}} + \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} + \def\unnumbsubsecentry ##1##2##3##4{\advancenumber{sec##2.##3}} + \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} + \def\unnumbsubsubsecentry ##1##2##3##4##5{\advancenumber{subsec##2.##3.##4}} + \input \jobname.toc + \def\chapentry ##1##2##3{% + \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} + \let\appendixentry = \chapentry + \def\unnumbchapentry ##1##2{% + \pdfoutline goto name{\pdfmkpgn{##2}}{##1}} + \def\secentry ##1##2##3##4{% + \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} + \def\unnumbsecentry ##1##2##3{% + \pdfoutline goto name{\pdfmkpgn{##3}}{##1}} + \def\subsecentry ##1##2##3##4##5{% + \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} + \def\unnumbsubsecentry ##1##2##3##4{% + \pdfoutline goto name{\pdfmkpgn{##4}}{##1}} + \def\subsubsecentry ##1##2##3##4##5##6{% + \pdfoutline goto name{\pdfmkpgn{##6}}{##1}} + \def\unnumbsubsubsecentry ##1##2##3##4##5{% + \pdfoutline goto name{\pdfmkpgn{##5}}{##1}} + \input \jobname.toc + \endgroup\fi + }} + \def\makelinks #1,{% + \def\params{#1}\def\E{END}% + \ifx\params\E + \let\nextmakelinks=\relax + \else + \let\nextmakelinks=\makelinks + \ifnum\lnkcount>0,\fi + \picknum{#1}% + \startlink attr{/Border [0 0 0]} + goto name{\pdfmkpgn{\the\pgn}}% + \linkcolor #1% + \advance\lnkcount by 1% + \endlink + \fi + \nextmakelinks + } + \def\picknum#1{\expandafter\pn#1} + \def\pn#1{% + \def\p{#1}% + \ifx\p\lbrace + \let\nextpn=\ppn + \else + \let\nextpn=\ppnn + \def\first{#1} + \fi + \nextpn + } + \def\ppn#1{\pgn=#1\gobble} + \def\ppnn{\pgn=\first} + \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \let\value=\expandablevalue + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + % #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| + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\fi % \ifx\pdfoutput + + +\message{fonts,} +% Font-change commands. + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf analogous to plain's \rm, etc. +\newfam\sffam +\def\sf{\fam=\sffam \tensf} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this one. +\def\ttsl{\tenttsl} + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +\newcount\mainmagstep +\ifx\bigger\relax + % not really supported. + \let\mainmagstep=\magstep1 + \setfont\textrm\rmshape{12}{1000} + \setfont\texttt\ttshape{12}{1000} +\else + \mainmagstep=\magstephalf + \setfont\textrm\rmshape{10}{\mainmagstep} + \setfont\texttt\ttshape{10}{\mainmagstep} +\fi +% Instead of cmb10, you many want to use cmbx10. +% cmbx10 is a prettier font on its own, but cmb10 +% looks better when embedded in a line with cmr10. +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun, etc. +\setfont\defbf\bxshape{10}{\magstep1} %was 1314 +\setfont\deftt\ttshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 + +% Fonts for small examples (8pt). +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 + +% Fonts for title page: +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} + +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{\magstep1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +% The smallcaps and symbol fonts should actually be scaled \magstep1.5, +% but that is not a standard magnification. + +% 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 so that font changes will continue to work +% in math mode, where it is the current \fam that is relevant in most +% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam +% \tenbf}, for example. By redefining \tenbf, we obviate the need to +% redefine \bf itself. +\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 + \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 + \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 + \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 + \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 + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? +\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 + \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 + \resetmathfonts \setleading{9.5pt}} +\let\smallexamplefonts = \smallerfonts + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bxshape{12}{1000} +\setfont\shortcontsl\slshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} +\def\smartslanted#1{{\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\it #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic +\let\cite=\smartslanted + +\def\b#1{{\bf #1}} +\let\strong=\b + +% 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 = `- } + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\let\ttfont=\t +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in \code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active + \catcode`\_=\active + % + \global\def\code{\begingroup + \catcode`\-=\active \let-\codedash + \catcode`\_=\active \let_\codeunder + \codex + } + % + % If we end up with any active - characters when handling the index, + % just treat them as a normal -. + \global\def\indexbreaks{\catcode`\-=\active \let-\realdash} +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\def\kbdinputstyle{\parsearg\kbdinputstylexxx} +\def\kbdinputstylexxx#1{% + \def\arg{#1}% + \ifx\arg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\arg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\arg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is kbdinputdistinct. (Too much of a hassle to call the macro, +% the catcodes are wrong for parsearg to work.) +\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl} + +\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 @url, @env, @command quotes seem unnecessary, so use \code. +\let\url=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% 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 downcases the argument and prints in smallcaps. +\def\acronym#1{{\smallcaps \lowercase{#1}}} + +% @pounds{} is a sterling sign. +\def\pounds{{\it\$}} + + +\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 + +\def\shorttitlepage{\parsearg\shorttitlepagezzz} +\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\def\titlepage{\begingroup \parindent=0pt \textfonts + \let\subtitlerm=\tenrm + \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% + % + \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% + % + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % + % Now you can print the title using @title. + \def\title{\parsearg\titlezzz}% + \def\titlezzz##1{\leftline{\titlefonts\rm ##1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Now you can put text using @subtitle. + \def\subtitle{\parsearg\subtitlezzz}% + \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% + % + % @author should come last, but may come many times. + \def\author{\parsearg\authorzzz}% + \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi + {\authorfont \leftline{##1}}}% + % + % 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 + \oldpage + \let\page = \oldpage + \hbox{}}% +% \def\page{\oldpage \hbox{}} +} + +\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 +} + +%%% 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\oddheading{\parsearg\oddheadingxxx} +\def\everyheading{\parsearg\everyheadingxxx} + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\oddfooting{\parsearg\oddfootingxxx} +\def\everyfooting{\parsearg\everyfootingxxx} + +{\catcode`\@=0 % + +\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} +\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} +\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} +\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} +\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}} +% +}% unbind the catcode of @. + +% @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\settitlezzz} +\def\settitlezzz #1{\gdef\thistitle{#1}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(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, @vtable, 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\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} + +\def\internalBkitem{\smallbreak \parsearg\kitemzzz} +\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} + +\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% + \itemzzz {#1}} + +\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% + \itemzzz {#1}} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemfont{#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. Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue. + \nobreak + \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 table}} +\def\itemx{\errmessage{@itemx while not in a table}} +\def\kitem{\errmessage{@kitem while not in a table}} +\def\kitemx{\errmessage{@kitemx while not in a table}} +\def\xitem{\errmessage{@xitem while not in a table}} +\def\xitemx{\errmessage{@xitemx while not in a table}} + +% Contains a kludge to get @end[description] to work. +\def\description{\tablez{\dontindex}{1}{}{}{}{}} + +% @table, @ftable, @vtable. +\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} +{\obeylines\obeyspaces% +\gdef\tablex #1^^M{% +\tabley\dontindex#1 \endtabley}} + +\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} +{\obeylines\obeyspaces% +\gdef\ftablex #1^^M{% +\tabley\fnitemindex#1 \endtabley +\def\Eftable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} +{\obeylines\obeyspaces% +\gdef\vtablex #1^^M{% +\tabley\vritemindex#1 \endtabley +\def\Evtable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\dontindex #1{} +\def\fnitemindex #1{\doind {fn}{\code{#1}}}% +\def\vritemindex #1{\doind {vr}{\code{#1}}}% + +{\obeyspaces % +\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% +\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} + +\def\tablez #1#2#3#4#5#6{% +\aboveenvbreak % +\begingroup % +\def\Edescription{\Etable}% Necessary kludge. +\let\itemindex=#1% +\ifnum 0#3>0 \advance \leftskip by #3\mil \fi % +\ifnum 0#4>0 \tableindent=#4\mil \fi % +\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % +\def\itemfont{#2}% +\itemmax=\tableindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \tableindent % +\exdentamount=\tableindent +\parindent = 0pt +\parskip = \smallskipamount +\ifdim \parskip=0pt \parskip=2pt \fi% +\def\Etable{\endgraf\afterenvbreak\endgroup}% +\let\item = \internalBitem % +\let\itemx = \internalBitemx % +\let\kitem = \internalBkitem % +\let\kitemx = \internalBkitemx % +\let\xitem = \internalBxitem % +\let\xitemx = \internalBxitemx % +} + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\def\itemize{\parsearg\itemizezzz} + +\def\itemizezzz #1{% + \begingroup % ended by the @end itemize + \itemizey {#1}{\Eitemize} +} + +\def\itemizey #1#2{% +\aboveenvbreak % +\itemmax=\itemindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \itemindent % +\exdentamount=\itemindent +\parindent = 0pt % +\parskip = \smallskipamount % +\ifdim \parskip=0pt \parskip=2pt \fi% +\def#2{\endgraf\afterenvbreak\endgroup}% +\def\itemcontents{#1}% +\let\item=\itemizeitem} + +% Set sfcode to normal for the chars that usually have another value. +% These are `.?!:;,' +\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 + \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } + +% \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'. +% +\def\enumerate{\parsearg\enumeratezzz} +\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + \begingroup % ended by the @end enumerate + % + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a <number>. + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call itemizey, 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 + \itemizey{#1.}\Eenumerate\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} + +% Definition of @item while inside @itemize. + +\def\itemizeitem{% +\advance\itemno by 1 +{\let\par=\endgraf \smallbreak}% +\ifhmode \errmessage{In hmode at itemizeitem}\fi +{\parskip=0in \hskip 0pt +\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% +\vadjust{\penalty 1200}}% +\flushcr} + +% @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. +% +% For those who want to use more than one line's worth of words in +% the preamble, break the line within one argument and it +% will parse correctly, i.e., +% +% @multitable {Column 1 template} {Column 2 template} {Column 3 +% template} +% Not: +% @multitable {Column 1 template} {Column 2 template} +% {Column 3 template} + +% 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, @multitable or @end multitable 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 part of the @columnfraction before the decimal point, which +% is presumably either 0 or the empty string (but we don't check, we +% just throw it away). #2 is the decimal part, which we use as the +% percent of \hsize for this column. +\def\pickupwholefraction#1.#2 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{.#2\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 }% 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 +} + +% This used to have \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{&} + +% @multitable ... @end multitable definitions: +% +\def\multitable{\parsearg\dotable} +\def\dotable#1{\bgroup + \vskip\parskip + \let\item\crcr + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + \def\Emultitable{\global\setpercentfalse\cr\egroup\egroup}% + % + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % \everycr will reset column counter, \colcount, at the end of + % each line. Every column entry will cause \colcount to advance by one. + % The table preamble + % looks at the current \colcount to find the correct column width. + \everycr{\noalign{% + % + % \filbreak%% keeps underfull box messages off when table breaks over pages. + % 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. + \global\colcount=0\relax}}% + % + % 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\relax + \multistrut\vtop{\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\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +\else +%% FIXME: what is \box0 supposed to be? +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \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,} +% Prevent errors for section commands. +% Used in @ignore and in failing conditionals. +\def\ignoresections{% + \let\chapter=\relax + \let\unnumbered=\relax + \let\top=\relax + \let\unnumberedsec=\relax + \let\unnumberedsection=\relax + \let\unnumberedsubsec=\relax + \let\unnumberedsubsection=\relax + \let\unnumberedsubsubsec=\relax + \let\unnumberedsubsubsection=\relax + \let\section=\relax + \let\subsec=\relax + \let\subsubsec=\relax + \let\subsection=\relax + \let\subsubsection=\relax + \let\appendix=\relax + \let\appendixsec=\relax + \let\appendixsection=\relax + \let\appendixsubsec=\relax + \let\appendixsubsection=\relax + \let\appendixsubsubsec=\relax + \let\appendixsubsubsection=\relax + \let\contents=\relax + \let\smallbook=\relax + \let\titlepage=\relax +} + +% Used in nested conditionals, where we have to parse the Texinfo source +% and so want to turn off most commands, in case they are used +% incorrectly. +% +\def\ignoremorecommands{% + \let\defcodeindex = \relax + \let\defcv = \relax + \let\deffn = \relax + \let\deffnx = \relax + \let\defindex = \relax + \let\defivar = \relax + \let\defmac = \relax + \let\defmethod = \relax + \let\defop = \relax + \let\defopt = \relax + \let\defspec = \relax + \let\deftp = \relax + \let\deftypefn = \relax + \let\deftypefun = \relax + \let\deftypeivar = \relax + \let\deftypeop = \relax + \let\deftypevar = \relax + \let\deftypevr = \relax + \let\defun = \relax + \let\defvar = \relax + \let\defvr = \relax + \let\ref = \relax + \let\xref = \relax + \let\printindex = \relax + \let\pxref = \relax + \let\settitle = \relax + \let\setchapternewpage = \relax + \let\setchapterstyle = \relax + \let\everyheading = \relax + \let\evenheading = \relax + \let\oddheading = \relax + \let\everyfooting = \relax + \let\evenfooting = \relax + \let\oddfooting = \relax + \let\headings = \relax + \let\include = \relax + \let\lowersections = \relax + \let\down = \relax + \let\raisesections = \relax + \let\up = \relax + \let\set = \relax + \let\clear = \relax + \let\item = \relax +} + +% Ignore @ignore, @ifhtml, @ifinfo, @ifplaintext, @ifnottex, @html, @menu, +% @direntry, and @documentdescription. +% +\def\ignore{\doignore{ignore}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifnottex{\doignore{ifnottex}} +\def\html{\doignore{html}} +\def\menu{\doignore{menu}} +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\documentdescriptionword{documentdescription} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory = \comment + +% Ignore text until a line `@end #1'. +% +\def\doignore#1{\begingroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define a command to swallow text until we reach `@end #1'. + % This @ is a catcode 12 token (that is the normal catcode of @ in + % this texinfo.tex file). We change the catcode of @ below to match. + \long\def\doignoretext##1@end #1{\enddoignore}% + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \catcode32 = 10 + % + % Ignore braces, too, so mismatched braces don't cause trouble. + \catcode`\{ = 9 + \catcode`\} = 9 + % + % We must not have @c interpreted as a control sequence. + \catcode`\@ = 12 + % + \def\ignoreword{#1}% + \ifx\ignoreword\documentdescriptionword + % The c kludge breaks documentdescription, since + % `documentdescription' contains a `c'. Means not everything will + % be ignored inside @documentdescription, but oh well... + \else + % Make the letter c a comment character so that the rest of the line + % will be ignored. This way, the document can have (for example) + % @c @end ifinfo + % and the @end ifinfo will be properly ignored. + % (We've just changed @ to catcode 12.) + \catcode`\c = 14 + \fi + % + % And now expand the command defined above. + \doignoretext +} + +% What we do to finish off ignored text. +% +\def\enddoignore{\endgroup\ignorespaces}% + +\newif\ifwarnedobs\warnedobsfalse +\def\obstexwarn{% + \ifwarnedobs\relax\else + % We need to warn folks that they may have trouble with TeX 3.0. + % This uses \immediate\write16 rather than \message to get newlines. + \immediate\write16{} + \immediate\write16{WARNING: for users of Unix TeX 3.0!} + \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} + \immediate\write16{If you are running another version of TeX, relax.} + \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} + \immediate\write16{ Then upgrade your TeX installation if you can.} + \immediate\write16{ (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)} + \immediate\write16{If you are stuck with version 3.0, run the} + \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} + \immediate\write16{ to use a workaround.} + \immediate\write16{} + \global\warnedobstrue + \fi +} + +% **In TeX 3.0, setting text in \nullfont hangs tex. For a +% workaround (which requires the file ``dummy.tfm'' to be installed), +% uncomment the following line: +%%%%%\font\nullfont=dummy\let\obstexwarn=\relax + +% Ignore text, except that we keep track of conditional commands for +% purposes of nesting, up to an `@end #1' command. +% +\def\nestedignore#1{% + \obstexwarn + % We must actually expand the ignored text to look for the @end + % command, so that nested ignore constructs work. Thus, we put the + % text into a \vbox and then do nothing with the result. To minimize + % the change of memory overflow, we follow the approach outlined on + % page 401 of the TeXbook: make the current font be a dummy font. + % + \setbox0 = \vbox\bgroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define `@end #1' to end the box, which will in turn undefine the + % @end command again. + \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% + % + % We are going to be parsing Texinfo commands. Most cause no + % trouble when they are used incorrectly, but some commands do + % complicated argument parsing or otherwise get confused, so we + % undefine them. + % + % We can't do anything about stray @-signs, unfortunately; + % they'll produce `undefined control sequence' errors. + \ignoremorecommands + % + % Set the current font to be \nullfont, a TeX primitive, and define + % all the font commands to also use \nullfont. We don't use + % dummy.tfm, as suggested in the TeXbook, because not all sites + % might have that installed. Therefore, math mode will still + % produce output, but that should be an extremely small amount of + % stuff compared to the main input. + % + \nullfont + \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont + \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont + \let\tensf=\nullfont + % Similarly for index fonts. + \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont + \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont + \let\smallsf=\nullfont + % Similarly for smallexample fonts. + \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont + \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont + \let\smallersf=\nullfont + % + % Don't complain when characters are missing from the fonts. + \tracinglostchars = 0 + % + % Don't bother to do space factor calculations. + \frenchspacing + % + % Don't report underfull hboxes. + \hbadness = 10000 + % + % Do minimal line-breaking. + \pretolerance = 10000 + % + % Do not execute instructions in @tex + \def\tex{\doignore{tex}}% + % Do not execute macro definitions. + % `c' is a comment character, so the word `macro' will get cut off. + \def\macro{\doignore{ma}}% +} + +% @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. Make sure the catcode of space is correct to avoid +% losing inside @example, for instance. +% +\def\set{\begingroup\catcode` =10 + \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR. + \parsearg\setxxx} +\def\setxxx#1{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + \def\temp{#2}% + \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty + \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. + \fi + \endgroup +} +% Can't use \xdef to pre-expand #2 and save some time, since \temp or +% \next or other control sequences that we've defined might get us into +% an infinite loop. Consider `@set foo @cite{bar}'. +\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\def\clear{\parsearg\clearxxx} +\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} + +% @value{foo} gets the text saved in variable foo. +{ + \catcode`\_ = \active + % + % We might end up with active _ or - characters in the argument if + % we're called from @code, as @code{@value{foo-bar_}}. So \let any + % such active characters to their normal equivalents. + \gdef\value{\begingroup + \catcode`\-=12 \catcode`\_=12 + \indexbreaks \let_\normalunderscore + \valuexxx} +} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we \let\value to this in \indexdummies). Ones +% whose names contain - or _ still won't work, but we can't do anything +% about that. The command has to be fully expandable, 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'']}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +\def\ifset{\parsearg\ifsetxxx} +\def\ifsetxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifsetfail + \else + \expandafter\ifsetsucceed + \fi +} +\def\ifsetsucceed{\conditionalsucceed{ifset}} +\def\ifsetfail{\nestedignore{ifset}} +\defineunmatchedend{ifset} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +\def\ifclear{\parsearg\ifclearxxx} +\def\ifclearxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifclearsucceed + \else + \expandafter\ifclearfail + \fi +} +\def\ifclearsucceed{\conditionalsucceed{ifclear}} +\def\ifclearfail{\nestedignore{ifclear}} +\defineunmatchedend{ifclear} + +% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we +% read the text following, through the first @end iftex (etc.). Make +% `@end iftex' (etc.) valid only after an @iftex. +% +\def\iftex{\conditionalsucceed{iftex}} +\def\ifnothtml{\conditionalsucceed{ifnothtml}} +\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} +\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}} +\defineunmatchedend{iftex} +\defineunmatchedend{ifnothtml} +\defineunmatchedend{ifnotinfo} +\defineunmatchedend{ifnotplaintext} + +% We can't just want to start a group at @iftex (etc.) and end it at +% @end iftex, since then @set commands inside the conditional have no +% effect (they'd get reverted at the end of the group). So we must +% define \Eiftex to redefine itself to be its previous value. (We can't +% just define it to fail again with an ``unmatched end'' error, since +% the @ifset might be nested.) +% +\def\conditionalsucceed#1{% + \edef\temp{% + % Remember the current value of \E#1. + \let\nece{prevE#1} = \nece{E#1}% + % + % At the `@end #1', redefine \E#1 to be its previous value. + \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% + }% + \temp +} + +% We need to expand lots of \csname's, but we don't want to expand the +% control sequences after we've constructed them. +% +\def\nece#1{\expandafter\noexpand\csname#1\endcsname} + +% @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 \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \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 likely to appear in an index entry. +% (Must be a way to avoid doing expansion at all, and thus not have to +% laboriously list every single command here.) +% +\def\indexdummies{% +\def\ { }% +\def\@{@}% change to @@ when we switch to @ as escape char in aux files. +% 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 +\def\_{{\realbackslash _}}% +\normalturnoffactive +% +% Take care of the plain tex accent commands. +\def\,##1{\realbackslash ,{##1}}% +\def\"{\realbackslash "}% +\def\`{\realbackslash `}% +\def\'{\realbackslash '}% +\def\^{\realbackslash ^}% +\def\~{\realbackslash ~}% +\def\={\realbackslash =}% +\def\b{\realbackslash b}% +\def\c{\realbackslash c}% +\def\d{\realbackslash d}% +\def\u{\realbackslash u}% +\def\v{\realbackslash v}% +\def\H{\realbackslash H}% +\def\dotless##1{\realbackslash dotless {##1}}% +% Take care of the plain tex special European modified letters. +\def\AA{\realbackslash AA}% +\def\AE{\realbackslash AE}% +\def\L{\realbackslash L}% +\def\OE{\realbackslash OE}% +\def\O{\realbackslash O}% +\def\aa{\realbackslash aa}% +\def\ae{\realbackslash ae}% +\def\l{\realbackslash l}% +\def\oe{\realbackslash oe}% +\def\o{\realbackslash o}% +\def\ss{\realbackslash ss}% +% +% Although these internals commands shouldn't show up, sometimes they do. +\def\bf{\realbackslash bf }% +\def\gtr{\realbackslash gtr}% +\def\hat{\realbackslash hat}% +\def\less{\realbackslash less}% +%\def\rm{\realbackslash rm }% +\def\sf{\realbackslash sf}% +\def\sl{\realbackslash sl }% +\def\tclose##1{\realbackslash tclose {##1}}% +\def\tt{\realbackslash tt}% +% +\def\b##1{\realbackslash b {##1}}% +\def\i##1{\realbackslash i {##1}}% +\def\sc##1{\realbackslash sc {##1}}% +\def\t##1{\realbackslash t {##1}}% +\def\r##1{\realbackslash r {##1}}% +% +\def\TeX{\realbackslash TeX}% +\def\acronym##1{\realbackslash acronym {##1}}% +\def\cite##1{\realbackslash cite {##1}}% +\def\code##1{\realbackslash code {##1}}% +\def\command##1{\realbackslash command {##1}}% +\def\dfn##1{\realbackslash dfn {##1}}% +\def\dots{\realbackslash dots }% +\def\emph##1{\realbackslash emph {##1}}% +\def\env##1{\realbackslash env {##1}}% +\def\file##1{\realbackslash file {##1}}% +\def\kbd##1{\realbackslash kbd {##1}}% +\def\key##1{\realbackslash key {##1}}% +\def\math##1{\realbackslash math {##1}}% +\def\option##1{\realbackslash option {##1}}% +\def\samp##1{\realbackslash samp {##1}}% +\def\strong##1{\realbackslash strong {##1}}% +\def\uref##1{\realbackslash uref {##1}}% +\def\url##1{\realbackslash url {##1}}% +\def\var##1{\realbackslash var {##1}}% +\def\w{\realbackslash w }% +% +% These math commands don't seem likely to be used in index entries. +\def\copyright{\realbackslash copyright}% +\def\equiv{\realbackslash equiv}% +\def\error{\realbackslash error}% +\def\expansion{\realbackslash expansion}% +\def\point{\realbackslash point}% +\def\print{\realbackslash print}% +\def\result{\realbackslash result}% +% +% Handle some cases of @value -- where the variable name does not +% contain - or _, and the value does not contain any +% (non-fully-expandable) commands. +\let\value = \expandablevalue +% +\unsepspaces +% Turn off macro expansion +\turnoffmacros +} + +% 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 \ ). +{\obeyspaces + \gdef\unsepspaces{\obeyspaces\let =\space}} + +% \indexnofonts no-ops all font-change commands. +% This is used when outputting the strings to sort the index by. +\def\indexdummyfont#1{#1} +\def\indexdummytex{TeX} +\def\indexdummydots{...} + +\def\indexnofonts{% +\def\@{@}% +% how to handle braces? +\def\_{\normalunderscore}% +% +\let\,=\indexdummyfont +\let\"=\indexdummyfont +\let\`=\indexdummyfont +\let\'=\indexdummyfont +\let\^=\indexdummyfont +\let\~=\indexdummyfont +\let\==\indexdummyfont +\let\b=\indexdummyfont +\let\c=\indexdummyfont +\let\d=\indexdummyfont +\let\u=\indexdummyfont +\let\v=\indexdummyfont +\let\H=\indexdummyfont +\let\dotless=\indexdummyfont +% Take care of the plain tex special European modified 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}% +% +% 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=\indexdummyfont +% +\let\b=\indexdummyfont +\let\i=\indexdummyfont +\let\r=\indexdummyfont +\let\sc=\indexdummyfont +\let\t=\indexdummyfont +% +\let\TeX=\indexdummytex +\let\acronym=\indexdummyfont +\let\cite=\indexdummyfont +\let\code=\indexdummyfont +\let\command=\indexdummyfont +\let\dfn=\indexdummyfont +\let\dots=\indexdummydots +\let\emph=\indexdummyfont +\let\env=\indexdummyfont +\let\file=\indexdummyfont +\let\kbd=\indexdummyfont +\let\key=\indexdummyfont +\let\math=\indexdummyfont +\let\option=\indexdummyfont +\let\samp=\indexdummyfont +\let\strong=\indexdummyfont +\let\uref=\indexdummyfont +\let\url=\indexdummyfont +\let\var=\indexdummyfont +\let\w=\indexdummyfont +} + +% To define \realbackslash, we must make \ not be an escape. +% We must first make another character (@) an escape +% so we do not become unable to do a definition. + +{\catcode`\@=0 \catcode`\\=\other + @gdef@realbackslash{\}} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% For \ifx comparisons. +\def\emptymacro{\empty} + +% Most index entries go through here, but \dosubind is the general case. +% +\def\doind#1#2{\dosubind{#1}{#2}\empty} + +% 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 defuns, which call us directly. +% +\def\dosubind#1#2#3{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% + \fi + {% + \count255=\lastpenalty + {% + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + {% + \let\folio = 0% We will expand all macros now EXCEPT \folio. + \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + \def\thirdarg{#3}% + % + % If third arg is present, precede it with space in sort key. + \ifx\thirdarg\emptymacro + \let\subentry = \empty + \else + \def\subentry{ #3}% + \fi + % + % First process the index entry with all font commands turned + % off to get the string to sort by. + {\indexnofonts \xdef\indexsorttmp{#2\subentry}}% + % + % Now the real index entry with the fonts. + \toks0 = {#2}% + % + % If the third (subentry) arg is present, add it to the index + % line to write. + \ifx\thirdarg\emptymacro \else + \toks0 = \expandafter{\the\toks0{#3}}% + \fi + % + % 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\csname#1indfile\endcsname{% + \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% + }% + % + % If a skip is the last thing on the list now, preserve it + % by backing up by \lastskip, doing the \write, then inserting + % the skip again. Otherwise, the whatsit generated by the + % \write will make \lastskip zero. The result is that sequences + % like this: + % @end defun + % @tindex whatever + % @defun ... + % will have extra space inserted, because the \medbreak in the + % start of the @defun won't see the skip inserted by the @end of + % the previous defun. + % + % But don't do any of this if we're not in vertical mode. We + % don't want to do a \vskip and prematurely end a paragraph. + % + % Avoid page breaks due to these extra skips, too. + % + \iflinks + \ifvmode + \skip0 = \lastskip + \ifdim\lastskip = 0pt \else \nobreak\vskip-\lastskip \fi + \fi + % + \temp % do the write + % + % + \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi + \fi + }% + }% + \penalty\count255 + }% +} + +% 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). +% +\def\printindex{\parsearg\doprintindex} +\def\doprintindex#1{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \indexbreaks + % + % 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{\rawbackslashxx}% + \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. + \penalty -300 + % + % 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}% + \vskip .33\baselineskip plus .1\baselineskip + % + % Do our best not to break after the initial. + \nobreak +}} + +% This typesets a paragraph consisting of #1, dot leaders, and then #2 +% flush to the right margin. It is used for index and table of contents +% entries. The paragraph is indented by \leftskip. +% +\def\entry#1#2{\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 + % + % Start a ``paragraph'' for the index entry so the line breaking + % parameters we've set above will have an effect. + \noindent + % + % Insert the text of the index entry. TeX will do line-breaking on it. + #1% + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#2}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd\ \else% + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + \ #2% The page number ends the paragraph. + \fi + \fi% + \par +\endgroup} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +\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 for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise. +\def\thischapter{} +\def\thissection{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raise/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 + +% Choose a numbered-heading macro +% #1 is heading level if unmodified by @raisesections or @lowersections +% #2 is text for heading +\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \chapterzzz{#2} +\or + \seczzz{#2} +\or + \numberedsubseczzz{#2} +\or + \numberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \chapterzzz{#2} + \else + \numberedsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses appendix heading levels +\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \appendixzzz{#2} +\or + \appendixsectionzzz{#2} +\or + \appendixsubseczzz{#2} +\or + \appendixsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \appendixzzz{#2} + \else + \appendixsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses numberless heading levels +\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \unnumberedzzz{#2} +\or + \unnumberedseczzz{#2} +\or + \unnumberedsubseczzz{#2} +\or + \unnumberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \unnumberedzzz{#2} + \else + \unnumberedsubsubseczzz{#2} + \fi +\fi +} + +% @chapter, @appendix, @unnumbered. +\def\thischaptername{No Chapter Title} +\outer\def\chapter{\parsearg\chapteryyy} +\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz #1{% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}% +\chapmacro {#1}{\the\chapno}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +% We don't substitute the actual chapter name into \thischapter +% because we don't want its macros evaluated now. +\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}% + {\the\chapno}}}% +\temp +\donoderef +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec +} + +\outer\def\appendix{\parsearg\appendixyyy} +\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz #1{% +\secno=0 \subsecno=0 \subsubsecno=0 +\global\advance \appendixno by 1 +\message{\putwordAppendix\space \appendixletter}% +\chapmacro {#1}{\putwordAppendix{} \appendixletter}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}% + {\appendixletter}}}% +\temp +\appendixnoderef +\global\let\section = \appendixsec +\global\let\subsection = \appendixsubsec +\global\let\subsubsection = \appendixsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\def\centerchap{\parsearg\centerchapyyy} +\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} + +% @top is like @unnumbered. +\outer\def\top{\parsearg\unnumberedyyy} + +\outer\def\unnumbered{\parsearg\unnumberedyyy} +\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz #1{% +\secno=0 \subsecno=0 \subsubsecno=0 +% +% This used to be simply \message{#1}, but TeX fully expands the +% argument to \message. Therefore, if #1 contained @-commands, TeX +% expanded them. For example, in `@unnumbered The @cite{Book}', TeX +% expanded @cite (which turns out to cause errors because \cite is meant +% to be executed, not expanded). +% +% Anyway, we don't want the fully-expanded definition of @cite to appear +% as a result of the \message, we just want `@cite' itself. We use +% \the<toks register> to achieve this: TeX expands \the<toks> only once, +% simply yielding the contents of <toks register>. (We also do this for +% the toc entries.) +\toks0 = {#1}\message{(\the\toks0)}% +% +\unnumbchapmacro {#1}% +\gdef\thischapter{#1}\gdef\thissection{#1}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash unnumbchapentry{\the\toks0}}}% +\temp +\unnumbnoderef +\global\let\section = \unnumberedsec +\global\let\subsection = \unnumberedsubsec +\global\let\subsubsection = \unnumberedsubsubsec +} + +% Sections. +\outer\def\numberedsec{\parsearg\secyyy} +\def\secyyy #1{\numhead1{#1}} % normally calls seczzz +\def\seczzz #1{% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% + {\the\chapno}{\the\secno}}}% +\temp +\donoderef +\nobreak +} + +\outer\def\appendixsection{\parsearg\appendixsecyyy} +\outer\def\appendixsec{\parsearg\appendixsecyyy} +\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz #1{% +\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % +\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash secentry{\the\toks0}% + {\appendixletter}{\the\secno}}}% +\temp +\appendixnoderef +\nobreak +} + +\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} +\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz #1{% +\plainsecheading {#1}\gdef\thissection{#1}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry% + {\the\toks0}{\the\chapno}}}% +\temp +\unnumbnoderef +\nobreak +} + +% Subsections. +\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} +\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz #1{% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% + {\the\chapno}{\the\secno}{\the\subsecno}}}% +\temp +\donoderef +\nobreak +} + +\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} +\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz #1{% +\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % +\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash subsecentry{\the\toks0}% + {\appendixletter}{\the\secno}{\the\subsecno}}}% +\temp +\appendixnoderef +\nobreak +} + +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} +\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz #1{% +\plainsubsecheading {#1}\gdef\thissection{#1}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry% + {\the\toks0}{\the\chapno}{\the\secno}}}% +\temp +\unnumbnoderef +\nobreak +} + +% Subsubsections. +\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} +\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz #1{% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% +\temp +\donoderef +\nobreak +} + +\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} +\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz #1{% +\gdef\thissection{#1}\global\advance \subsubsecno by 1 % +\subsubsecheading {#1} + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash subsubsecentry{\the\toks0}% + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}}% +\temp +\appendixnoderef +\nobreak +} + +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} +\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz #1{% +\plainsubsubsecheading {#1}\gdef\thissection{#1}% +\toks0 = {#1}% +\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry% + {\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}}}% +\temp +\unnumbnoderef +\nobreak +} + +% These are variants which are not "outer", so they can appear in @ifinfo. +% Actually, they should now be obsolete; ordinary section commands should work. +\def\infotop{\parsearg\unnumberedzzz} +\def\infounnumbered{\parsearg\unnumberedzzz} +\def\infounnumberedsec{\parsearg\unnumberedseczzz} +\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} + +\def\infoappendix{\parsearg\appendixzzz} +\def\infoappendixsec{\parsearg\appendixseczzz} +\def\infoappendixsubsec{\parsearg\appendixsubseczzz} +\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} + +\def\infochapter{\parsearg\chapterzzz} +\def\infosection{\parsearg\sectionzzz} +\def\infosubsection{\parsearg\subsectionzzz} +\def\infosubsubsection{\parsearg\subsubsectionzzz} + +% 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. +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\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{\parsearg\majorheadingzzz} +\def\majorheadingzzz #1{% +{\advance\chapheadingskip by 10pt \chapbreak }% +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\chapheading{\parsearg\chapheadingzzz} +\def\chapheadingzzz #1{\chapbreak % +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +% @heading, @subheading, @subsubheading. +\def\heading{\parsearg\plainsecheading} +\def\subheading{\parsearg\plainsubsecheading} +\def\subsubheading{\parsearg\plainsubsubsecheading} + +% 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} + +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{ +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +\def\CHAPFplain{ +\global\let\chapmacro=\chfplain +\global\let\unnumbchapmacro=\unnchfplain +\global\let\centerchapmacro=\centerchfplain} + +% Plain chapter opening. +% #1 is the text, #2 the chapter number or empty if unnumbered. +\def\chfplain#1#2{% + \pchapsepmacro + {% + \chapfonts \rm + \def\chapnum{#2}% + \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% Plain opening for unnumbered. +\def\unnchfplain#1{\chfplain{#1}{}} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerchfplain#1{{% + \def\centerparametersmaybe{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt + }% + \chfplain{#1}{}% +}} + +\CHAPFplain % The default + +\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\unnumbchapmacro=\unnchfopen +\global\let\centerchapmacro=\centerchfopen} + + +% Section titles. +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip {-1000}} +\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} +\def\plainsecheading#1{\sectionheading{sec}{}{#1}} + +% Subsection titles. +\newskip \subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} +\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} +\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} + +% Subsubsection titles. +\let\subsubsecheadingskip = \subsecheadingskip +\let\subsubsecheadingbreak = \subsecheadingbreak +\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} +\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} + + +% Print any size section title. +% +% #1 is the section type (sec/subsec/subsubsec), #2 is the section +% number (maybe empty), #3 the text. +\def\sectionheading#1#2#3{% + {% + \expandafter\advance\csname #1headingskip\endcsname by \parskip + \csname #1headingbreak\endcsname + }% + {% + % Switch to the right set of fonts. + \csname #1fonts\endcsname \rm + % + % Only insert the separating space if we have a section number. + \def\secnum{#2}% + \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% + % + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 % zero if no section number + \unhbox0 #3}% + }% + \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. We supply {\folio} at the end of the +% argument, which will end up as the last argument to the \...entry macro. +% +% We open the .toc file here instead of at @setfilename or any other +% fixed time so that @contents can be put in the document anywhere. +% +\newif\iftocfileopened +\def\writetocentry#1{% + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + \iflinks \write\tocfile{#1{\folio}}\fi + % + % Tell \shipout to create a page destination if we're doing pdf, which + % will be the target of the links in the table of contents. We can't + % just do it 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 \pdfmakepagedesttrue \fi +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Finish up the main text and prepare to read what we've written +% to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund <tege@matematik.su.se> + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \unnumbchapmacro{#1}\def\thischapter{}% + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \pageno = \lastnegativepageno \fi +} + + +% Normal (long) toc. +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else + \closein 1 + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \pdfmakeoutlines + \endgroup + \lastnegativepageno = \pageno + \pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\chapentry = \shortchapentry + \let\appendixentry = \shortappendixentry + \let\unnumbchapentry = \shortunnumberedentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\secentry ##1##2##3##4{} + \def\unnumbsecentry ##1##2##3{} + \def\subsecentry ##1##2##3##4##5{} + \def\unnumbsubsecentry ##1##2##3##4{} + \def\subsubsecentry ##1##2##3##4##5##6{} + \def\unnumbsubsubsecentry ##1##2##3##4##5{} + \openin 1 \jobname.toc + \ifeof 1 \else + \closein 1 + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \pageno = \savepageno +} +\let\shortcontents = \summarycontents + +\ifpdf + \pdfcatalog{/PageMode /UseOutlines}% +\fi + +% 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\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}% +} + +% Appendices, in the main contents. +\def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}} +% +% Appendices, in the short toc. +\let\shortappendixentry = \shortchapentry + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter. +% We could simplify the code here by writing out an \appendixentry +% command in the toc file for appendices, instead of using \chapentry +% for both, but it doesn't seem worth it. +% +\newdimen\shortappendixwidth +% +\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.) + \dimen0 = 1em + \hbox to \dimen0{#1\hss}% +} + +% Unnumbered chapters. +\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} +\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}} + +% Sections. +\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} +\def\unnumbsecentry#1#2#3{\dosecentry{#1}{#3}} + +% Subsections. +\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} +\def\unnumbsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\subsubsecentry#1#2#3#4#5#6{% + \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} +\def\unnumbsubsubsecentry#1#2#3#4#5{\dosubsubsecentry{#1}{#5}} + +% This parameter controls the indentation of the various levels. +\newdimen\tocindent \tocindent = 3pc + +% 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} + +% Final typesetting of a toc entry; we use the same \entry macro as for +% the index entries, but we want to suppress hyphenation here. (We +% can't do that in the \entry macro, since index entries might consist +% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) +\def\tocentry#1#2{\begingroup + \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks + % Do not use \turnoffactive in these arguments. Since the toc is + % typeset in cmr, characters such as _ would come out wrong; we + % have to do the usual translation tricks. + \entry{#1}{#2}% +\endgroup} + +% 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} +\let\subsecentryfonts = \textfonts +\let\subsubsecentryfonts = \textfonts + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} +% +\global\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. + +\def\tex{\begingroup + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie + \catcode `\%=14 + \catcode 43=12 % plus + \catcode`\"=12 + \catcode`\==12 + \catcode`\|=12 + \catcode`\<=12 + \catcode`\>=12 + \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\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\*=\ptexstar + \let\t=\ptext + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +\let\Etex=\endgroup} + +% Define @lisp ... @end lisp. +% @lisp does a \begingroup 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} + +% 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. +% +{\obeyspaces % +\gdef\sepspaces{\obeyspaces\let =\tie}} + +% Define \obeyedspace to be our active space, whatever it is. This is +% for use in \parsearg. +{\sepspaces% +\global\let\obeyedspace= } + +% 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{{% + \ifnum\lastpenalty < 10000 + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + \penalty-50 + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\long\def\cartouche{% +\begingroup + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt %we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either +% side, and for 6pt waste from +% each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \hsize=\cartinner + \kern3pt + \begingroup + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip +\def\Ecartouche{% + \endgroup + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup +\endgroup +}} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \inENV % This group ends at the end of the body + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \singlespace + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \let\exdent=\nofillexdent + \let\nonarrowing=\relax + \fi +} + +% Define the \E... control sequence only if we are inside the particular +% environment, so the error checking in \end will work. +% +% To end an @example-like environment, we first end the paragraph (via +% \afterenvbreak's vertical glue), and then the group. That way we keep +% the zero \parskip that the environments set -- \parskip glue will be +% inserted at the beginning of the next paragraph in the document, after +% the environment. +% +\def\nonfillfinish{\afterenvbreak\endgroup} + +% @lisp: indented, narrowed, typewriter font. +\def\lisp{\begingroup + \nonfillstart + \let\Elisp = \nonfillfinish + \tt + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} + +% @example: Same as @lisp. +\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} + +% @small... is usually equivalent to the non-small (@smallbook +% redefines). We must call \example (or whatever) last in the +% definition, since it reads the return following the @example (or +% whatever) command. +% +% This actually allows (for example) @end display inside an +% @smalldisplay. Too bad, but makeinfo will catch the error anyway. +% +\def\smalldisplay{\begingroup\def\Esmalldisplay{\nonfillfinish\endgroup}\display} +\def\smallexample{\begingroup\def\Esmallexample{\nonfillfinish\endgroup}\lisp} +\def\smallformat{\begingroup\def\Esmallformat{\nonfillfinish\endgroup}\format} +\def\smalllisp{\begingroup\def\Esmalllisp{\nonfillfinish\endgroup}\lisp} + +% Real @smallexample and @smalllisp (when @smallbook): use smaller fonts. +% Originally contributed by Pavel@xerox. +\def\smalllispx{\begingroup + \def\Esmalllisp{\nonfillfinish\endgroup}% + \def\Esmallexample{\nonfillfinish\endgroup}% + \smallexamplefonts + \lisp +} + +% @display: same as @lisp except keep current font. +% +\def\display{\begingroup + \nonfillstart + \let\Edisplay = \nonfillfinish + \gobble +} +% +% @smalldisplay (when @smallbook): @display plus smaller fonts. +% +\def\smalldisplayx{\begingroup + \def\Esmalldisplay{\nonfillfinish\endgroup}% + \smallexamplefonts \rm + \display +} + +% @format: same as @display except don't narrow margins. +% +\def\format{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eformat = \nonfillfinish + \gobble +} +% +% @smallformat (when @smallbook): @format plus smaller fonts. +% +\def\smallformatx{\begingroup + \def\Esmallformat{\nonfillfinish\endgroup}% + \smallexamplefonts \rm + \format +} + +% @flushleft (same as @format). +% +\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format} + +% @flushright. +% +\def\flushright{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushright = \nonfillfinish + \advance\leftskip by 0pt plus 1fill + \gobble +} + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. +% +\def\quotation{% + \begingroup\inENV %This group ends at the end of the @quotation body + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \singlespace + \parindent=0pt + % We have retained a nonzero parskip for the environment, since we're + % doing normal filling. So to avoid extra space below the environment... + \def\Equotation{\parskip = 0pt \nonfillfinish}% + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} +% If we want to allow any <char> as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p. 344; only we need to do '@' too +\def\dospecials{% + \do\ \do\\\do\@\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=12}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'<char>#1<char>'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12 + \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] +%% Include LaTeX hack for completeness -- never know +%% \begingroup +%% \catcode`|=0 \catcode`[=1 +%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active +%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[ +%% #1|endgroup|def|Everbatim[]|end[verbatim]] +%% |endgroup +\begingroup + \catcode`\ =\active + \gdef\doverbatim#1@end verbatim{#1\end{verbatim}} +\endgroup +% +\def\verbatim{% + \def\Everbatim{\nonfillfinish\endgroup}% + \begingroup + \nonfillstart + \advance\leftskip by -\defbodyindent + \begingroup\setupverbatim\doverbatim +} + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +% Allow normal characters that we make active in the argument (a file name). +\def\verbatiminclude{% + \begingroup + \catcode`\\=12 + \catcode`~=12 + \catcode`^=12 + \catcode`_=12 + \catcode`|=12 + \catcode`<=12 + \catcode`>=12 + \catcode`+=12 + \parsearg\doverbatiminclude +} +\def\setupverbatiminclude{% + \begingroup + \nonfillstart + \advance\leftskip by -\defbodyindent + \begingroup\setupverbatim +} +% +\def\doverbatiminclude#1{% + % Restore active chars for included file. + \endgroup + \begingroup + \def\thisfile{#1}% + \expandafter\expandafter\setupverbatiminclude\input\thisfile + \endgroup\nonfillfinish\endgroup +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +\newbox\copyingbox +% +\def\copying{\begingroup + \parindent = 0pt % looks wrong on title page + \def\Ecopying{\egroup\endgroup}% + \global\setbox\copyingbox = \vbox\bgroup +} + +% @insertcopying. +% +\def\insertcopying{\unvcopy\copyingbox} + + +\message{defuns,} +% @defun etc. + +% Allow user to change definition object font (\df) internally +\def\setdeffont #1 {\csname DEF#1\endcsname} + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deftypemargin \deftypemargin=12pt +\newskip\deflastargmargin \deflastargmargin=18pt + +\newcount\parencount +% define \functionparens, which makes ( and ) and & do special things. +% \functionparens affects the group it is contained in. +\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 = ) + +{\activeparens % Now, smart parens don't turn on until &foo (see \amprm) + +% 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. +\global\let(=\lparen \global\let)=\rparen +\global\let[=\lbrack \global\let]=\rbrack + +\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } +\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} +% This is used to turn on special parens +% but make & act ordinary (given that it's active). +\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} + +% Definitions of (, ) and & used in args for functions. +% This is the definition of ( outside of all parentheses. +\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested + \global\advance\parencount by 1 +} +% +% This is the definition of ( when already inside a level of parens. +\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% +\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. + % also in that case restore the outer-level definition of (. + \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi + \global\advance \parencount by -1 } +% If we encounter &foo, then turn on ()-hacking afterwards +\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } +% +\gdef\normalparens{\boldbrax\let&=\ampnr} +} % End of definition inside \activeparens +%% These parens (in \boldbrax) actually are a little bolder than the +%% contained text. This is especially needed for [ and ] +\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 } +\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 } +\let\ampnr = \& +\def\lbrb{{\bf\char`\[}} +\def\rbrb{{\bf\char`\]}} + +% Active &'s sneak into the index arguments, so make sure it's defined. +{ + \catcode`& = 13 + \global\let& = \ampnr +} + +% First, defname, which formats the header line itself. +% #1 should be the function name. +% #2 should be the type of definition, such as "Function". + +\def\defname #1#2{% +% Get the values of \leftskip and \rightskip as they were +% outside the @def... +\dimen2=\leftskip +\advance\dimen2 by -\defbodyindent +\noindent +\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% +\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line +\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations +\parshape 2 0in \dimen0 \defargsindent \dimen1 +% Now output arg 2 ("Function" or some such) +% ending at \deftypemargin from the right margin, +% but stuck inside a box of width 0 so it does not interfere with linebreaking +{% Adjust \hsize to exclude the ambient margins, +% so that \rightline will obey them. +\advance \hsize by -\dimen2 +\rlap{\rightline{{\rm #2}\hskip -1.25pc }}}% +% Make all lines underfull and no complaints: +\tolerance=10000 \hbadness=10000 +\advance\leftskip by -\defbodyindent +\exdentamount=\defbodyindent +{\df #1}\enskip % Generate function name +} + +% Actually process the body of a definition +% #1 should be the terminating control sequence, such as \Edefun. +% #2 should be the "another name" control sequence, such as \defunx. +% #3 should be the control sequence that actually processes the header, +% such as \defunheader. + +\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\activeparens\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % 61 is `=' +\obeylines\activeparens\spacesplit#3} + +% #1 is the \E... control sequence to end the definition (which we define). +% #2 is the \...x control sequence for consecutive fns (which we define). +% #3 is the control sequence to call to resume processing. +% #4, delimited by the space, is the class name. +% +\def\defmethparsebody#1#2#3#4 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% +\parindent=0in +\advance\leftskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} + +% Used for @deftypemethod and @deftypeivar. +% #1 is the \E... control sequence to end the definition (which we define). +% #2 is the \...x control sequence for consecutive fns (which we define). +% #3 is the control sequence to call to resume processing. +% #4, delimited by a space, is the class name. +% #5 is the method's return type. +% +\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV + \medbreak + \def#1{\endgraf\endgroup\medbreak}% + \def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}% + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent + \begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}} + +% Used for @deftypeop. The change from \deftypemethparsebody is an +% extra argument at the beginning which is the `category', instead of it +% being the hardwired string `Method' or `Instance Variable'. We have +% to account for this both in the \...x definition and in parsing the +% input at hand. Thus also need a control sequence (passed as #5) for +% the \E... definition to assign the category name to. +% +\def\deftypeopparsebody#1#2#3#4#5 #6 {\begingroup\inENV + \medbreak + \def#1{\endgraf\endgroup\medbreak}% + \def#2##1 ##2 ##3 {% + \def#4{##1}% + \begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}% + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent + \begingroup\obeylines\activeparens\spacesplit{#3{#5}{#6}}} + +\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\activeparens\spacesplit{#3{#5}}} + +% These parsing functions are similar to the preceding ones +% except that they do not make parens into active characters. +% These are used for "variables" since they have no arguments. + +\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % +\obeylines\spacesplit#3} + +% This is used for \def{tp,vr}parsebody. It could probably be used for +% some of the others, too, with some judicious conditionals. +% +\def\parsebodycommon#1#2#3{% + \begingroup\inENV % + \medbreak % + % Define the end token that this defining construct specifies + % so that it will exit this group. + \def#1{\endgraf\endgroup\medbreak}% + \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent + \begingroup\obeylines +} + +\def\defvrparsebody#1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{#3{#4}}% +} + +% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the +% type is just `struct', because we lose the braces in `{struct +% termios}' when \spacesplit reads its undelimited argument. Sigh. +% \let\deftpparsebody=\defvrparsebody +% +% So, to get around this, we put \empty in with the type name. That +% way, TeX won't find exactly `{...}' as an undelimited argument, and +% won't strip off the braces. +% +\def\deftpparsebody #1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{\parsetpheaderline{#3{#4}}}\empty +} + +% Fine, but then we have to eventually remove the \empty *and* the +% braces (if any). That's what this does. +% +\def\removeemptybraces\empty#1\relax{#1} + +% After \spacesplit has done its work, this is called -- #1 is the final +% thing to call, #2 the type name (which starts with \empty), and #3 +% (which might be empty) the arguments. +% +\def\parsetpheaderline#1#2#3{% + #1{\removeemptybraces#2\relax}{#3}% +}% + +\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\spacesplit{#3{#5}}} + +% Split up #2 at the first space token. +% call #1 with two arguments: +% the first is all of #2 before the space token, +% the second is all of #2 after that space token. +% If #2 contains no space token, all of it is passed as the first arg +% and the second is passed as empty. + +{\obeylines +\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% +\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% +\ifx\relax #3% +#1{#2}{}\else #1{#2}{#3#4}\fi}} + +% So much for the things common to all kinds of definitions. + +% Define @defun. + +% First, define the processing that is wanted for arguments of \defun +% Use this to expand the args and terminate the paragraph they make up + +\def\defunargs#1{\functionparens \sl +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% Set the font temporarily and use \font in case \setfont made \tensl a macro. +{\tensl\hyphenchar\font=0}% +#1% +{\tensl\hyphenchar\font=45}% +\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\nobreak\vskip -\parskip\nobreak +} + +\def\deftypefunargs #1{% +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% Use \boldbraxnoamp, not \functionparens, so that & is not special. +\boldbraxnoamp +\tclose{#1}% avoid \code because of side effects on active chars +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\nobreak\vskip -\parskip\nobreak +} + +% Do complete processing of one @defun or @defunx line already parsed. + +% @deffn Command forward-char nchars + +\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} + +\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% +\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defun == @deffn Function + +\def\defun{\defparsebody\Edefun\defunx\defunheader} + +\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDeffunc}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefun int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} + +% #1 is the data type. #2 is the name and args. +\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} +% #1 is the data type, #2 the name, #3 the args. +\def\deftypefunheaderx #1#2 #3\relax{% +\doind {fn}{\code{#2}}% Make entry in function index +\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}% +\deftypefunargs {#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} + +% \defheaderxcond#1\relax$.$ +% puts #1 in @code, followed by a space, but does nothing if #1 is null. +\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi} + +% #1 is the classification. #2 is the data type. #3 is the name and args. +\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} +% #1 is the classification, #2 the data type, #3 the name, #4 the args. +\def\deftypefnheaderx #1#2#3 #4\relax{% +\doind {fn}{\code{#3}}% Make entry in function index +\begingroup +\normalparens % notably, turn off `&' magic, which prevents +% at least some C++ text from working +\defname {\defheaderxcond#2\relax$.$#3}{#1}% +\deftypefunargs {#4}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defmac == @deffn Macro + +\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} + +\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDefmac}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defspec == @deffn Special Form + +\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} + +\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{\putwordDefspec}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defop CATEGORY CLASS OPERATION ARG... +% +\def\defop #1 {\def\defoptype{#1}% +\defopparsebody\Edefop\defopx\defopheader\defoptype} +% +\def\defopheader#1#2#3{% +\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index +\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}% +\defunargs {#3}\endgroup % +} + +% @deftypeop CATEGORY CLASS TYPE OPERATION ARG... +% +\def\deftypeop #1 {\def\deftypeopcategory{#1}% + \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader + \deftypeopcategory} +% +% #1 is the class name, #2 the data type, #3 the operation name, #4 the args. +\def\deftypeopheader#1#2#3#4{% + \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3} + {\deftypeopcategory\ \putwordon\ \code{#1}}% + \deftypefunargs{#4}% + \endgroup +} + +% @deftypemethod CLASS TYPE METHOD ARG... +% +\def\deftypemethod{% + \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} +% +% #1 is the class name, #2 the data type, #3 the method name, #4 the args. +\def\deftypemethodheader#1#2#3#4{% + \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}% + \deftypefunargs{#4}% + \endgroup +} + +% @deftypeivar CLASS TYPE VARNAME +% +\def\deftypeivar{% + \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader} +% +% #1 is the class name, #2 the data type, #3 the variable name. +\def\deftypeivarheader#1#2#3{% + \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index + \begingroup + \defname{\defheaderxcond#2\relax$.$#3} + {\putwordInstanceVariableof\ \code{#1}}% + \defvarargs{#3}% + \endgroup +} + +% @defmethod == @defop Method +% +\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} +% +% #1 is the class name, #2 the method name, #3 the args. +\def\defmethodheader#1#2#3{% + \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index + \begingroup + \defname{#2}{\putwordMethodon\ \code{#1}}% + \defunargs{#3}% + \endgroup +} + +% @defcv {Class Option} foo-class foo-flag + +\def\defcv #1 {\def\defcvtype{#1}% +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} + +\def\defcvarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{\putwordof\ #1}% Make entry in var index +\begingroup\defname {#2}{\defcvtype\ \putwordof\ #1}% +\defvarargs {#3}\endgroup % +} + +% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME +% +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} +% +\def\defivarheader#1#2#3{% + \dosubind {vr}{\code{#2}}{\putwordof\ #1}% entry in var index + \begingroup + \defname{#2}{\putwordInstanceVariableof\ #1}% + \defvarargs{#3}% + \endgroup +} + +% @defvar +% First, define the processing that is wanted for arguments of @defvar. +% This is actually simple: just print them in roman. +% This must expand the args and terminate the paragraph they make up +\def\defvarargs #1{\normalparens #1% +\interlinepenalty=10000 +\endgraf\nobreak\vskip -\parskip\nobreak} + +% @defvr Counter foo-count + +\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} + +\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% +\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} + +% @defvar == @defvr Variable + +\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} + +\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{\putwordDefvar}% +\defvarargs {#2}\endgroup % +} + +% @defopt == @defvr {User Option} + +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} + +\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{\putwordDefopt}% +\defvarargs {#2}\endgroup % +} + +% @deftypevar int foobar + +\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} + +% #1 is the data type. #2 is the name, perhaps followed by text that +% is actually part of the data type, which should not be put into the index. +\def\deftypevarheader #1#2{% +\dovarind#2 \relax% Make entry in variables index +\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}% +\interlinepenalty=10000 +\endgraf\nobreak\vskip -\parskip\nobreak +\endgroup} +\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}} + +% @deftypevr {Global Flag} int enable + +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} + +\def\deftypevrheader #1#2#3{\dovarind#3 \relax% +\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1} +\interlinepenalty=10000 +\endgraf\nobreak\vskip -\parskip\nobreak +\endgroup} + +% Now define @deftp +% Args are printed in bold, a slight difference from @defvar. + +\def\deftpargs #1{\bf \defvarargs{#1}} + +% @deftp Class window height width ... + +\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} + +\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% +\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} + +% These definitions are used if you use @defunx (etc.) +% anywhere other than immediately after a @defun or @defunx. +% +\def\defcvx#1 {\errmessage{@defcvx in invalid context}} +\def\deffnx#1 {\errmessage{@deffnx in invalid context}} +\def\defivarx#1 {\errmessage{@defivarx in invalid context}} +\def\defmacx#1 {\errmessage{@defmacx in invalid context}} +\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}} +\def\defoptx #1 {\errmessage{@defoptx in invalid context}} +\def\defopx#1 {\errmessage{@defopx in invalid context}} +\def\defspecx#1 {\errmessage{@defspecx in invalid context}} +\def\deftpx#1 {\errmessage{@deftpx in invalid context}} +\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}} +\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} +\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} +\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} +\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}} +\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} +\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} +\def\defunx#1 {\errmessage{@defunx in invalid context}} +\def\defvarx#1 {\errmessage{@defvarx in invalid context}} +\def\defvrx#1 {\errmessage{@defvrx in invalid context}} + + +\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\scanmacro#1{% + \begingroup \newlinechar`\^^M + % Undo catcode changes of \startcontents and \doprintindex + \catcode`\@=0 \catcode`\\=12 \escapechar=`\@ + % Append \endinput to make sure that TeX does not see the ending newline. + \toks0={#1\endinput}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \let\xeatspaces\eatspaces + \input \jobname.tmp + \endgroup +} +\else +\def\scanmacro#1{% +\begingroup \newlinechar`\^^M +% Undo catcode changes of \startcontents and \doprintindex +\catcode`\@=0 \catcode`\\=12 \escapechar=`\@ +\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup} +\fi + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? +\def\macrolist{} % List of all defined macros in the form + % \do\macro1\do\macro2... + +% Utility routines. +% Thisdoes \let #1 = #2, except with \csnames. +\def\cslet#1#2{% +\expandafter\expandafter +\expandafter\let +\expandafter\expandafter +\csname#1\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=12\catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\macrobodyctxt{% + \catcode`\~=12 + \catcode`\^=12 + \catcode`\_=12 + \catcode`\|=12 + \catcode`\<=12 + \catcode`\>=12 + \catcode`\+=12 + \catcode`\{=12 + \catcode`\}=12 + \catcode`\@=12 + \catcode`\^^M=12 + \usembodybackslash} + +\def\macroargctxt{% + \catcode`\~=12 + \catcode`\^=12 + \catcode`\_=12 + \catcode`\|=12 + \catcode`\<=12 + \catcode`\>=12 + \catcode`\+=12 + \catcode`\@=12 + \catcode`\\=12} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + % Add the macroname to \macrolist + \toks0 = \expandafter{\macrolist\do}% + \xdef\macrolist{\the\toks0 + \expandafter\noexpand\csname\the\macname\endcsname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\def\unmacro{\parsearg\unmacroxxx} +\def\unmacroxxx#1{% + \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 + \edef\tempa{\expandafter\noexpand\csname#1\endcsname}% + \def\do##1{% + \def\tempb{##1}% + \ifx\tempa\tempb + % remove this + \else + \toks0 = \expandafter{\newmacrolist\do}% + \edef\newmacrolist{\the\toks0\expandafter\noexpand\tempa}% + \fi}% + \def\newmacrolist{}% + % Execute macro list to define \newmacrolist + \macrolist + \global\let\macrolist\newmacrolist + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% <parameter list> is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + +% We mant to disable all macros during \shipout so that they are not +% expanded by \write. +\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% + \edef\next{\macrolist}\expandafter\endgroup\next} + + +% @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{\begingroup\obeyspaces\parsearg\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{\ignoreactivespaces +\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=% + \expandafter\noexpand\csname#2\endcsname}% +\expandafter\endgroup\next} + + +\message{cross references,} +% @xref etc. + +\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 job is to define \lastnode. +\def\node{\ENVcheck\parsearg\nodezzz} +\def\nodezzz#1{\nodexxx [#1,]} +\def\nodexxx[#1,#2]{\gdef\lastnode{#1}} +\let\nwnode=\node +\let\lastnode=\relax + +% The sectioning commands (@chapter, etc.) call these. +\def\donoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}% + {Ysectionnumberandtype}% + \global\let\lastnode=\relax + \fi +} +\def\unnumbnoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}% + \global\let\lastnode=\relax + \fi +} +\def\appendixnoderef{% + \ifx\lastnode\relax\else + \expandafter\expandafter\expandafter\setref{\lastnode}% + {Yappendixletterandtype}% + \global\let\lastnode=\relax + \fi +} + + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME, namely +% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have +% to set \indexdummies so commands such as @code in a section title +% aren't expanded. It would be nicer not to expand the titles in the +% first place, but there's so many layers that that is hard to do. +% +\def\setref#1#2{{% + \indexdummies + \pdfmkdest{#1}% + \dosetq{#1-title}{Ytitle}% + \dosetq{#1-pg}{Ypagenumber}% + \dosetq{#1-snt}{#2}% +}} + +% @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\printednodename{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual}% + \setbox0=\hbox{\printednodename}% + \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\printednodename{\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\printednodename{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printednodename{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printednodename{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % 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. + \ifpdf + \leavevmode + \getfilename{#4}% + {\normalturnoffactive + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{#1}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{#1}% + \fi + }% + \linkcolor + \fi + % + \ifdim \wd1 > 0pt + \putwordsection{} ``\printednodename'' \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. + {\normalturnoffactive + % 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 + }% + % [mynode], + [\printednodename],\space + % page 3 + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi + \endlink +\endgroup} + +% \dosetq is the interface for calls from other macros + +% Use \normalturnoffactive so that punctuation chars such as underscore +% and backslash work in node names. (\turnoffactive doesn't do \.) +\def\dosetq#1#2{% + {\let\folio=0% + \normalturnoffactive + \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}% + \iflinks + \next + \fi + }% +} + +% \internalsetq {foo}{page} expands into +% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} +% When the aux file is read, ' is the escape character + +\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} + +% Things to be expanded by \internalsetq + +\def\Ypagenumber{\folio} + +\def\Ytitle{\thissection} + +\def\Ynothing{} + +\def\Ysectionnumberandtype{% +\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % +\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % +\else % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\def\Yappendixletterandtype{% +\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% +\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % +\else % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\gdef\xreftie{'tie} + +% 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 % Non-3.0. +\else + \def\linenumber{\the\inputlineno:\space} +\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{% + \expandafter\ifx\csname X#1\endcsname\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. + \csname X#1\endcsname + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. +% +\def\xrdef#1{\begingroup + % Reenable \ as an escape while reading the second argument. + \catcode`\\ = 0 + \afterassignment\endgroup + \expandafter\gdef\csname X#1\endcsname +} + +% Read the last existing aux file, if any. No error if none exists. +\def\readauxfile{\begingroup + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + \catcode`\@=\other + \catcode`\^=\other + % It was suggested to define this as 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 + \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 + % Make the characters 128-255 be printing characters + {% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% + }% + % The aux file uses ' as the escape (for now). + % Turn off \ as an escape so we do not lose on + % entries which were dumped with control sequences in their names. + % For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ + % Reference to such entries still does not work the way one would wish, + % but at least they do not bomb out when the aux file is read in. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\%=\other + \catcode`\'=0 + \catcode`\\=\other + % + \openin 1 \jobname.aux + \ifeof 1 \else + \closein 1 + \input \jobname.aux + \global\havexrefstrue + \global\warnedobstrue + \fi + % Open the new aux file. TeX will close it automatically at exit. + \openout\auxfile=\jobname.aux +\endgroup} + + +% 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 + +\let\ptexfootnote=\footnote + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \footnotezzz +}% + +% 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 fail inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\long\gdef\footnotezzz{\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. + \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 +} +\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t + \else\let\next\f@t\fi \next} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +\def\f@t#1{#1\@foot} +\def\@foot{\strut\par\egroup} + +}%end \catcode `\@=11 + +% @| 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 + }% + }% +} + +% 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} + +% @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 + \closein 1 + % Do not bother showing banner with post-v2.7 epsf.tex (available in + % doc/epsf.tex until it shows up on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +\message{localization,} +% and i18n. + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\def\documentlanguage{\parsearg\dodocumentlanguage} +\def\dodocumentlanguage#1{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \let\temp = \relax + \else + \def\temp{\input txi-#1.tex }% + \fi + \temp + \endgroup +} +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding = \comment + + +% Page size parameters. +% +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; +% 4) hoffset; 5) binding offset; 6) topskip. 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{% + \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 + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% Use `small' versions. +% +\def\smallenvironments{% + \let\smalldisplay = \smalldisplayx + \let\smallexample = \smalllispx + \let\smallformat = \smallformatx + \let\smalllisp = \smalllispx +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}% +}} + +% Use @smallbook to reset parameters for 7x9.5 (or so) format. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \deftypemargin = 0pt + \defbodyindent = .5cm + \smallenvironments +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 12pt + % + \internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}% + % + \tolerance = 700 + \hfuzz = 1pt +}} + +% 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{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0mm + \deftypemargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm + % + \smallenvironments +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin +% 29mm, hence bottom margin 28mm, nominal side margin 3cm. +\def\afourlatex{{\globaldefs = 1 + \textleading = 13.6pt + % + \afourpaper + \internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}% + % + % Must explicitly reset to 0 because we call \afourpaper, apparently, + % although this does not entirely make sense. + \globaldefs = 0 +}} + +% Use @afourwide to print on European A4 paper in wide format. +\def\afourwide{% + \afourpaper + \internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}% +} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\def\pagesizes{\parsearg\pagesizesxxx} +\def\pagesizesxxx#1{\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}% + % + \internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}% +}} + +% 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 ttfont +% where it can probably just be output, and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} + +\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 +%\catcode 27=\active +%\def^^[{$\diamondsuit$} + +% Set up an active definition for =, but don't enable it most of the time. +{\catcode`\==\active +\global\def={{\tt \char 61}}} + +\catcode`+=\active +\catcode`\_=\active + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \rawbackslashxx output one backslash character in current font +\global\chardef\rawbackslashxx=`\\ +%{\catcode`\\=\other +%@gdef@rawbackslashxx{\}} + +% \rawbackslash redefines \ as input to do \rawbackslashxx. +{\catcode`\\=\active +@gdef@rawbackslash{@let\=@rawbackslashxx }} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\rawbackslashxx}} + +% \catcode 17=0 % Define control-q +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{@let"=@normaldoublequote +@let\=@realbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus +@let$=@normaldollar}%$ font-lock fix + +@def@normalturnoffactive{@let"=@normaldoublequote +@let\=@normalbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus +@let$=@normaldollar}%$ font-lock fix + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + +@c Set initial fonts. +@textfonts +@rm + + +@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: diff --git a/gnu/dist/diffutils/configure.ac b/gnu/dist/diffutils/configure.ac new file mode 100644 index 00000000000..369257c4a01 --- /dev/null +++ b/gnu/dist/diffutils/configure.ac @@ -0,0 +1,135 @@ +# Configure template for GNU Diffutils. + +# Copyright (C) 1994, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_PREREQ(2.53) + +AC_INIT(GNU diffutils, 2.8.1, bug-gnu-utils@gnu.org) +AC_CONFIG_SRCDIR(src/diff.c) + +AC_CONFIG_AUX_DIR(config) +AM_CONFIG_HEADER([config.h:config.hin]) +AM_INIT_AUTOMAKE([gnits]) + +AC_PROG_AWK +AC_PROG_CC +AC_ISC_POSIX +AM_PROG_CC_STDC +AC_PROG_CPP +AM_MISSING_PROG(HELP2MAN, help2man) +AC_PROG_INSTALL +AC_PROG_RANLIB + +AC__GNU_SOURCE +AC_DEFINE([__EXTENSIONS__], 1, [Enable Solaris extensions.]) +AC_SYS_LARGEFILE + +AC_C_CONST +AC_C_INLINE +AC_C_VARARRAYS + +AC_DEFINE(DEFAULT_DIFF_PROGRAM, "diff", + [Name of "diff" program, unless overridden.]) + +AC_DEFINE(DEFAULT_EDITOR_PROGRAM, "ed", + [Name of editor program, unless overridden.]) + +AC_PATH_PROG(PR_PROGRAM, pr, "") +AC_DEFINE_UNQUOTED(PR_PROGRAM, "$PR_PROGRAM", [Name of "pr" program.]) + +AC_HEADER_STDBOOL +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h libintl.h limits.h locale.h \ + stdlib.h string.h sys/file.h time.h unistd.h) +AC_CHECK_MEMBERS([struct stat.st_blksize]) +AC_CHECK_MEMBERS([struct stat.st_rdev]) +AC_CHECK_TYPE(ptrdiff_t, int) +AC_CHECK_TYPE(ssize_t, int) +jm_AC_TYPE_UINTMAX_T +AM_GNU_GETTEXT([external]) +XGETTEXT="AWK='$AWK' \$(SHELL) \$(top_srcdir)/exgettext $XGETTEXT" +AC_HEADER_DIRENT +AC_HEADER_STAT +AC_HEADER_SYS_WAIT +AC_STRUCT_ST_MTIM_NSEC +AC_TYPE_PID_T +AC_TYPE_SIGNAL + +AC_CHECK_FUNCS(diraccess dup2 gettimeofday \ + sigaction sigprocmask strchr strerror tmpnam) +AC_REPLACE_FUNCS(memchr mkstemp strcasecmp waitpid) +if test $ac_cv_func_mkstemp != yes; then + AC_LIBOBJ(tempname) +fi +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_FORK +AC_FUNC_VPRINTF +jm_FUNC_GLIBC_UNLOCKED_IO +jm_FUNC_GNU_STRFTIME +# No need for AC_FUNC_MEMCMP, since memcmp is used only to test for equality. +jm_FUNC_MALLOC +jm_FUNC_REALLOC +jm_PREREQ_C_STACK +jm_PREREQ_ERROR +jm_PREREQ_HARD_LOCALE +jm_PREREQ_QUOTEARG +jm_PREREQ_REGEX +AC_DEFINE([REGEX_MALLOC], 1, + [Define to 1 to avoid alloca in the regular-expression implementation.]) +jm_PREREQ_TEMPNAME +jm_AC_PREREQ_XSTRTOUMAX + +# Check for clock_gettime and its library. Solaris puts it in -lrt or +# -lposix4, but we don't want to link that library unless we have to. +diff_saved_libs=$LIBS +AC_SEARCH_LIBS(clock_gettime, [rt posix4]) +case $ac_cv_search_clock_gettime in +no | 'none required') + LIB_CLOCK_GETTIME=;; +*) + LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime;; +esac +AC_SUBST([LIB_CLOCK_GETTIME]) +AC_CHECK_FUNCS(clock_gettime) +LIBS=$diff_saved_libs + +# fnmatch +AC_FUNC_FNMATCH +if test $ac_cv_func_fnmatch_works = yes; then + rm -f lib/fnmatch.h +else + AC_LIBOBJ(fnmatch) + AC_CONFIG_LINKS(lib/fnmatch.h:lib/fnmatch.hin) +fi + +# regex +jm_INCLUDED_REGEX([lib/regex.c]) +if test "$jm_with_regex" = yes; then + AC_CONFIG_LINKS(lib/regex.h:lib/regex.hin) +else + rm -f lib/regex.h +fi + +jm_AC_DOS +AC_FUNC_SETMODE_DOS + +AC_CONFIG_FILES([Makefile doc/Makefile \ + lib/Makefile lib/posix/Makefile man/Makefile \ + m4/Makefile ms/Makefile po/Makefile.in src/Makefile]) +AC_CONFIG_COMMANDS([default], [date > stamp-h]) +AC_OUTPUT diff --git a/gnu/dist/diffutils/doc/Makefile.am b/gnu/dist/diffutils/doc/Makefile.am new file mode 100644 index 00000000000..574fdab8705 --- /dev/null +++ b/gnu/dist/diffutils/doc/Makefile.am @@ -0,0 +1,24 @@ +# Makefile for GNU diffutils documentation. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software Foundation, +## Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +AM_MAKEINFOFLAGS = --no-split + +info_TEXINFOS = diff.texi +diff_TEXINFOS = fdl.texi + +EXTRA_DIST = diagmeet.note diff --git a/gnu/dist/diffutils/doc/Makefile.in b/gnu/dist/diffutils/doc/Makefile.in new file mode 100644 index 00000000000..408013d8e2b --- /dev/null +++ b/gnu/dist/diffutils/doc/Makefile.in @@ -0,0 +1,359 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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 diffutils documentation. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +AM_MAKEINFOFLAGS = --no-split + +info_TEXINFOS = diff.texi +diff_TEXINFOS = fdl.texi + +EXTRA_DIST = diagmeet.note +subdir = doc +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex +INFO_DEPS = diff.info +DVIS = diff.dvi +TEXINFOS = diff.texi +DIST_COMMON = $(diff_TEXINFOS) Makefile.am Makefile.in stamp-vti \ + version.texi +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .info .ps .texi +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) + +$(srcdir)/version.texi: $(srcdir)/stamp-vti + @: +$(srcdir)/stamp-vti: diff.texi $(top_srcdir)/configure.ac + @(set `$(SHELL) $(top_srcdir)/config/mdate-sh $(srcdir)/diff.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 + +diff.info: diff.texi $(srcdir)/version.texi $(diff_TEXINFOS) +diff.dvi: diff.texi $(srcdir)/version.texi $(diff_TEXINFOS) + +.texi.info: + @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] + cd $(srcdir) \ + && $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \ + `echo $< | sed 's,.*/,,'` + +.texi.dvi: + TEXINPUTS="$(top_srcdir)/config$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $< + +.texi: + @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] + cd $(srcdir) \ + && $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \ + `echo $< | sed 's,.*/,,'` + +MAKEINFO = @MAKEINFO@ +TEXI2DVI = texi2dvi +DVIPS = dvips +.dvi.ps: + $(DVIPS) $< -o $@ + +uninstall-info-am: + $(PRE_UNINSTALL) + @if (install-info --version && \ + install-info --version | fgrep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file"; \ + install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + (if cd $(DESTDIR)$(infodir); then \ + echo " rm -f $$file $$file-[0-9] $$file-[0-9][0-9])"; \ + rm -f $$file $$file-[0-9] $$file-[0-9][0-9]; \ + else :; fi); \ + done + +dist-info: $(INFO_DEPS) + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + d=$(srcdir); \ + for file in $$d/$$base*; do \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f $(distdir)/$$relfile || \ + cp -p $$file $(distdir)/$$relfile; \ + done; \ + done + +mostlyclean-aminfo: + -rm -f diff.aux diff.cp diff.cps diff.dvi diff.fn diff.ky diff.log diff.pg \ + diff.ps diff.toc diff.tp diff.vr + +maintainer-clean-aminfo: + cd $(srcdir) && \ + for i in $(INFO_DEPS); do \ + rm -f $$i; \ + if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ + rm -f $$i-[0-9]*; \ + fi; \ + done +tags: TAGS +TAGS: + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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: + $(mkinstalldirs) $(DESTDIR)$(infodir) + +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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 + +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am + +install-exec-am: + +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(infodir) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + d=$(srcdir); \ + for ifile in echo $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9]; do \ + if test -f $$ifile; then \ + relfile=`expr "$$ifile" : "$$d/\(.*\)"`; \ + 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 | fgrep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ + install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ + done; \ + else : ; fi +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +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 + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic dist-info \ + distclean distclean-generic distdir dvi dvi-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti mostlyclean \ + mostlyclean-aminfo mostlyclean-generic mostlyclean-vti \ + uninstall uninstall-am uninstall-info-am + +# 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/gnu/dist/diffutils/doc/diagmeet.note b/gnu/dist/diffutils/doc/diagmeet.note new file mode 100644 index 00000000000..8f7242c7356 --- /dev/null +++ b/gnu/dist/diffutils/doc/diagmeet.note @@ -0,0 +1,71 @@ +Here is a comparison matrix which shows a case in which +it is possible for the forward and backward scan in `diag' +to meet along a nonzero length of diagonal simultaneous +(so that bdiag[d] and fdiag[d] are not equal) +even though there is no snake on that diagonal at the meeting point. + + + 85 1 1 1 159 1 1 17 + 1 2 3 4 +60 + 1 2 +1 + 2 2 3 4 +71 + 3 3 4 5 +85 + 4 3 4 5 +17 + 5 4 5 +1 + 6 4 5 6 +183 + 7 5 6 7 +10 + 8 6 7 +1 + 9 6 7 8 +12 + 7 8 9 10 +13 + 10 8 9 10 +14 + 10 9 10 +17 + 10 10 +1 + 10 9 10 +1 + 8 10 10 10 +183 + 8 7 9 9 9 +10 + 7 6 8 9 8 8 +1 + 6 5 7 7 +1 + 5 6 6 +1 + 5 5 5 +50 + 5 4 4 4 +1 + 4 3 3 +85 + 5 4 3 2 2 +1 + 2 1 +17 + 5 4 3 2 1 1 +1 + 1 0 + 85 1 1 1 159 1 1 17 + + + + + + + + + diff --git a/gnu/dist/diffutils/doc/diff.info b/gnu/dist/diffutils/doc/diff.info new file mode 100644 index 00000000000..d58accf7ea9 --- /dev/null +++ b/gnu/dist/diffutils/doc/diff.info @@ -0,0 +1,5084 @@ +This is diff.info, produced by makeinfo version 4.2 from diff.texi. + +This manual is for GNU Diffutils (version 2.8.1, 5 April 2002), and +documents the GNU `diff', `diff3', `sdiff', and `cmp' commands for +showing the differences between files and the GNU `patch' command for +using their output to update files. + + Copyright (C) 1992, 1993, 1994, 1998, 2001, 2002 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 freedom to copy and + modify this GNU Manual, like GNU software. Copies published by + the Free Software Foundation raise funds for GNU development." + +INFO-DIR-SECTION Individual utilities +START-INFO-DIR-ENTRY +* cmp: (diff)Invoking cmp. Compare 2 files byte by byte. +* diff: (diff)Invoking diff. Compare 2 files line by line. +* diff3: (diff)Invoking diff3. Compare 3 files line by line. +* patch: (diff)Invoking patch. Apply a patch to a file. +* sdiff: (diff)Invoking sdiff. Merge 2 files side-by-side. +END-INFO-DIR-ENTRY + +INFO-DIR-SECTION GNU packages +START-INFO-DIR-ENTRY +* Diff: (diff). Comparing and merging files. +END-INFO-DIR-ENTRY + + +File: diff.info, Node: Top, Next: Overview, Up: (dir) + +Comparing and Merging Files +*************************** + +This manual is for GNU Diffutils (version 2.8.1, 5 April 2002), and +documents the GNU `diff', `diff3', `sdiff', and `cmp' commands for +showing the differences between files and the GNU `patch' command for +using their output to update files. + + Copyright (C) 1992, 1993, 1994, 1998, 2001, 2002 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 freedom to copy and + modify this GNU Manual, like GNU software. Copies published by + the Free Software Foundation raise funds for GNU development." + +* Menu: + +* Overview:: Preliminary information. +* Comparison:: What file comparison means. + +* Output Formats:: Formats for two-way difference reports. +* Incomplete Lines:: Lines that lack trailing newlines. +* Comparing Directories:: Comparing files and directories. +* Adjusting Output:: Making `diff' output prettier. +* diff Performance:: Making `diff' smarter or faster. + +* Comparing Three Files:: Formats for three-way difference reports. +* diff3 Merging:: Merging from a common ancestor. + +* Interactive Merging:: Interactive merging with `sdiff'. + +* Merging with patch:: Using `patch' to change old files into new ones. +* Making Patches:: Tips for making and using patch distributions. + +* Invoking cmp:: Compare two files byte by byte. +* Invoking diff:: Compare two files line by line. +* Invoking diff3:: Compare three files line by line. +* Invoking patch:: Apply a diff file to an original. +* Invoking sdiff:: Side-by-side merge of file differences. + +* Standards conformance:: Conformance to the POSIX standard. +* Projects:: If you've found a bug or other shortcoming. + +* Copying This Manual:: How to make copies of this manual. +* Index:: Index. + + +File: diff.info, Node: Overview, Next: Comparison, Prev: Top, Up: Top + +Overview +******** + + Computer users often find occasion to ask how two files differ. +Perhaps one file is a newer version of the other file. Or maybe the +two files started out as identical copies but were changed by different +people. + + You can use the `diff' command to show differences between two +files, or each corresponding file in two directories. `diff' outputs +differences between files line by line in any of several formats, +selectable by command line options. This set of differences is often +called a "diff" or "patch". For files that are identical, `diff' +normally produces no output; for binary (non-text) files, `diff' +normally reports only that they are different. + + You can use the `cmp' command to show the byte and line numbers +where two files differ. `cmp' can also show all the bytes that differ +between the two files, side by side. A way to compare two files +character by character is the Emacs command `M-x compare-windows'. +*Note Other Window: (emacs)Other Window, for more information on that +command. + + You can use the `diff3' command to show differences among three +files. When two people have made independent changes to a common +original, `diff3' can report the differences between the original and +the two changed versions, and can produce a merged file that contains +both persons' changes together with warnings about conflicts. + + You can use the `sdiff' command to merge two files interactively. + + You can use the set of differences produced by `diff' to distribute +updates to text files (such as program source code) to other people. +This method is especially useful when the differences are small compared +to the complete files. Given `diff' output, you can use the `patch' +program to update, or "patch", a copy of the file. If you think of +`diff' as subtracting one file from another to produce their +difference, you can think of `patch' as adding the difference to one +file to reproduce the other. + + This manual first concentrates on making diffs, and later shows how +to use diffs to update files. + + GNU `diff' was written by Paul Eggert, Mike Haertel, David Hayes, +Richard Stallman, and Len Tower. Wayne Davison designed and +implemented the unified output format. The basic algorithm is described +in "An O(ND) Difference Algorithm and its Variations", Eugene W. Myers, +`Algorithmica' Vol. 1 No. 2, 1986, pp. 251-266; and in "A File +Comparison Program", Webb Miller and Eugene W. Myers, +`Software--Practice and Experience' Vol. 15 No. 11, 1985, pp. 1025-1040. +The algorithm was independently discovered as described in "Algorithms +for Approximate String Matching", E. Ukkonen, `Information and Control' +Vol. 64, 1985, pp. 100-118. + + GNU `diff3' was written by Randy Smith. GNU `sdiff' was written by +Thomas Lord. GNU `cmp' was written by Torbjorn Granlund and David +MacKenzie. + + `patch' was written mainly by Larry Wall and Paul Eggert; several +GNU enhancements were contributed by Wayne Davison and David MacKenzie. +Parts of this manual are adapted from a manual page written by Larry +Wall, with his permission. + + +File: diff.info, Node: Comparison, Next: Output Formats, Prev: Overview, Up: Top + +What Comparison Means +********************* + + There are several ways to think about the differences between two +files. One way to think of the differences is as a series of lines +that were deleted from, inserted in, or changed in one file to produce +the other file. `diff' compares two files line by line, finds groups of +lines that differ, and reports each group of differing lines. It can +report the differing lines in several formats, which have different +purposes. + + GNU `diff' can show whether files are different without detailing +the differences. It also provides ways to suppress certain kinds of +differences that are not important to you. Most commonly, such +differences are changes in the amount of white space between words or +lines. `diff' also provides ways to suppress differences in alphabetic +case or in lines that match a regular expression that you provide. +These options can accumulate; for example, you can ignore changes in +both white space and alphabetic case. + + Another way to think of the differences between two files is as a +sequence of pairs of bytes that can be either identical or different. +`cmp' reports the differences between two files byte by byte, instead +of line by line. As a result, it is often more useful than `diff' for +comparing binary files. For text files, `cmp' is useful mainly when +you want to know only whether two files are identical, or whether one +file is a prefix of the other. + + To illustrate the effect that considering changes byte by byte can +have compared with considering them line by line, think of what happens +if a single newline character is added to the beginning of a file. If +that file is then compared with an otherwise identical file that lacks +the newline at the beginning, `diff' will report that a blank line has +been added to the file, while `cmp' will report that almost every byte +of the two files differs. + + `diff3' normally compares three input files line by line, finds +groups of lines that differ, and reports each group of differing lines. +Its output is designed to make it easy to inspect two different sets of +changes to the same file. + +* Menu: + +* Hunks:: Groups of differing lines. +* White Space:: Suppressing differences in white space. +* Blank Lines:: Suppressing differences in blank lines. +* Case Folding:: Suppressing differences in alphabetic case. +* Specified Folding:: Suppressing differences that match regular expressions. +* Brief:: Summarizing which files are different. +* Binary:: Comparing binary files or forcing text comparisons. + + +File: diff.info, Node: Hunks, Next: White Space, Up: Comparison + +Hunks +===== + + When comparing two files, `diff' finds sequences of lines common to +both files, interspersed with groups of differing lines called "hunks". +Comparing two identical files yields one sequence of common lines and +no hunks, because no lines differ. Comparing two entirely different +files yields no common lines and one large hunk that contains all lines +of both files. In general, there are many ways to match up lines +between two given files. `diff' tries to minimize the total hunk size +by finding large sequences of common lines interspersed with small +hunks of differing lines. + + For example, suppose the file `F' contains the three lines `a', `b', +`c', and the file `G' contains the same three lines in reverse order +`c', `b', `a'. If `diff' finds the line `c' as common, then the command +`diff F G' produces this output: + + 1,2d0 + < a + < b + 3a2,3 + > b + > a + +But if `diff' notices the common line `b' instead, it produces this +output: + + 1c1 + < a + --- + > c + 3c3 + < c + --- + > a + +It is also possible to find `a' as the common line. `diff' does not +always find an optimal matching between the files; it takes shortcuts +to run faster. But its output is usually close to the shortest +possible. You can adjust this tradeoff with the `--minimal' option +(*note diff Performance::). + + +File: diff.info, Node: White Space, Next: Blank Lines, Prev: Hunks, Up: Comparison + +Suppressing Differences in Blank and Tab Spacing +================================================ + + The `-E' and `--ignore-tab-expansion' options ignore the distinction +between tabs and spaces on input. A tab is considered to be equivalent +to the number of spaces to the next tab stop. `diff' assumes that tab +stops are set every 8 print columns. + + The `-b' and `--ignore-space-change' options are stronger. They +ignore white space at line end, and consider all other sequences of one +or more white space characters to be equivalent. With these options, +`diff' considers the following two lines to be equivalent, where `$' +denotes the line end: + + Here lyeth muche rychnesse in lytell space. -- John Heywood$ + Here lyeth muche rychnesse in lytell space. -- John Heywood $ + + The `-w' and `--ignore-all-space' options are stronger still. They +ignore difference even if one line has white space where the other line +has none. "White space" characters include tab, newline, vertical tab, +form feed, carriage return, and space; some locales may define +additional characters to be white space. With these options, `diff' +considers the following two lines to be equivalent, where `$' denotes +the line end and `^M' denotes a carriage return: + + Here lyeth muche rychnesse in lytell space.-- John Heywood$ + He relyeth much erychnes seinly tells pace. --John Heywood ^M$ + + +File: diff.info, Node: Blank Lines, Next: Case Folding, Prev: White Space, Up: Comparison + +Suppressing Differences in Blank Lines +====================================== + + The `-B' and `--ignore-blank-lines' options ignore insertions or +deletions of blank lines. These options affect only lines that are +completely empty; they do not affect lines that look empty but contain +space or tab characters. With these options, for example, a file +containing + 1. A point is that which has no part. + + 2. A line is breadthless length. + -- Euclid, The Elements, I + +is considered identical to a file containing + 1. A point is that which has no part. + 2. A line is breadthless length. + + + -- Euclid, The Elements, I + + +File: diff.info, Node: Case Folding, Next: Specified Folding, Prev: Blank Lines, Up: Comparison + +Suppressing Case Differences +============================ + + GNU `diff' can treat lower case letters as equivalent to their upper +case counterparts, so that, for example, it considers `Funky Stuff', +`funky STUFF', and `fUNKy stuFf' to all be the same. To request this, +use the `-i' or `--ignore-case' option. + + +File: diff.info, Node: Specified Folding, Next: Brief, Prev: Case Folding, Up: Comparison + +Suppressing Lines Matching a Regular Expression +=============================================== + + To ignore insertions and deletions of lines that match a +`grep'-style regular expression, use the `-I REGEXP' or +`--ignore-matching-lines=REGEXP' option. You should escape regular +expressions that contain shell metacharacters to prevent the shell from +expanding them. For example, `diff -I '^[[:digit:]]'' ignores all +changes to lines beginning with a digit. + + However, `-I' only ignores the insertion or deletion of lines that +contain the regular expression if every changed line in the hunk--every +insertion and every deletion--matches the regular expression. In other +words, for each nonignorable change, `diff' prints the complete set of +changes in its vicinity, including the ignorable ones. + + You can specify more than one regular expression for lines to ignore +by using more than one `-I' option. `diff' tries to match each line +against each regular expression. + + +File: diff.info, Node: Brief, Next: Binary, Prev: Specified Folding, Up: Comparison + +Summarizing Which Files Differ +============================== + + When you only want to find out whether files are different, and you +don't care what the differences are, you can use the summary output +format. In this format, instead of showing the differences between the +files, `diff' simply reports whether files differ. The `-q' and +`--brief' options select this output format. + + This format is especially useful when comparing the contents of two +directories. It is also much faster than doing the normal line by line +comparisons, because `diff' can stop analyzing the files as soon as it +knows that there are any differences. + + You can also get a brief indication of whether two files differ by +using `cmp'. For files that are identical, `cmp' produces no output. +When the files differ, by default, `cmp' outputs the byte and line +number where the first difference occurs. You can use the `-s' option +to suppress that information, so that `cmp' produces no output and +reports whether the files differ using only its exit status (*note +Invoking cmp::). + + Unlike `diff', `cmp' cannot compare directories; it can only compare +two files. + + +File: diff.info, Node: Binary, Prev: Brief, Up: Comparison + +Binary Files and Forcing Text Comparisons +========================================= + + If `diff' thinks that either of the two files it is comparing is +binary (a non-text file), it normally treats that pair of files much as +if the summary output format had been selected (*note Brief::), and +reports only that the binary files are different. This is because line +by line comparisons are usually not meaningful for binary files. + + `diff' determines whether a file is text or binary by checking the +first few bytes in the file; the exact number of bytes is system +dependent, but it is typically several thousand. If every byte in that +part of the file is non-null, `diff' considers the file to be text; +otherwise it considers the file to be binary. + + Sometimes you might want to force `diff' to consider files to be +text. For example, you might be comparing text files that contain null +characters; `diff' would erroneously decide that those are non-text +files. Or you might be comparing documents that are in a format used +by a word processing system that uses null characters to indicate +special formatting. You can force `diff' to consider all files to be +text files, and compare them line by line, by using the `-a' or +`--text' option. If the files you compare using this option do not in +fact contain text, they will probably contain few newline characters, +and the `diff' output will consist of hunks showing differences between +long lines of whatever characters the files contain. + + You can also force `diff' to consider all files to be binary files, +and report only whether they differ (but not how). Use the `-q' or +`--brief' option for this. + + Differing binary files are considered to cause trouble because the +resulting `diff' output does not capture all the differences. This +trouble causes `diff' to exit with status 2. However, this trouble +cannot occur with the `--a' or `--text' option, or with the `-q' or +`--brief' option, as these options both cause `diff' to treat binary +files like text files. + + In operating systems that distinguish between text and binary files, +`diff' normally reads and writes all data as text. Use the `--binary' +option to force `diff' to read and write binary data instead. This +option has no effect on a POSIX-compliant system like GNU or +traditional Unix. However, many personal computer operating systems +represent the end of a line with a carriage return followed by a +newline. On such systems, `diff' normally ignores these carriage +returns on input and generates them at the end of each output line, but +with the `--binary' option `diff' treats each carriage return as just +another input character, and does not generate a carriage return at the +end of each output line. This can be useful when dealing with non-text +files that are meant to be interchanged with POSIX-compliant systems. + + The `--strip-trailing-cr' causes `diff' to treat input lines that +end in carriage return followed by newline as if they end in plain +newline. This can be useful when comparing text that is imperfectly +imported from many personal computer operating systems. This option +affects how lines are read, which in turn affects how they are compared +and output. + + If you want to compare two files byte by byte, you can use the `cmp' +program with the `-l' option to show the values of each differing byte +in the two files. With GNU `cmp', you can also use the `-b' option to +show the ASCII representation of those bytes. *Note Invoking cmp::, +for more information. + + If `diff3' thinks that any of the files it is comparing is binary (a +non-text file), it normally reports an error, because such comparisons +are usually not useful. `diff3' uses the same test as `diff' to decide +whether a file is binary. As with `diff', if the input files contain a +few non-text bytes but otherwise are like text files, you can force +`diff3' to consider all files to be text files and compare them line by +line by using the `-a' or `--text' options. + + +File: diff.info, Node: Output Formats, Next: Incomplete Lines, Prev: Comparison, Up: Top + +`diff' Output Formats +********************* + + `diff' has several mutually exclusive options for output format. +The following sections describe each format, illustrating how `diff' +reports the differences between two sample input files. + +* Menu: + +* Sample diff Input:: Sample `diff' input files for examples. +* Normal:: Showing differences without surrounding text. +* Context:: Showing differences with the surrounding text. +* Side by Side:: Showing differences in two columns. +* Scripts:: Generating scripts for other programs. +* If-then-else:: Merging files with if-then-else. + + +File: diff.info, Node: Sample diff Input, Next: Normal, Up: Output Formats + +Two Sample Input Files +====================== + + Here are two sample files that we will use in numerous examples to +illustrate the output of `diff' and how various options can change it. + + This is the file `lao': + + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; + The Named is the mother of all things. + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + so we may see their outcome. + The two are the same, + But after they are produced, + they have different names. + + This is the file `tzu': + + The Nameless is the origin of Heaven and Earth; + The named is the mother of all things. + + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + so we may see their outcome. + The two are the same, + But after they are produced, + they have different names. + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + + In this example, the first hunk contains just the first two lines of +`lao', the second hunk contains the fourth line of `lao' opposing the +second and third lines of `tzu', and the last hunk contains just the +last three lines of `tzu'. + + +File: diff.info, Node: Normal, Next: Context, Prev: Sample diff Input, Up: Output Formats + +Showing Differences Without Context +=================================== + + The "normal" `diff' output format shows each hunk of differences +without any surrounding context. Sometimes such output is the clearest +way to see how lines have changed, without the clutter of nearby +unchanged lines (although you can get similar results with the context +or unified formats by using 0 lines of context). However, this format +is no longer widely used for sending out patches; for that purpose, the +context format (*note Context Format::) and the unified format (*note +Unified Format::) are superior. Normal format is the default for +compatibility with older versions of `diff' and the POSIX standard. +Use the `--normal' option to select this output format explicitly. + +* Menu: + +* Detailed Normal:: A detailed description of normal output format. +* Example Normal:: Sample output in the normal format. + + +File: diff.info, Node: Detailed Normal, Next: Example Normal, Up: Normal + +Detailed Description of Normal Format +------------------------------------- + + The normal output format consists of one or more hunks of +differences; each hunk shows one area where the files differ. Normal +format hunks look like this: + + CHANGE-COMMAND + < FROM-FILE-LINE + < FROM-FILE-LINE... + --- + > TO-FILE-LINE + > TO-FILE-LINE... + + There are three types of change commands. Each consists of a line +number or comma-separated range of lines in the first file, a single +character indicating the kind of change to make, and a line number or +comma-separated range of lines in the second file. All line numbers are +the original line numbers in each file. The types of change commands +are: + +`LaR' + Add the lines in range R of the second file after line L of the + first file. For example, `8a12,15' means append lines 12-15 of + file 2 after line 8 of file 1; or, if changing file 2 into file 1, + delete lines 12-15 of file 2. + +`FcT' + Replace the lines in range F of the first file with lines in range + T of the second file. This is like a combined add and delete, but + more compact. For example, `5,7c8,10' means change lines 5-7 of + file 1 to read as lines 8-10 of file 2; or, if changing file 2 into + file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1. + +`RdL' + Delete the lines in range R from the first file; line L is where + they would have appeared in the second file had they not been + deleted. For example, `5,7d3' means delete lines 5-7 of file 1; + or, if changing file 2 into file 1, append lines 5-7 of file 1 + after line 3 of file 2. + + +File: diff.info, Node: Example Normal, Prev: Detailed Normal, Up: Normal + +An Example of Normal Format +--------------------------- + + Here is the output of the command `diff lao tzu' (*note Sample diff +Input::, for the complete contents of the two files). Notice that it +shows only the lines that are different between the two files. + + 1,2d0 + < The Way that can be told of is not the eternal Way; + < The name that can be named is not the eternal name. + 4c2,3 + < The Named is the mother of all things. + --- + > The named is the mother of all things. + > + 11a11,13 + > They both may be called deep and profound. + > Deeper and more profound, + > The door of all subtleties! + + +File: diff.info, Node: Context, Next: Side by Side, Prev: Normal, Up: Output Formats + +Showing Differences in Their Context +==================================== + + Usually, when you are looking at the differences between files, you +will also want to see the parts of the files near the lines that +differ, to help you understand exactly what has changed. These nearby +parts of the files are called the "context". + + GNU `diff' provides two output formats that show context around the +differing lines: "context format" and "unified format". It can +optionally show in which function or section of the file the differing +lines are found. + + If you are distributing new versions of files to other people in the +form of `diff' output, you should use one of the output formats that +show context so that they can apply the diffs even if they have made +small changes of their own to the files. `patch' can apply the diffs +in this case by searching in the files for the lines of context around +the differing lines; if those lines are actually a few lines away from +where the diff says they are, `patch' can adjust the line numbers +accordingly and still apply the diff correctly. *Note Imperfect::, for +more information on using `patch' to apply imperfect diffs. + +* Menu: + +* Context Format:: An output format that shows surrounding lines. +* Unified Format:: A more compact output format that shows context. +* Sections:: Showing which sections of the files differences are in. +* Alternate Names:: Showing alternate file names in context headers. + + +File: diff.info, Node: Context Format, Next: Unified Format, Up: Context + +Context Format +-------------- + + The context output format shows several lines of context around the +lines that differ. It is the standard format for distributing updates +to source code. + + To select this output format, use the `-C LINES', +`--context[=LINES]', or `-c' option. The argument LINES that some of +these options take is the number of lines of context to show. If you +do not specify LINES, it defaults to three. For proper operation, +`patch' typically needs at least two lines of context. + +* Menu: + +* Detailed Context:: A detailed description of the context output format. +* Example Context:: Sample output in context format. +* Less Context:: Another sample with less context. + + +File: diff.info, Node: Detailed Context, Next: Example Context, Up: Context Format + +Detailed Description of Context Format +...................................... + + The context output format starts with a two-line header, which looks +like this: + + *** FROM-FILE FROM-FILE-MODIFICATION-TIME + --- TO-FILE TO-FILE-MODIFICATION TIME + +The time stamp normally looks like `2002-02-21 23:30:39.942229878 +-0800' to indicate the date, time with fractional seconds, and time +zone in Internet RFC 2822 format +(ftp://ftp.isi.edu/in-notes/rfc2822.txt). However, a traditional time +stamp like `Thu Feb 21 23:30:39 2002' is used if the `LC_TIME' locale +category is either `C' or `POSIX'. + + You can change the header's content with the `--label=LABEL' option; +see *Note Alternate Names::. + + Next come one or more hunks of differences; each hunk shows one area +where the files differ. Context format hunks look like this: + + *************** + *** FROM-FILE-LINE-RANGE **** + FROM-FILE-LINE + FROM-FILE-LINE... + --- TO-FILE-LINE-RANGE ---- + TO-FILE-LINE + TO-FILE-LINE... + + The lines of context around the lines that differ start with two +space characters. The lines that differ between the two files start +with one of the following indicator characters, followed by a space +character: + +`!' + A line that is part of a group of one or more lines that changed + between the two files. There is a corresponding group of lines + marked with `!' in the part of this hunk for the other file. + +`+' + An "inserted" line in the second file that corresponds to nothing + in the first file. + +`-' + A "deleted" line in the first file that corresponds to nothing in + the second file. + + If all of the changes in a hunk are insertions, the lines of +FROM-FILE are omitted. If all of the changes are deletions, the lines +of TO-FILE are omitted. + + +File: diff.info, Node: Example Context, Next: Less Context, Prev: Detailed Context, Up: Context Format + +An Example of Context Format +............................ + + Here is the output of `diff -c lao tzu' (*note Sample diff Input::, +for the complete contents of the two files). Notice that up to three +lines that are not different are shown around each line that is +different; they are the context lines. Also notice that the first two +hunks have run together, because their contents overlap. + + *** lao 2002-02-21 23:30:39.942229878 -0800 + --- tzu 2002-02-21 23:30:50.442260588 -0800 + *************** + *** 1,7 **** + - The Way that can be told of is not the eternal Way; + - The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; + ! The Named is the mother of all things. + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + --- 1,6 ---- + The Nameless is the origin of Heaven and Earth; + ! The named is the mother of all things. + ! + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + *************** + *** 9,11 **** + --- 8,13 ---- + The two are the same, + But after they are produced, + they have different names. + + They both may be called deep and profound. + + Deeper and more profound, + + The door of all subtleties! + + +File: diff.info, Node: Less Context, Prev: Example Context, Up: Context Format + +An Example of Context Format with Less Context +.............................................. + + Here is the output of `diff -C 1 lao tzu' (*note Sample diff +Input::, for the complete contents of the two files). Notice that at +most one context line is reported here. + + *** lao 2002-02-21 23:30:39.942229878 -0800 + --- tzu 2002-02-21 23:30:50.442260588 -0800 + *************** + *** 1,5 **** + - The Way that can be told of is not the eternal Way; + - The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; + ! The Named is the mother of all things. + Therefore let there always be non-being, + --- 1,4 ---- + The Nameless is the origin of Heaven and Earth; + ! The named is the mother of all things. + ! + Therefore let there always be non-being, + *************** + *** 11 **** + --- 10,13 ---- + they have different names. + + They both may be called deep and profound. + + Deeper and more profound, + + The door of all subtleties! + + +File: diff.info, Node: Unified Format, Next: Sections, Prev: Context Format, Up: Context + +Unified Format +-------------- + + The unified output format is a variation on the context format that +is more compact because it omits redundant context lines. To select +this output format, use the `-U LINES', `--unified[=LINES]', or `-u' +option. The argument LINES is the number of lines of context to show. +When it is not given, it defaults to three. + + At present, only GNU `diff' can produce this format and only GNU +`patch' can automatically apply diffs in this format. For proper +operation, `patch' typically needs at least three lines of context. + +* Menu: + +* Detailed Unified:: A detailed description of unified format. +* Example Unified:: Sample output in unified format. + + +File: diff.info, Node: Detailed Unified, Next: Example Unified, Up: Unified Format + +Detailed Description of Unified Format +...................................... + + The unified output format starts with a two-line header, which looks +like this: + + --- FROM-FILE FROM-FILE-MODIFICATION-TIME + +++ TO-FILE TO-FILE-MODIFICATION-TIME + +The time stamp looks like `2002-02-21 23:30:39.942229878 -0800' to +indicate the date, time with fractional seconds, and time zone. + + You can change the header's content with the `--label=LABEL' option; +see *Note Alternate Names::. + + Next come one or more hunks of differences; each hunk shows one area +where the files differ. Unified format hunks look like this: + + @@ FROM-FILE-RANGE TO-FILE-RANGE @@ + LINE-FROM-EITHER-FILE + LINE-FROM-EITHER-FILE... + + The lines common to both files begin with a space character. The +lines that actually differ between the two files have one of the +following indicator characters in the left print column: + +`+' + A line was added here to the first file. + +`-' + A line was removed here from the first file. + + +File: diff.info, Node: Example Unified, Prev: Detailed Unified, Up: Unified Format + +An Example of Unified Format +............................ + + Here is the output of the command `diff -u lao tzu' (*note Sample +diff Input::, for the complete contents of the two files): + + --- lao 2002-02-21 23:30:39.942229878 -0800 + +++ tzu 2002-02-21 23:30:50.442260588 -0800 + @@ -1,7 +1,6 @@ + -The Way that can be told of is not the eternal Way; + -The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; + -The Named is the mother of all things. + +The named is the mother of all things. + + + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + @@ -9,3 +8,6 @@ + The two are the same, + But after they are produced, + they have different names. + +They both may be called deep and profound. + +Deeper and more profound, + +The door of all subtleties! + + +File: diff.info, Node: Sections, Next: Alternate Names, Prev: Unified Format, Up: Context + +Showing Which Sections Differences Are in +----------------------------------------- + + Sometimes you might want to know which part of the files each change +falls in. If the files are source code, this could mean which function +was changed. If the files are documents, it could mean which chapter or +appendix was changed. GNU `diff' can show this by displaying the +nearest section heading line that precedes the differing lines. Which +lines are "section headings" is determined by a regular expression. + +* Menu: + +* Specified Headings:: Showing headings that match regular expressions. +* C Function Headings:: Showing headings of C functions. + + +File: diff.info, Node: Specified Headings, Next: C Function Headings, Up: Sections + +Showing Lines That Match Regular Expressions +............................................ + + To show in which sections differences occur for files that are not +source code for C or similar languages, use the `-F REGEXP' or +`--show-function-line=REGEXP' option. `diff' considers lines that +match the `grep'-style regular expression REGEXP to be the beginning of +a section of the file. Here are suggested regular expressions for some +common languages: + +`^[[:alpha:]$_]' + C, C++, Prolog + +`^(' + Lisp + +`^@node' + Texinfo + + This option does not automatically select an output format; in order +to use it, you must select the context format (*note Context Format::) +or unified format (*note Unified Format::). In other output formats it +has no effect. + + The `-F' and `--show-function-line' options find the nearest +unchanged line that precedes each hunk of differences and matches the +given regular expression. Then they add that line to the end of the +line of asterisks in the context format, or to the `@@' line in unified +format. If no matching line exists, they leave the output for that +hunk unchanged. If that line is more than 40 characters long, they +output only the first 40 characters. You can specify more than one +regular expression for such lines; `diff' tries to match each line +against each regular expression, starting with the last one given. This +means that you can use `-p' and `-F' together, if you wish. + + +File: diff.info, Node: C Function Headings, Prev: Specified Headings, Up: Sections + +Showing C Function Headings +........................... + + To show in which functions differences occur for C and similar +languages, you can use the `-p' or `--show-c-function' option. This +option automatically defaults to the context output format (*note +Context Format::), with the default number of lines of context. You +can override that number with `-C LINES' elsewhere in the command line. +You can override both the format and the number with `-U LINES' +elsewhere in the command line. + + The `-p' and `--show-c-function' options are equivalent to `-F +'^[[:alpha:]$_]'' if the unified format is specified, otherwise `-c -F +'^[[:alpha:]$_]'' (*note Specified Headings::). GNU `diff' provides +them for the sake of convenience. + + +File: diff.info, Node: Alternate Names, Prev: Sections, Up: Context + +Showing Alternate File Names +---------------------------- + + If you are comparing two files that have meaningless or uninformative +names, you might want `diff' to show alternate names in the header of +the context and unified output formats. To do this, use the +`--label=LABEL' option. The first time you give this option, its +argument replaces the name and date of the first file in the header; +the second time, its argument replaces the name and date of the second +file. If you give this option more than twice, `diff' reports an +error. The `--label' option does not affect the file names in the `pr' +header when the `-l' or `--paginate' option is used (*note +Pagination::). + + Here are the first two lines of the output from `diff -C 2 +--label=original --label=modified lao tzu': + + *** original + --- modified + + +File: diff.info, Node: Side by Side, Next: Scripts, Prev: Context, Up: Output Formats + +Showing Differences Side by Side +================================ + + `diff' can produce a side by side difference listing of two files. +The files are listed in two columns with a gutter between them. The +gutter contains one of the following markers: + +white space + The corresponding lines are in common. That is, either the lines + are identical, or the difference is ignored because of one of the + `--ignore' options (*note White Space::). + +`|' + The corresponding lines differ, and they are either both complete + or both incomplete. + +`<' + The files differ and only the first file contains the line. + +`>' + The files differ and only the second file contains the line. + +`(' + Only the first file contains the line, but the difference is + ignored. + +`)' + Only the second file contains the line, but the difference is + ignored. + +`\' + The corresponding lines differ, and only the first line is + incomplete. + +`/' + The corresponding lines differ, and only the second line is + incomplete. + + Normally, an output line is incomplete if and only if the lines that +it contains are incomplete; *Note Incomplete Lines::. However, when an +output line represents two differing lines, one might be incomplete +while the other is not. In this case, the output line is complete, but +its the gutter is marked `\' if the first line is incomplete, `/' if +the second line is. + + Side by side format is sometimes easiest to read, but it has +limitations. It generates much wider output than usual, and truncates +lines that are too long to fit. Also, it relies on lining up output +more heavily than usual, so its output looks particularly bad if you +use varying width fonts, nonstandard tab stops, or nonprinting +characters. + + You can use the `sdiff' command to interactively merge side by side +differences. *Note Interactive Merging::, for more information on +merging files. + +* Menu: + +* Side by Side Format:: Controlling side by side output format. +* Example Side by Side:: Sample side by side output. + + +File: diff.info, Node: Side by Side Format, Next: Example Side by Side, Up: Side by Side + +Controlling Side by Side Format +------------------------------- + + The `-y' or `--side-by-side' option selects side by side format. +Because side by side output lines contain two input lines, the output +is wider than usual: normally 130 print columns, which can fit onto a +traditional printer line. You can set the width of the output with the +`-W COLUMNS' or `--width=COLUMNS' option. The output is split into two +halves of equal width, separated by a small gutter to mark differences; +the right half is aligned to a tab stop so that tabs line up. Input +lines that are too long to fit in half of an output line are truncated +for output. + + The `--left-column' option prints only the left column of two common +lines. The `--suppress-common-lines' option suppresses common lines +entirely. + + +File: diff.info, Node: Example Side by Side, Prev: Side by Side Format, Up: Side by Side + +An Example of Side by Side Format +--------------------------------- + + Here is the output of the command `diff -y -W 72 lao tzu' (*note +Sample diff Input::, for the complete contents of the two files). + + The Way that can be told of is n < + The name that can be named is no < + The Nameless is the origin of He The Nameless is the origin of He + The Named is the mother of all t | The named is the mother of all t + > + Therefore let there always be no Therefore let there always be no + so we may see their subtlety, so we may see their subtlety, + And let there always be being, And let there always be being, + so we may see their outcome. so we may see their outcome. + The two are the same, The two are the same, + But after they are produced, But after they are produced, + they have different names. they have different names. + > They both may be called deep and + > Deeper and more profound, + > The door of all subtleties! + + +File: diff.info, Node: Scripts, Next: If-then-else, Prev: Side by Side, Up: Output Formats + +Making Edit Scripts +=================== + + Several output modes produce command scripts for editing FROM-FILE +to produce TO-FILE. + +* Menu: + +* ed Scripts:: Using `diff' to produce commands for `ed'. +* Forward ed:: Making forward `ed' scripts. +* RCS:: A special `diff' output format used by RCS. + + +File: diff.info, Node: ed Scripts, Next: Forward ed, Up: Scripts + +`ed' Scripts +------------ + + `diff' can produce commands that direct the `ed' text editor to +change the first file into the second file. Long ago, this was the +only output mode that was suitable for editing one file into another +automatically; today, with `patch', it is almost obsolete. Use the +`-e' or `--ed' option to select this output format. + + Like the normal format (*note Normal::), this output format does not +show any context; unlike the normal format, it does not include the +information necessary to apply the diff in reverse (to produce the first +file if all you have is the second file and the diff). + + If the file `d' contains the output of `diff -e old new', then the +command `(cat d && echo w) | ed - old' edits `old' to make it a copy of +`new'. More generally, if `d1', `d2', ..., `dN' contain the outputs of +`diff -e old new1', `diff -e new1 new2', ..., `diff -e newN-1 newN', +respectively, then the command `(cat d1 d2 ... dN && echo w) | ed - +old' edits `old' to make it a copy of `newN'. + +* Menu: + +* Detailed ed:: A detailed description of `ed' format. +* Example ed:: A sample `ed' script. + + +File: diff.info, Node: Detailed ed, Next: Example ed, Up: ed Scripts + +Detailed Description of `ed' Format +................................... + + The `ed' output format consists of one or more hunks of differences. +The changes closest to the ends of the files come first so that +commands that change the number of lines do not affect how `ed' +interprets line numbers in succeeding commands. `ed' format hunks look +like this: + + CHANGE-COMMAND + TO-FILE-LINE + TO-FILE-LINE... + . + + Because `ed' uses a single period on a line to indicate the end of +input, GNU `diff' protects lines of changes that contain a single +period on a line by writing two periods instead, then writing a +subsequent `ed' command to change the two periods into one. The `ed' +format cannot represent an incomplete line, so if the second file ends +in a changed incomplete line, `diff' reports an error and then pretends +that a newline was appended. + + There are three types of change commands. Each consists of a line +number or comma-separated range of lines in the first file and a single +character indicating the kind of change to make. All line numbers are +the original line numbers in the file. The types of change commands +are: + +`La' + Add text from the second file after line L in the first file. For + example, `8a' means to add the following lines after line 8 of file + 1. + +`Rc' + Replace the lines in range R in the first file with the following + lines. Like a combined add and delete, but more compact. For + example, `5,7c' means change lines 5-7 of file 1 to read as the + text file 2. + +`Rd' + Delete the lines in range R from the first file. For example, + `5,7d' means delete lines 5-7 of file 1. + + +File: diff.info, Node: Example ed, Prev: Detailed ed, Up: ed Scripts + +Example `ed' Script +................... + + Here is the output of `diff -e lao tzu' (*note Sample diff Input::, +for the complete contents of the two files): + + 11a + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + . + 4c + The named is the mother of all things. + + . + 1,2d + + +File: diff.info, Node: Forward ed, Next: RCS, Prev: ed Scripts, Up: Scripts + +Forward `ed' Scripts +-------------------- + + `diff' can produce output that is like an `ed' script, but with +hunks in forward (front to back) order. The format of the commands is +also changed slightly: command characters precede the lines they +modify, spaces separate line numbers in ranges, and no attempt is made +to disambiguate hunk lines consisting of a single period. Like `ed' +format, forward `ed' format cannot represent incomplete lines. + + Forward `ed' format is not very useful, because neither `ed' nor +`patch' can apply diffs in this format. It exists mainly for +compatibility with older versions of `diff'. Use the `-f' or +`--forward-ed' option to select it. + + +File: diff.info, Node: RCS, Prev: Forward ed, Up: Scripts + +RCS Scripts +----------- + + The RCS output format is designed specifically for use by the +Revision Control System, which is a set of free programs used for +organizing different versions and systems of files. Use the `-n' or +`--rcs' option to select this output format. It is like the forward +`ed' format (*note Forward ed::), but it can represent arbitrary +changes to the contents of a file because it avoids the forward `ed' +format's problems with lines consisting of a single period and with +incomplete lines. Instead of ending text sections with a line +consisting of a single period, each command specifies the number of +lines it affects; a combination of the `a' and `d' commands are used +instead of `c'. Also, if the second file ends in a changed incomplete +line, then the output also ends in an incomplete line. + + Here is the output of `diff -n lao tzu' (*note Sample diff Input::, +for the complete contents of the two files): + + d1 2 + d4 1 + a4 2 + The named is the mother of all things. + + a11 3 + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + + +File: diff.info, Node: If-then-else, Prev: Scripts, Up: Output Formats + +Merging Files with If-then-else +=============================== + + You can use `diff' to merge two files of C source code. The output +of `diff' in this format contains all the lines of both files. Lines +common to both files are output just once; the differing parts are +separated by the C preprocessor directives `#ifdef NAME' or `#ifndef +NAME', `#else', and `#endif'. When compiling the output, you select +which version to use by either defining or leaving undefined the macro +NAME. + + To merge two files, use `diff' with the `-D NAME' or `--ifdef=NAME' +option. The argument NAME is the C preprocessor identifier to use in +the `#ifdef' and `#ifndef' directives. + + For example, if you change an instance of `wait (&s)' to `waitpid +(-1, &s, 0)' and then merge the old and new files with the +`--ifdef=HAVE_WAITPID' option, then the affected part of your code +might look like this: + + do { + #ifndef HAVE_WAITPID + if ((w = wait (&s)) < 0 && errno != EINTR) + #else /* HAVE_WAITPID */ + if ((w = waitpid (-1, &s, 0)) < 0 && errno != EINTR) + #endif /* HAVE_WAITPID */ + return w; + } while (w != child); + + You can specify formats for languages other than C by using line +group formats and line formats, as described in the next sections. + +* Menu: + +* Line Group Formats:: Formats for general if-then-else line groups. +* Line Formats:: Formats for each line in a line group. +* Detailed If-then-else:: A detailed description of if-then-else format. +* Example If-then-else:: Sample if-then-else format output. + + +File: diff.info, Node: Line Group Formats, Next: Line Formats, Up: If-then-else + +Line Group Formats +------------------ + + Line group formats let you specify formats suitable for many +applications that allow if-then-else input, including programming +languages and text formatting languages. A line group format specifies +the output format for a contiguous group of similar lines. + + For example, the following command compares the TeX files `old' and +`new', and outputs a merged file in which old regions are surrounded by +`\begin{em}'-`\end{em}' lines, and new regions are surrounded by +`\begin{bf}'-`\end{bf}' lines. + + diff \ + --old-group-format='\begin{em} + %<\end{em} + ' \ + --new-group-format='\begin{bf} + %>\end{bf} + ' \ + old new + + The following command is equivalent to the above example, but it is a +little more verbose, because it spells out the default line group +formats. + + diff \ + --old-group-format='\begin{em} + %<\end{em} + ' \ + --new-group-format='\begin{bf} + %>\end{bf} + ' \ + --unchanged-group-format='%=' \ + --changed-group-format='\begin{em} + %<\end{em} + \begin{bf} + %>\end{bf} + ' \ + old new + + Here is a more advanced example, which outputs a diff listing with +headers containing line numbers in a "plain English" style. + + diff \ + --unchanged-group-format='' \ + --old-group-format='-------- %dn line%(n=1?:s) deleted at %df: + %<' \ + --new-group-format='-------- %dN line%(N=1?:s) added after %de: + %>' \ + --changed-group-format='-------- %dn line%(n=1?:s) changed at %df: + %<-------- to: + %>' \ + old new + + To specify a line group format, use `diff' with one of the options +listed below. You can specify up to four line group formats, one for +each kind of line group. You should quote FORMAT, because it typically +contains shell metacharacters. + +`--old-group-format=FORMAT' + These line groups are hunks containing only lines from the first + file. The default old group format is the same as the changed + group format if it is specified; otherwise it is a format that + outputs the line group as-is. + +`--new-group-format=FORMAT' + These line groups are hunks containing only lines from the second + file. The default new group format is same as the changed group + format if it is specified; otherwise it is a format that outputs + the line group as-is. + +`--changed-group-format=FORMAT' + These line groups are hunks containing lines from both files. The + default changed group format is the concatenation of the old and + new group formats. + +`--unchanged-group-format=FORMAT' + These line groups contain lines common to both files. The default + unchanged group format is a format that outputs the line group + as-is. + + In a line group format, ordinary characters represent themselves; +conversion specifications start with `%' and have one of the following +forms. + +`%<' + stands for the lines from the first file, including the trailing + newline. Each line is formatted according to the old line format + (*note Line Formats::). + +`%>' + stands for the lines from the second file, including the trailing + newline. Each line is formatted according to the new line format. + +`%=' + stands for the lines common to both files, including the trailing + newline. Each line is formatted according to the unchanged line + format. + +`%%' + stands for `%'. + +`%c'C'' + where C is a single character, stands for C. C may not be a + backslash or an apostrophe. For example, `%c':'' stands for a + colon, even inside the then-part of an if-then-else format, which + a colon would normally terminate. + +`%c'\O'' + where O is a string of 1, 2, or 3 octal digits, stands for the + character with octal code O. For example, `%c'\0'' stands for a + null character. + +`FN' + where F is a `printf' conversion specification and N is one of the + following letters, stands for N's value formatted with F. + + `e' + The line number of the line just before the group in the old + file. + + `f' + The line number of the first line in the group in the old + file; equals E + 1. + + `l' + The line number of the last line in the group in the old file. + + `m' + The line number of the line just after the group in the old + file; equals L + 1. + + `n' + The number of lines in the group in the old file; equals L - + F + 1. + + `E, F, L, M, N' + Likewise, for lines in the new file. + + The `printf' conversion specification can be `%d', `%o', `%x', or + `%X', specifying decimal, octal, lower case hexadecimal, or upper + case hexadecimal output respectively. After the `%' the following + options can appear in sequence: a series of zero or more flags; an + integer specifying the minimum field width; and a period followed + by an optional integer specifying the minimum number of digits. + The flags are `-' for left-justification, `'' for separating the + digit into groups as specified by the `LC_NUMERIC' locale category, + and `0' for padding with zeros instead of spaces. For example, + `%5dN' prints the number of new lines in the group in a field of + width 5 characters, using the `printf' format `"%5d"'. + +`(A=B?T:E)' + If A equals B then T else E. A and B are each either a decimal + constant or a single letter interpreted as above. This format + spec is equivalent to T if A's value equals B's; otherwise it is + equivalent to E. + + For example, `%(N=0?no:%dN) line%(N=1?:s)' is equivalent to `no + lines' if N (the number of lines in the group in the the new file) + is 0, to `1 line' if N is 1, and to `%dN lines' otherwise. + + +File: diff.info, Node: Line Formats, Next: Detailed If-then-else, Prev: Line Group Formats, Up: If-then-else + +Line Formats +------------ + + Line formats control how each line taken from an input file is +output as part of a line group in if-then-else format. + + For example, the following command outputs text with a one-character +change indicator to the left of the text. The first character of output +is `-' for deleted lines, `|' for added lines, and a space for +unchanged lines. The formats contain newline characters where newlines +are desired on output. + + diff \ + --old-line-format='-%l + ' \ + --new-line-format='|%l + ' \ + --unchanged-line-format=' %l + ' \ + old new + + To specify a line format, use one of the following options. You +should quote FORMAT, since it often contains shell metacharacters. + +`--old-line-format=FORMAT' + formats lines just from the first file. + +`--new-line-format=FORMAT' + formats lines just from the second file. + +`--unchanged-line-format=FORMAT' + formats lines common to both files. + +`--line-format=FORMAT' + formats all lines; in effect, it sets all three above options + simultaneously. + + In a line format, ordinary characters represent themselves; +conversion specifications start with `%' and have one of the following +forms. + +`%l' + stands for the contents of the line, not counting its trailing + newline (if any). This format ignores whether the line is + incomplete; *Note Incomplete Lines::. + +`%L' + stands for the contents of the line, including its trailing newline + (if any). If a line is incomplete, this format preserves its + incompleteness. + +`%%' + stands for `%'. + +`%c'C'' + where C is a single character, stands for C. C may not be a + backslash or an apostrophe. For example, `%c':'' stands for a + colon. + +`%c'\O'' + where O is a string of 1, 2, or 3 octal digits, stands for the + character with octal code O. For example, `%c'\0'' stands for a + null character. + +`Fn' + where F is a `printf' conversion specification, stands for the + line number formatted with F. For example, `%.5dn' prints the + line number using the `printf' format `"%.5d"'. *Note Line Group + Formats::, for more about printf conversion specifications. + + The default line format is `%l' followed by a newline character. + + If the input contains tab characters and it is important that they +line up on output, you should ensure that `%l' or `%L' in a line format +is just after a tab stop (e.g. by preceding `%l' or `%L' with a tab +character), or you should use the `-t' or `--expand-tabs' option. + + Taken together, the line and line group formats let you specify many +different formats. For example, the following command uses a format +similar to normal `diff' format. You can tailor this command to get +fine control over `diff' output. + + diff \ + --old-line-format='< %l + ' \ + --new-line-format='> %l + ' \ + --old-group-format='%df%(f=l?:,%dl)d%dE + %<' \ + --new-group-format='%dea%dF%(F=L?:,%dL) + %>' \ + --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL) + %<--- + %>' \ + --unchanged-group-format='' \ + old new + + +File: diff.info, Node: Detailed If-then-else, Next: Example If-then-else, Prev: Line Formats, Up: If-then-else + +Detailed Description of If-then-else Format +------------------------------------------- + + For lines common to both files, `diff' uses the unchanged line group +format. For each hunk of differences in the merged output format, if +the hunk contains only lines from the first file, `diff' uses the old +line group format; if the hunk contains only lines from the second +file, `diff' uses the new group format; otherwise, `diff' uses the +changed group format. + + The old, new, and unchanged line formats specify the output format of +lines from the first file, lines from the second file, and lines common +to both files, respectively. + + The option `--ifdef=NAME' is equivalent to the following sequence of +options using shell syntax: + + --old-group-format='#ifndef NAME + %<#endif /* ! NAME */ + ' \ + --new-group-format='#ifdef NAME + %>#endif /* NAME */ + ' \ + --unchanged-group-format='%=' \ + --changed-group-format='#ifndef NAME + %<#else /* NAME */ + %>#endif /* NAME */ + ' + + You should carefully check the `diff' output for proper nesting. +For example, when using the `-D NAME' or `--ifdef=NAME' option, you +should check that if the differing lines contain any of the C +preprocessor directives `#ifdef', `#ifndef', `#else', `#elif', or +`#endif', they are nested properly and match. If they don't, you must +make corrections manually. It is a good idea to carefully check the +resulting code anyway to make sure that it really does what you want it +to; depending on how the input files were produced, the output might +contain duplicate or otherwise incorrect code. + + The `patch' `-D NAME' option behaves like the `diff' `-D NAME' +option, except it operates on a file and a diff to produce a merged +file; *Note patch Options::. + + +File: diff.info, Node: Example If-then-else, Prev: Detailed If-then-else, Up: If-then-else + +An Example of If-then-else Format +--------------------------------- + + Here is the output of `diff -DTWO lao tzu' (*note Sample diff +Input::, for the complete contents of the two files): + + #ifndef TWO + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + #endif /* ! TWO */ + The Nameless is the origin of Heaven and Earth; + #ifndef TWO + The Named is the mother of all things. + #else /* TWO */ + The named is the mother of all things. + + #endif /* TWO */ + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + so we may see their outcome. + The two are the same, + But after they are produced, + they have different names. + #ifdef TWO + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + #endif /* TWO */ + + +File: diff.info, Node: Incomplete Lines, Next: Comparing Directories, Prev: Output Formats, Up: Top + +Incomplete Lines +**************** + + When an input file ends in a non-newline character, its last line is +called an "incomplete line" because its last character is not a +newline. All other lines are called "full lines" and end in a newline +character. Incomplete lines do not match full lines unless differences +in white space are ignored (*note White Space::). + + An incomplete line is normally distinguished on output from a full +line by a following line that starts with `\'. However, the RCS format +(*note RCS::) outputs the incomplete line as-is, without any trailing +newline or following line. The side by side format normally represents +incomplete lines as-is, but in some cases uses a `\' or `/' gutter +marker; *Note Side by Side::. The if-then-else line format preserves a +line's incompleteness with `%L', and discards the newline with `%l'; +*Note Line Formats::. Finally, with the `ed' and forward `ed' output +formats (*note Output Formats::) `diff' cannot represent an incomplete +line, so it pretends there was a newline and reports an error. + + For example, suppose `F' and `G' are one-byte files that contain +just `f' and `g', respectively. Then `diff F G' outputs + + 1c1 + < f + \ No newline at end of file + --- + > g + \ No newline at end of file + +(The exact message may differ in non-English locales.) `diff -n F G' +outputs the following without a trailing newline: + + d1 1 + a1 1 + g + +`diff -e F G' reports two errors and outputs the following: + + 1c + g + . + + +File: diff.info, Node: Comparing Directories, Next: Adjusting Output, Prev: Incomplete Lines, Up: Top + +Comparing Directories +********************* + + You can use `diff' to compare some or all of the files in two +directory trees. When both file name arguments to `diff' are +directories, it compares each file that is contained in both +directories, examining file names in alphabetical order as specified by +the `LC_COLLATE' locale category. Normally `diff' is silent about +pairs of files that contain no differences, but if you use the `-s' or +`--report-identical-files' option, it reports pairs of identical files. +Normally `diff' reports subdirectories common to both directories +without comparing subdirectories' files, but if you use the `-r' or +`--recursive' option, it compares every corresponding pair of files in +the directory trees, as many levels deep as they go. + + For file names that are in only one of the directories, `diff' +normally does not show the contents of the file that exists; it reports +only that the file exists in that directory and not in the other. You +can make `diff' act as though the file existed but was empty in the +other directory, so that it outputs the entire contents of the file that +actually exists. (It is output as either an insertion or a deletion, +depending on whether it is in the first or the second directory given.) +To do this, use the `-N' or `--new-file' option. + + If the older directory contains one or more large files that are not +in the newer directory, you can make the patch smaller by using the +`--unidirectional-new-file' option instead of `-N'. This option is +like `-N' except that it only inserts the contents of files that appear +in the second directory but not the first (that is, files that were +added). At the top of the patch, write instructions for the user +applying the patch to remove the files that were deleted before +applying the patch. *Note Making Patches::, for more discussion of +making patches for distribution. + + To ignore some files while comparing directories, use the `-x +PATTERN' or `--exclude=PATTERN' option. This option ignores any files +or subdirectories whose base names match the shell pattern PATTERN. +Unlike in the shell, a period at the start of the base of a file name +matches a wildcard at the start of a pattern. You should enclose +PATTERN in quotes so that the shell does not expand it. For example, +the option `-x '*.[ao]'' ignores any file whose name ends with `.a' or +`.o'. + + This option accumulates if you specify it more than once. For +example, using the options `-x 'RCS' -x '*,v'' ignores any file or +subdirectory whose base name is `RCS' or ends with `,v'. + + If you need to give this option many times, you can instead put the +patterns in a file, one pattern per line, and use the `-X FILE' or +`--exclude-from=FILE' option. + + If you have been comparing two directories and stopped partway +through, later you might want to continue where you left off. You can +do this by using the `-S FILE' or `--starting-file=FILE' option. This +compares only the file FILE and all alphabetically later files in the +topmost directory level. + + If two directories differ only in that file names are lower case in +one directory and upper case in the upper, `diff' normally reports many +differences because it compares file names in a case sensitive way. +With the `--ignore-file-name-case' option, `diff' ignores case +differences in file names, so that for example the contents of the file +`Tao' in one directory are compared to the contents of the file `TAO' +in the other. The `--no-ignore-file-name-case' option cancels the +effect of the `--ignore-file-name-case' option, reverting to the default +behavior. + + If an `-x PATTERN', `--exclude=PATTERN', `-X FILE', or +`--exclude-from=FILE' option is specified while the +`--ignore-file-name-case' option is in effect, case is ignored when +excluding file names matching the specified patterns. + + +File: diff.info, Node: Adjusting Output, Next: diff Performance, Prev: Comparing Directories, Up: Top + +Making `diff' Output Prettier +***************************** + + `diff' provides several ways to adjust the appearance of its output. +These adjustments can be applied to any output format. + +* Menu: + +* Tabs:: Preserving the alignment of tab stops. +* Pagination:: Page numbering and time-stamping `diff' output. + + +File: diff.info, Node: Tabs, Next: Pagination, Up: Adjusting Output + +Preserving Tab Stop Alignment +============================= + + The lines of text in some of the `diff' output formats are preceded +by one or two characters that indicate whether the text is inserted, +deleted, or changed. The addition of those characters can cause tabs to +move to the next tab stop, throwing off the alignment of columns in the +line. GNU `diff' provides two ways to make tab-aligned columns line up +correctly. + + The first way is to have `diff' convert all tabs into the correct +number of spaces before outputting them; select this method with the +`-t' or `--expand-tabs' option. `diff' assumes that tab stops are set +every 8 print columns. To use this form of output with `patch', you +must give `patch' the `-l' or `--ignore-white-space' option (*note +Changed White Space::, for more information). + + The other method for making tabs line up correctly is to add a tab +character instead of a space after the indicator character at the +beginning of the line. This ensures that all following tab characters +are in the same position relative to tab stops that they were in the +original files, so that the output is aligned correctly. Its +disadvantage is that it can make long lines too long to fit on one line +of the screen or the paper. It also does not work with the unified +output format, which does not have a space character after the change +type indicator character. Select this method with the `-T' or +`--initial-tab' option. + + +File: diff.info, Node: Pagination, Prev: Tabs, Up: Adjusting Output + +Paginating `diff' Output +======================== + + It can be convenient to have long output page-numbered and +time-stamped. The `-l' and `--paginate' options do this by sending the +`diff' output through the `pr' program. Here is what the page header +might look like for `diff -lc lao tzu': + + 2002-02-22 14:20 diff -lc lao tzu Page 1 + + +File: diff.info, Node: diff Performance, Next: Comparing Three Files, Prev: Adjusting Output, Up: Top + +`diff' Performance Tradeoffs +**************************** + + GNU `diff' runs quite efficiently; however, in some circumstances +you can cause it to run faster or produce a more compact set of changes. + + One way to improve `diff' performance is to use hard or symbolic +links to files instead of copies. This improves performance because +`diff' normally does not need to read two hard or symbolic links to the +same file, since their contents must be identical. For example, +suppose you copy a large directory hierarchy, make a few changes to the +copy, and then often use `diff -r' to compare the original to the copy. +If the original files are read-only, you can greatly improve +performance by creating the copy using hard or symbolic links (e.g., +with GNU `cp -lR' or `cp -sR'). Before editing a file in the copy for +the first time, you should break the link and replace it with a regular +copy. + + You can also affect the performance of GNU `diff' by giving it +options that change the way it compares files. Performance has more +than one dimension. These options improve one aspect of performance at +the cost of another, or they improve performance in some cases while +hurting it in others. + + The way that GNU `diff' determines which lines have changed always +comes up with a near-minimal set of differences. Usually it is good +enough for practical purposes. If the `diff' output is large, you +might want `diff' to use a modified algorithm that sometimes produces a +smaller set of differences. The `-d' or `--minimal' option does this; +however, it can also cause `diff' to run more slowly than usual, so it +is not the default behavior. + + When the files you are comparing are large and have small groups of +changes scattered throughout them, you can use the +`--speed-large-files' option to make a different modification to the +algorithm that `diff' uses. If the input files have a constant small +density of changes, this option speeds up the comparisons without +changing the output. If not, `diff' might produce a larger set of +differences; however, the output will still be correct. + + Normally `diff' discards the prefix and suffix that is common to +both files before it attempts to find a minimal set of differences. +This makes `diff' run faster, but occasionally it may produce +non-minimal output. The `--horizon-lines=LINES' option prevents `diff' +from discarding the last LINES lines of the prefix and the first LINES +lines of the suffix. This gives `diff' further opportunities to find a +minimal output. + + Suppose a run of changed lines includes a sequence of lines at one +end and there is an identical sequence of lines just outside the other +end. The `diff' command is free to choose which identical sequence is +included in the hunk. In this case, `diff' normally shifts the hunk's +boundaries when this merges adjacent hunks, or shifts a hunk's lines +towards the end of the file. Merging hunks can make the output look +nicer in some cases. + + +File: diff.info, Node: Comparing Three Files, Next: diff3 Merging, Prev: diff Performance, Up: Top + +Comparing Three Files +********************* + + Use the program `diff3' to compare three files and show any +differences among them. (`diff3' can also merge files; see *Note diff3 +Merging::). + + The "normal" `diff3' output format shows each hunk of differences +without surrounding context. Hunks are labeled depending on whether +they are two-way or three-way, and lines are annotated by their +location in the input files. + + *Note Invoking diff3::, for more information on how to run `diff3'. + +* Menu: + +* Sample diff3 Input:: Sample `diff3' input for examples. +* Detailed diff3 Normal:: A detailed description of normal output format. +* diff3 Hunks:: The format of normal output format. +* Example diff3 Normal:: Sample output in the normal format. + + +File: diff.info, Node: Sample diff3 Input, Next: Detailed diff3 Normal, Up: Comparing Three Files + +A Third Sample Input File +========================= + + Here is a third sample file that will be used in examples to +illustrate the output of `diff3' and how various options can change it. +The first two files are the same that we used for `diff' (*note Sample +diff Input::). This is the third sample file, called `tao': + + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; + The named is the mother of all things. + + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + so we may see their result. + The two are the same, + But after they are produced, + they have different names. + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + + +File: diff.info, Node: Detailed diff3 Normal, Next: diff3 Hunks, Prev: Sample diff3 Input, Up: Comparing Three Files + +Detailed Description of `diff3' Normal Format +============================================= + + Each hunk begins with a line marked `===='. Three-way hunks have +plain `====' lines, and two-way hunks have `1', `2', or `3' appended to +specify which of the three input files differ in that hunk. The hunks +contain copies of two or three sets of input lines each preceded by one +or two commands identifying where the lines came from. + + Normally, two spaces precede each copy of an input line to +distinguish it from the commands. But with the `-T' or `--initial-tab' +option, `diff3' uses a tab instead of two spaces; this lines up tabs +correctly. *Note Tabs::, for more information. + + Commands take the following forms: + +`FILE:La' + This hunk appears after line L of file FILE, and contains no lines + in that file. To edit this file to yield the other files, one + must append hunk lines taken from the other files. For example, + `1:11a' means that the hunk follows line 11 in the first file and + contains no lines from that file. + +`FILE:Rc' + This hunk contains the lines in the range R of file FILE. The + range R is a comma-separated pair of line numbers, or just one + number if the range is a singleton. To edit this file to yield the + other files, one must change the specified lines to be the lines + taken from the other files. For example, `2:11,13c' means that + the hunk contains lines 11 through 13 from the second file. + + If the last line in a set of input lines is incomplete (*note +Incomplete Lines::), it is distinguished on output from a full line by +a following line that starts with `\'. + + +File: diff.info, Node: diff3 Hunks, Next: Example diff3 Normal, Prev: Detailed diff3 Normal, Up: Comparing Three Files + +`diff3' Hunks +============= + + Groups of lines that differ in two or three of the input files are +called "diff3 hunks", by analogy with `diff' hunks (*note Hunks::). If +all three input files differ in a `diff3' hunk, the hunk is called a +"three-way hunk"; if just two input files differ, it is a "two-way +hunk". + + As with `diff', several solutions are possible. When comparing the +files `A', `B', and `C', `diff3' normally finds `diff3' hunks by +merging the two-way hunks output by the two commands `diff A B' and +`diff A C'. This does not necessarily minimize the size of the output, +but exceptions should be rare. + + For example, suppose `F' contains the three lines `a', `b', `f', `G' +contains the lines `g', `b', `g', and `H' contains the lines `a', `b', +`h'. `diff3 F G H' might output the following: + + ====2 + 1:1c + 3:1c + a + 2:1c + g + ==== + 1:3c + f + 2:3c + g + 3:3c + h + +because it found a two-way hunk containing `a' in the first and third +files and `g' in the second file, then the single line `b' common to +all three files, then a three-way hunk containing the last line of each +file. + + +File: diff.info, Node: Example diff3 Normal, Prev: diff3 Hunks, Up: Comparing Three Files + +An Example of `diff3' Normal Format +=================================== + + Here is the output of the command `diff3 lao tzu tao' (*note Sample +diff3 Input::, for the complete contents of the files). Notice that it +shows only the lines that are different among the three files. + + ====2 + 1:1,2c + 3:1,2c + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + 2:0a + ====1 + 1:4c + The Named is the mother of all things. + 2:2,3c + 3:4,5c + The named is the mother of all things. + + ====3 + 1:8c + 2:7c + so we may see their outcome. + 3:9c + so we may see their result. + ==== + 1:11a + 2:11,13c + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + 3:13,14c + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + + +File: diff.info, Node: diff3 Merging, Next: Interactive Merging, Prev: Comparing Three Files, Up: Top + +Merging From a Common Ancestor +****************************** + + When two people have made changes to copies of the same file, +`diff3' can produce a merged output that contains both sets of changes +together with warnings about conflicts. + + One might imagine programs with names like `diff4' and `diff5' to +compare more than three files simultaneously, but in practice the need +rarely arises. You can use `diff3' to merge three or more sets of +changes to a file by merging two change sets at a time. + + `diff3' can incorporate changes from two modified versions into a +common preceding version. This lets you merge the sets of changes +represented by the two newer files. Specify the common ancestor version +as the second argument and the two newer versions as the first and third +arguments, like this: + + diff3 MINE OLDER YOURS + +You can remember the order of the arguments by noting that they are in +alphabetical order. + + You can think of this as subtracting OLDER from YOURS and adding the +result to MINE, or as merging into MINE the changes that would turn +OLDER into YOURS. This merging is well-defined as long as MINE and +OLDER match in the neighborhood of each such change. This fails to be +true when all three input files differ or when only OLDER differs; we +call this a "conflict". When all three input files differ, we call the +conflict an "overlap". + + `diff3' gives you several ways to handle overlaps and conflicts. +You can omit overlaps or conflicts, or select only overlaps, or mark +conflicts with special `<<<<<<<' and `>>>>>>>' lines. + + `diff3' can output the merge results as an `ed' script that that can +be applied to the first file to yield the merged output. However, it +is usually better to have `diff3' generate the merged output directly; +this bypasses some problems with `ed'. + +* Menu: + +* Which Changes:: Selecting changes to incorporate. +* Marking Conflicts:: Marking conflicts. +* Bypassing ed:: Generating merged output directly. +* Merging Incomplete Lines:: How `diff3' merges incomplete lines. +* Saving the Changed File:: Emulating System V behavior. + + +File: diff.info, Node: Which Changes, Next: Marking Conflicts, Up: diff3 Merging + +Selecting Which Changes to Incorporate +====================================== + + You can select all unmerged changes from OLDER to YOURS for merging +into MINE with the `-e' or `--ed' option. You can select only the +nonoverlapping unmerged changes with `-3' or `--easy-only', and you can +select only the overlapping changes with `-x' or `--overlap-only'. + + The `-e', `-3' and `-x' options select only "unmerged changes", i.e. +changes where MINE and YOURS differ; they ignore changes from OLDER to +YOURS where MINE and YOURS are identical, because they assume that such +changes have already been merged. If this assumption is not a safe +one, you can use the `-A' or `--show-all' option (*note Marking +Conflicts::). + + Here is the output of the command `diff3' with each of these three +options (*note Sample diff3 Input::, for the complete contents of the +files). Notice that `-e' outputs the union of the disjoint sets of +changes output by `-3' and `-x'. + + Output of `diff3 -e lao tzu tao': + 11a + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + . + 8c + so we may see their result. + . + + Output of `diff3 -3 lao tzu tao': + 8c + so we may see their result. + . + + Output of `diff3 -x lao tzu tao': + 11a + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + . + + +File: diff.info, Node: Marking Conflicts, Next: Bypassing ed, Prev: Which Changes, Up: diff3 Merging + +Marking Conflicts +================= + + `diff3' can mark conflicts in the merged output by bracketing them +with special marker lines. A conflict that comes from two files A and +B is marked as follows: + + <<<<<<< A + lines from A + ======= + lines from B + >>>>>>> B + + A conflict that comes from three files A, B and C is marked as +follows: + + <<<<<<< A + lines from A + ||||||| B + lines from B + ======= + lines from C + >>>>>>> C + + The `-A' or `--show-all' option acts like the `-e' option, except +that it brackets conflicts, and it outputs all changes from OLDER to +YOURS, not just the unmerged changes. Thus, given the sample input +files (*note Sample diff3 Input::), `diff3 -A lao tzu tao' puts +brackets around the conflict where only `tzu' differs: + + <<<<<<< tzu + ======= + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + >>>>>>> tao + + And it outputs the three-way conflict as follows: + + <<<<<<< lao + ||||||| tzu + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + ======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + >>>>>>> tao + + The `-E' or `--show-overlap' option outputs less information than +the `-A' or `--show-all' option, because it outputs only unmerged +changes, and it never outputs the contents of the second file. Thus +the `-E' option acts like the `-e' option, except that it brackets the +first and third files from three-way overlapping changes. Similarly, +`-X' acts like `-x', except it brackets all its (necessarily +overlapping) changes. For example, for the three-way overlapping +change above, the `-E' and `-X' options output the following: + + <<<<<<< lao + ======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + >>>>>>> tao + + If you are comparing files that have meaningless or uninformative +names, you can use the `-L LABEL' or `--label=LABEL' option to show +alternate names in the `<<<<<<<', `|||||||' and `>>>>>>>' brackets. +This option can be given up to three times, once for each input file. +Thus `diff3 -A -L X -L Y -L Z A B C' acts like `diff3 -A A B C', except +that the output looks like it came from files named `X', `Y' and `Z' +rather than from files named `A', `B' and `C'. + + +File: diff.info, Node: Bypassing ed, Next: Merging Incomplete Lines, Prev: Marking Conflicts, Up: diff3 Merging + +Generating the Merged Output Directly +===================================== + + With the `-m' or `--merge' option, `diff3' outputs the merged file +directly. This is more efficient than using `ed' to generate it, and +works even with non-text files that `ed' would reject. If you specify +`-m' without an `ed' script option, `-A' (`--show-all') is assumed. + + For example, the command `diff3 -m lao tzu tao' (*note Sample diff3 +Input:: for a copy of the input files) would output the following: + + <<<<<<< tzu + ======= + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. + >>>>>>> tao + The Nameless is the origin of Heaven and Earth; + The Named is the mother of all things. + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, + so we may see their result. + The two are the same, + But after they are produced, + they have different names. + <<<<<<< lao + ||||||| tzu + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! + ======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan + >>>>>>> tao + + +File: diff.info, Node: Merging Incomplete Lines, Next: Saving the Changed File, Prev: Bypassing ed, Up: diff3 Merging + +How `diff3' Merges Incomplete Lines +=================================== + + With `-m', incomplete lines (*note Incomplete Lines::) are simply +copied to the output as they are found; if the merged output ends in an +conflict and one of the input files ends in an incomplete line, +succeeding `|||||||', `=======' or `>>>>>>>' brackets appear somewhere +other than the start of a line because they are appended to the +incomplete line. + + Without `-m', if an `ed' script option is specified and an +incomplete line is found, `diff3' generates a warning and acts as if a +newline had been present. + + +File: diff.info, Node: Saving the Changed File, Prev: Merging Incomplete Lines, Up: diff3 Merging + +Saving the Changed File +======================= + + Traditional Unix `diff3' generates an `ed' script without the +trailing `w' and `q' commands that save the changes. System V `diff3' +generates these extra commands. GNU `diff3' normally behaves like +traditional Unix `diff3', but with the `-i' option it behaves like +System V `diff3' and appends the `w' and `q' commands. + + The `-i' option requires one of the `ed' script options `-AeExX3', +and is incompatible with the merged output option `-m'. + + +File: diff.info, Node: Interactive Merging, Next: Merging with patch, Prev: diff3 Merging, Up: Top + +Interactive Merging with `sdiff' +******************************** + + With `sdiff', you can merge two files interactively based on a +side-by-side `-y' format comparison (*note Side by Side::). Use `-o +FILE' or `--output=FILE' to specify where to put the merged text. +*Note Invoking sdiff::, for more details on the options to `sdiff'. + + Another way to merge files interactively is to use the Emacs Lisp +package `emerge'. *Note emerge: (emacs)emerge, for more information. + +* Menu: + +* sdiff Option Summary:: Summary of `sdiff' options. +* Merge Commands:: Merging two files interactively. + + +File: diff.info, Node: sdiff Option Summary, Next: Merge Commands, Up: Interactive Merging + +Specifying `diff' Options to `sdiff' +==================================== + + The following `sdiff' options have the same meaning as for `diff'. +*Note diff Options::, for the use of these options. + + -a -b -d -i -t -v + -B -E -I REGEXP + + --ignore-blank-lines --ignore-case + --ignore-matching-lines=REGEXP --ignore-space-change + --ignore-tab-expansion + --left-column --minimal --speed-large-files + --strip-trailing-cr --suppress-common-lines --expand-tabs + --text --version --width=COLUMNS + + For historical reasons, `sdiff' has alternate names for some +options. The `-l' option is equivalent to the `--left-column' option, +and similarly `-s' is equivalent to `--suppress-common-lines'. The +meaning of the `sdiff' `-w' and `-W' options is interchanged from that +of `diff': with `sdiff', `-w COLUMNS' is equivalent to +`--width=COLUMNS', and `-W' is equivalent to `--ignore-all-space'. +`sdiff' without the `-o' option is equivalent to `diff' with the `-y' +or `--side-by-side' option (*note Side by Side::). + + +File: diff.info, Node: Merge Commands, Prev: sdiff Option Summary, Up: Interactive Merging + +Merge Commands +============== + + Groups of common lines, with a blank gutter, are copied from the +first file to the output. After each group of differing lines, `sdiff' +prompts with `%' and pauses, waiting for one of the following commands. +Follow each command with <RET>. + +`e' + Discard both versions. Invoke a text editor on an empty temporary + file, then copy the resulting file to the output. + +`eb' + Concatenate the two versions, edit the result in a temporary file, + then copy the edited result to the output. + +`ed' + Like `eb', except precede each version with a header that shows + what file and lines the version came from. + +`el' + Edit a copy of the left version, then copy the result to the + output. + +`er' + Edit a copy of the right version, then copy the result to the + output. + +`l' + Copy the left version to the output. + +`q' + Quit. + +`r' + Copy the right version to the output. + +`s' + Silently copy common lines. + +`v' + Verbosely copy common lines. This is the default. + + The text editor invoked is specified by the `EDITOR' environment +variable if it is set. The default is system-dependent. + + +File: diff.info, Node: Merging with patch, Next: Making Patches, Prev: Interactive Merging, Up: Top + +Merging with `patch' +******************** + + `patch' takes comparison output produced by `diff' and applies the +differences to a copy of the original file, producing a patched +version. With `patch', you can distribute just the changes to a set of +files instead of distributing the entire file set; your correspondents +can apply `patch' to update their copy of the files with your changes. +`patch' automatically determines the diff format, skips any leading or +trailing headers, and uses the headers to determine which file to +patch. This lets your correspondents feed a mail message containing a +difference listing directly to `patch'. + + `patch' detects and warns about common problems like forward +patches. It saves any patches that it could not apply. It can also +maintain a `patchlevel.h' file to ensure that your correspondents apply +diffs in the proper order. + + `patch' accepts a series of diffs in its standard input, usually +separated by headers that specify which file to patch. It applies +`diff' hunks (*note Hunks::) one by one. If a hunk does not exactly +match the original file, `patch' uses heuristics to try to patch the +file as well as it can. If no approximate match can be found, `patch' +rejects the hunk and skips to the next hunk. `patch' normally replaces +each file F with its new version, putting reject hunks (if any) into +`F.rej'. + + *Note Invoking patch::, for detailed information on the options to +`patch'. + +* Menu: + +* patch Input:: Selecting the type of `patch' input. +* Revision Control:: Getting files from RCS, SCCS, etc. +* Imperfect:: Dealing with imperfect patches. +* Creating and Removing:: Creating and removing files with a patch. +* Patching Time Stamps:: Updating time stamps on patched files. +* Multiple Patches:: Handling multiple patches in a file. +* patch Directories:: Changing directory and stripping directories. +* Backups:: Whether backup files are made. +* Backup Names:: Backup file names. +* Reject Names:: Reject file names. +* patch Messages:: Messages and questions `patch' can produce. +* patch and POSIX:: Conformance to the POSIX standard. +* patch and Tradition:: GNU versus traditional `patch'. + + +File: diff.info, Node: patch Input, Next: Revision Control, Up: Merging with patch + +Selecting the `patch' Input Format +================================== + + `patch' normally determines which `diff' format the patch file uses +by examining its contents. For patch files that contain particularly +confusing leading text, you might need to use one of the following +options to force `patch' to interpret the patch file as a certain +format of diff. The output formats listed here are the only ones that +`patch' can understand. + +`-c' +`--context' + context diff. + +`-e' +`--ed' + `ed' script. + +`-n' +`--normal' + normal diff. + +`-u' +`--unified' + unified diff. + + +File: diff.info, Node: Revision Control, Next: Imperfect, Prev: patch Input, Up: Merging with patch + +Revision Control +================ + + If a nonexistent input file is under a revision control system +supported by `patch', `patch' normally asks the user whether to get (or +check out) the file from the revision control system. Patch currently +supports RCS, ClearCase and SCCS. Under RCS and SCCS, `patch' also +asks when the input file is read-only and matches the default version +in the revision control system. + + The `-g NUM' or `--get=NUM' affects access to files under supported +revision control systems. If NUM is positive, `patch' gets the file +without asking the user; if zero, `patch' neither asks the user nor +gets the file; and if negative, `patch' asks the user before getting +the file. The default value of NUM is given by the value of the +`PATCH_GET' environment variable if it is set; if not, the default +value is zero if `patch' is conforming to POSIX, negative otherwise. +*Note patch and POSIX::. + + The choice of revision control system is unaffected by the +`VERSION_CONTROL' environment variable (*note Backup Names::). + + +File: diff.info, Node: Imperfect, Next: Creating and Removing, Prev: Revision Control, Up: Merging with patch + +Applying Imperfect Patches +========================== + + `patch' tries to skip any leading text in the patch file, apply the +diff, and then skip any trailing text. Thus you can feed a mail +message directly to `patch', and it should work. If the entire diff is +indented by a constant amount of white space, `patch' automatically +ignores the indentation. If a context diff contains trailing carriage +return on each line, `patch' automatically ignores the carriage return. +If a context diff has been encapsulated by prepending `- ' to lines +beginning with `-' as per Internet RFC 934 +(ftp://ftp.isi.edu/in-notes/rfc934.txt), `patch' automatically +unencapsulates the input. + + However, certain other types of imperfect input require user +intervention or testing. + +* Menu: + +* Changed White Space:: When tabs and spaces don't match exactly. +* Reversed Patches:: Applying reversed patches correctly. +* Inexact:: Helping `patch' find close matches. +* Dry Runs:: Predicting what `patch' will do. + + +File: diff.info, Node: Changed White Space, Next: Reversed Patches, Up: Imperfect + +Applying Patches with Changed White Space +----------------------------------------- + + Sometimes mailers, editors, or other programs change spaces into +tabs, or vice versa. If this happens to a patch file or an input file, +the files might look the same, but `patch' will not be able to match +them properly. If this problem occurs, use the `-l' or +`--ignore-white-space' option, which makes `patch' compare blank +characters (i.e. spaces and tabs) loosely so that any nonempty sequence +of blanks in the patch file matches any nonempty sequence of blanks in +the input files. Non-blank characters must still match exactly. Each +line of the context must still match a line in the input file. + + +File: diff.info, Node: Reversed Patches, Next: Inexact, Prev: Changed White Space, Up: Imperfect + +Applying Reversed Patches +------------------------- + + Sometimes people run `diff' with the new file first instead of +second. This creates a diff that is "reversed". To apply such +patches, give `patch' the `-R' or `--reverse' option. `patch' then +attempts to swap each hunk around before applying it. Rejects come out +in the swapped format. + + Often `patch' can guess that the patch is reversed. If the first +hunk of a patch fails, `patch' reverses the hunk to see if it can apply +it that way. If it can, `patch' asks you if you want to have the `-R' +option set; if it can't, `patch' continues to apply the patch normally. +This method cannot detect a reversed patch if it is a normal diff and +the first command is an append (which should have been a delete) since +appends always succeed, because a null context matches anywhere. But +most patches add or change lines rather than delete them, so most +reversed normal diffs begin with a delete, which fails, and `patch' +notices. + + If you apply a patch that you have already applied, `patch' thinks +it is a reversed patch and offers to un-apply the patch. This could be +construed as a feature. If you did this inadvertently and you don't +want to un-apply the patch, just answer `n' to this offer and to the +subsequent "apply anyway" question--or type `C-c' to kill the `patch' +process. + + +File: diff.info, Node: Inexact, Next: Dry Runs, Prev: Reversed Patches, Up: Imperfect + +Helping `patch' Find Inexact Matches +------------------------------------ + + For context diffs, and to a lesser extent normal diffs, `patch' can +detect when the line numbers mentioned in the patch are incorrect, and +it attempts to find the correct place to apply each hunk of the patch. +As a first guess, it takes the line number mentioned in the hunk, plus +or minus any offset used in applying the previous hunk. If that is not +the correct place, `patch' scans both forward and backward for a set of +lines matching the context given in the hunk. + + First `patch' looks for a place where all lines of the context +match. If it cannot find such a place, and it is reading a context or +unified diff, and the maximum fuzz factor is set to 1 or more, then +`patch' makes another scan, ignoring the first and last line of +context. If that fails, and the maximum fuzz factor is set to 2 or +more, it makes another scan, ignoring the first two and last two lines +of context are ignored. It continues similarly if the maximum fuzz +factor is larger. + + The `-F LINES' or `--fuzz=LINES' option sets the maximum fuzz factor +to LINES. This option only applies to context and unified diffs; it +ignores up to LINES lines while looking for the place to install a +hunk. Note that a larger fuzz factor increases the odds of making a +faulty patch. The default fuzz factor is 2; there is no point to +setting it to more than the number of lines of context in the diff, +ordinarily 3. + + If `patch' cannot find a place to install a hunk of the patch, it +writes the hunk out to a reject file (*note Reject Names::, for +information on how reject files are named). It writes out rejected +hunks in context format no matter what form the input patch is in. If +the input is a normal or `ed' diff, many of the contexts are simply +null. The line numbers on the hunks in the reject file may be +different from those in the patch file: they show the approximate +location where `patch' thinks the failed hunks belong in the new file +rather than in the old one. + + If the `--verbose' option is given, then as it completes each hunk +`patch' tells you whether the hunk succeeded or failed, and if it +failed, on which line (in the new file) `patch' thinks the hunk should +go. If this is different from the line number specified in the diff, +it tells you the offset. A single large offset _may_ indicate that +`patch' installed a hunk in the wrong place. `patch' also tells you if +it used a fuzz factor to make the match, in which case you should also +be slightly suspicious. + + `patch' cannot tell if the line numbers are off in an `ed' script, +and can only detect wrong line numbers in a normal diff when it finds a +change or delete command. It may have the same problem with a context +diff using a fuzz factor equal to or greater than the number of lines +of context shown in the diff (typically 3). In these cases, you should +probably look at a context diff between your original and patched input +files to see if the changes make sense. Compiling without errors is a +pretty good indication that the patch worked, but not a guarantee. + + A patch against an empty file applies to a nonexistent file, and vice +versa. *Note Creating and Removing::. + + `patch' usually produces the correct results, even when it must make +many guesses. However, the results are guaranteed only when the patch +is applied to an exact copy of the file that the patch was generated +from. + + +File: diff.info, Node: Dry Runs, Prev: Inexact, Up: Imperfect + +Predicting what `patch' will do +------------------------------- + + It may not be obvious in advance what `patch' will do with a +complicated or poorly formatted patch. If you are concerned that the +input might cause `patch' to modify the wrong files, you can use the +`--dry-run' option, which causes `patch' to print the results of +applying patches without actually changing any files. You can then +inspect the diagnostics generated by the dry run to see whether `patch' +will modify the files that you expect. If the patch does not do what +you want, you can modify the patch (or the other options to `patch') +and try another dry run. Once you are satisfied with the proposed +patch you can apply it by invoking `patch' as before, but this time +without the `--dry-run' option. + + +File: diff.info, Node: Creating and Removing, Next: Patching Time Stamps, Prev: Imperfect, Up: Merging with patch + +Creating and Removing Files +=========================== + + Sometimes when comparing two directories, a file may exist in one +directory but not the other. If you give `diff' the `-N' or +`--new-file' option, or if you supply an old or new file that is named +`/dev/null' or is empty and is dated the Epoch (1970-01-01 00:00:00 +UTC), `diff' outputs a patch that adds or deletes the contents of this +file. When given such a patch, `patch' normally creates a new file or +removes the old file. However, when conforming to POSIX (*note patch +and POSIX::), `patch' does not remove the old file, but leaves it empty. +The `-E' or `--remove-empty-files' option causes `patch' to remove +output files that are empty after applying a patch, even if the patch +does not appear to be one that removed the file. + + If the patch appears to create a file that already exists, `patch' +asks for confirmation before applying the patch. + + +File: diff.info, Node: Patching Time Stamps, Next: Multiple Patches, Prev: Creating and Removing, Up: Merging with patch + +Updating Time Stamps on Patched Files +===================================== + + When `patch' updates a file, it normally sets the file's +last-modified time stamp to the current time of day. If you are using +`patch' to track a software distribution, this can cause `make' to +incorrectly conclude that a patched file is out of date. For example, +if `syntax.c' depends on `syntax.y', and `patch' updates `syntax.c' and +then `syntax.y', then `syntax.c' will normally appear to be out of date +with respect to `syntax.y' even though its contents are actually up to +date. + + The `-Z' or `--set-utc' option causes `patch' to set a patched +file's modification and access times to the time stamps given in +context diff headers. If the context diff headers do not specify a +time zone, they are assumed to use Coordinated Universal Time (UTC, +often known as GMT). + + The `-T' or `--set-time' option acts like `-Z' or `--set-utc', +except that it assumes that the context diff headers' time stamps use +local time instead of UTC. This option is not recommended, because +patches using local time cannot easily be used by people in other time +zones, and because local time stamps are ambiguous when local clocks +move backwards during daylight-saving time adjustments. If the context +diff headers specify a time zone, this option is equivalent to `-Z' or +`--set-utc'. + + `patch' normally refrains from setting a file's time stamps if the +file's original last-modified time stamp does not match the time given +in the diff header, of if the file's contents do not exactly match the +patch. However, if the `-f' or `--force' option is given, the file's +time stamps are set regardless. + + Due to the limitations of the current `diff' format, `patch' cannot +update the times of files whose contents have not changed. Also, if +you set file time stamps to values other than the current time of day, +you should also remove (e.g., with `make clean') all files that depend +on the patched files, so that later invocations of `make' do not get +confused by the patched files' times. + + +File: diff.info, Node: Multiple Patches, Next: patch Directories, Prev: Patching Time Stamps, Up: Merging with patch + +Multiple Patches in a File +========================== + + If the patch file contains more than one patch, and if you do not +specify an input file on the command line, `patch' tries to apply each +patch as if they came from separate patch files. This means that it +determines the name of the file to patch for each patch, and that it +examines the leading text before each patch for file names and +prerequisite revision level (*note Making Patches::, for more on that +topic). + + `patch' uses the following rules to intuit a file name from the +leading text before a patch. First, `patch' takes an ordered list of +candidate file names as follows: + + * If the header is that of a context diff, `patch' takes the old and + new file names in the header. A name is ignored if it does not + have enough slashes to satisfy the `-pNUM' or `--strip=NUM' + option. The name `/dev/null' is also ignored. + + * If there is an `Index:' line in the leading garbage and if either + the old and new names are both absent or if `patch' is conforming + to POSIX, `patch' takes the name in the `Index:' line. + + * For the purpose of the following rules, the candidate file names + are considered to be in the order (old, new, index), regardless of + the order that they appear in the header. + +Then `patch' selects a file name from the candidate list as follows: + + * If some of the named files exist, `patch' selects the first name + if conforming to POSIX, and the best name otherwise. + + * If `patch' is not ignoring RCS, ClearCase, and SCCS (*note + Revision Control::), and no named files exist but an RCS, + ClearCase, or SCCS master is found, `patch' selects the first + named file with an RCS, ClearCase, or SCCS master. + + * If no named files exist, no RCS, ClearCase, or SCCS master was + found, some names are given, `patch' is not conforming to POSIX, + and the patch appears to create a file, `patch' selects the best + name requiring the creation of the fewest directories. + + * If no file name results from the above heuristics, you are asked + for the name of the file to patch, and `patch' selects that name. + + To determine the "best" of a nonempty list of file names, `patch' +first takes all the names with the fewest path name components; of +those, it then takes all the names with the shortest basename; of +those, it then takes all the shortest names; finally, it takes the +first remaining name. + + *Note patch and POSIX::, to see whether `patch' is conforming to +POSIX. + + +File: diff.info, Node: patch Directories, Next: Backups, Prev: Multiple Patches, Up: Merging with patch + +Applying Patches in Other Directories +===================================== + + The `-d DIRECTORY' or `--directory=DIRECTORY' option to `patch' +makes directory DIRECTORY the current directory for interpreting both +file names in the patch file, and file names given as arguments to +other options (such as `-B' and `-o'). For example, while in a mail +reading program, you can patch a file in the `/usr/src/emacs' directory +directly from a message containing the patch like this: + + | patch -d /usr/src/emacs + + Sometimes the file names given in a patch contain leading +directories, but you keep your files in a directory different from the +one given in the patch. In those cases, you can use the `-pNUMBER' or +`--strip=NUMBER' option to set the file name strip count to NUMBER. +The strip count tells `patch' how many slashes, along with the directory +names between them, to strip from the front of file names. A sequence +of one or more adjacent slashes is counted as a single slash. By +default, `patch' strips off all leading directories, leaving just the +base file names. + + For example, suppose the file name in the patch file is +`/gnu/src/emacs/etc/NEWS'. Using `-p0' gives the entire file name +unmodified, `-p1' gives `gnu/src/emacs/etc/NEWS' (no leading slash), +`-p4' gives `etc/NEWS', and not specifying `-p' at all gives `NEWS'. + + `patch' looks for each file (after any slashes have been stripped) +in the current directory, or if you used the `-d DIRECTORY' option, in +that directory. + + +File: diff.info, Node: Backups, Next: Backup Names, Prev: patch Directories, Up: Merging with patch + +Backup Files +============ + + Normally, `patch' creates a backup file if the patch does not +exactly match the original input file, because in that case the +original data might not be recovered if you undo the patch with `patch +-R' (*note Reversed Patches::). However, when conforming to POSIX, +`patch' does not create backup files by default. *Note patch and +POSIX::. + + The `-b' or `--backup' option causes `patch' to make a backup file +regardless of whether the patch matches the original input. The +`--backup-if-mismatch' option causes `patch' to create backup files for +mismatches files; this is the default when not conforming to POSIX. The +`--no-backup-if-mismatch' option causes `patch' to not create backup +files, even for mismatched patches; this is the default when conforming +to POSIX. + + When backing up a file that does not exist, an empty, unreadable +backup file is created as a placeholder to represent the nonexistent +file. + + +File: diff.info, Node: Backup Names, Next: Reject Names, Prev: Backups, Up: Merging with patch + +Backup File Names +================= + + Normally, `patch' renames an original input file into a backup file +by appending to its name the extension `.orig', or `~' if using `.orig' +would make the backup file name too long.(1) The `-z BACKUP-SUFFIX' or +`--suffix=BACKUP-SUFFIX' option causes `patch' to use BACKUP-SUFFIX as +the backup extension instead. + + Alternately, you can specify the extension for backup files with the +`SIMPLE_BACKUP_SUFFIX' environment variable, which the options override. + + `patch' can also create numbered backup files the way GNU Emacs +does. With this method, instead of having a single backup of each file, +`patch' makes a new backup file name each time it patches a file. For +example, the backups of a file named `sink' would be called, +successively, `sink.~1~', `sink.~2~', `sink.~3~', etc. + + The `-V BACKUP-STYLE' or `--version-control=BACKUP-STYLE' option +takes as an argument a method for creating backup file names. You can +alternately control the type of backups that `patch' makes with the +`PATCH_VERSION_CONTROL' environment variable, which the `-V' option +overrides. If `PATCH_VERSION_CONTROL' is not set, the +`VERSION_CONTROL' environment variable is used instead. Please note +that these options and variables control backup file names; they do not +affect the choice of revision control system (*note Revision Control::). + + The values of these environment variables and the argument to the +`-V' option are like the GNU Emacs `version-control' variable (*note +Backup Names: (emacs)Backup Names., for more information on backup +versions in Emacs). They also recognize synonyms that are more +descriptive. The valid values are listed below; unique abbreviations +are acceptable. + +`t' +`numbered' + Always make numbered backups. + +`nil' +`existing' + Make numbered backups of files that already have them, simple + backups of the others. This is the default. + +`never' +`simple' + Always make simple backups. + + You can also tell `patch' to prepend a prefix, such as a directory +name, to produce backup file names. The `-B PREFIX' or +`--prefix=PREFIX' option makes backup files by prepending PREFIX to +them. The `-Y PREFIX' or `--basename-prefix=PREFIX' prepends PREFIX to +the last file name component of backup file names instead; for example, +`-Y ~' causes the backup name for `dir/file.c' to be `dir/~file.c'. If +you use either of these prefix options, the suffix-based options are +ignored. + + If you specify the output file with the `-o' option, that file is +the one that is backed up, not the input file. + + Options that affect the names of backup files do not affect whether +backups are made. For example, if you specify the +`--no-backup-if-mismatch' option, none of the options described in this +section have any affect, because no backups are made. + + ---------- Footnotes ---------- + + (1) A coding error in GNU `patch' version 2.5.4 causes it to always +use `~', but this should be fixed in the next release. + + +File: diff.info, Node: Reject Names, Next: patch Messages, Prev: Backup Names, Up: Merging with patch + +Reject File Names +================= + + The names for reject files (files containing patches that `patch' +could not find a place to apply) are normally the name of the output +file with `.rej' appended (or `#' if if using `.rej' would make the +backup file name too long). + + Alternatively, you can tell `patch' to place all of the rejected +patches in a single file. The `-r REJECT-FILE' or +`--reject-file=REJECT-FILE' option uses REJECT-FILE as the reject file +name. + + +File: diff.info, Node: patch Messages, Next: patch and POSIX, Prev: Reject Names, Up: Merging with patch + +Messages and Questions from `patch' +=================================== + + `patch' can produce a variety of messages, especially if it has +trouble decoding its input. In a few situations where it's not sure +how to proceed, `patch' normally prompts you for more information from +the keyboard. There are options to produce more or fewer messages, to +have it not ask for keyboard input, and to affect the way that file +names are quoted in messages. + +* Menu: + +* More or Fewer Messages:: Controlling the verbosity of `patch'. +* patch and Keyboard Input:: Inhibiting keyboard input. +* patch Quoting Style:: Quoting file names in diagnostics. + + `patch' exits with status 0 if all hunks are applied successfully, 1 +if some hunks cannot be applied, and 2 if there is more serious trouble. +When applying a set of patches in a loop, you should check the exit +status, so you don't apply a later patch to a partially patched file. + + +File: diff.info, Node: More or Fewer Messages, Next: patch and Keyboard Input, Up: patch Messages + +Controlling the Verbosity of `patch' +------------------------------------ + + You can cause `patch' to produce more messages by using the +`--verbose' option. For example, when you give this option, the +message `Hmm...' indicates that `patch' is reading text in the patch +file, attempting to determine whether there is a patch in that text, +and if so, what kind of patch it is. + + You can inhibit all terminal output from `patch', unless an error +occurs, by using the `-s', `--quiet', or `--silent' option. + + +File: diff.info, Node: patch and Keyboard Input, Next: patch Quoting Style, Prev: More or Fewer Messages, Up: patch Messages + +Inhibiting Keyboard Input +------------------------- + + There are two ways you can prevent `patch' from asking you any +questions. The `-f' or `--force' option assumes that you know what you +are doing. It causes `patch' to do the following: + + * Skip patches that do not contain file names in their headers. + + * Patch files even though they have the wrong version for the + `Prereq:' line in the patch; + + * Assume that patches are not reversed even if they look like they + are. + +The `-t' or `--batch' option is similar to `-f', in that it suppresses +questions, but it makes somewhat different assumptions: + + * Skip patches that do not contain file names in their headers (the + same as `-f'). + + * Skip patches for which the file has the wrong version for the + `Prereq:' line in the patch; + + * Assume that patches are reversed if they look like they are. + + +File: diff.info, Node: patch Quoting Style, Prev: patch and Keyboard Input, Up: patch Messages + +`patch' Quoting Style +--------------------- + + When `patch' outputs a file name in a diagnostic message, it can +format the name in any of several ways. This can be useful to output +file names unambiguously, even if they contain punctuation or special +characters like newlines. The `--quoting-style=WORD' option controls +how names are output. The WORD should be one of the following: + +`literal' + Output names as-is. + +`shell' + Quote names for the shell if they contain shell metacharacters or + would cause ambiguous output. + +`shell-always' + Quote names for the shell, even if they would normally not require + quoting. + +`c' + Quote names as for a C language string. + +`escape' + Quote as with `c' except omit the surrounding double-quote + characters. + + You can specify the default value of the `--quoting-style' option +with the environment variable `QUOTING_STYLE'. If that environment +variable is not set, the default value is `shell', but this default may +change in a future version of `patch'. + + +File: diff.info, Node: patch and POSIX, Next: patch and Tradition, Prev: patch Messages, Up: Merging with patch + +`patch' and the POSIX Standard +============================== + + If you specify the `--posix' option, or set the `POSIXLY_CORRECT' +environment variable, `patch' conforms more strictly to the POSIX +standard, as follows: + + * Take the first existing file from the list (old, new, index) when + intuiting file names from diff headers. *Note Multiple Patches::. + + * Do not remove files that are removed by a diff. *Note Creating + and Removing::. + + * Do not ask whether to get files from RCS, ClearCase, or SCCS. + *Note Revision Control::. + + * Require that all options precede the files in the command line. + + * Do not backup files, even when there is a mismatch. *Note + Backups::. + + + +File: diff.info, Node: patch and Tradition, Prev: patch and POSIX, Up: Merging with patch + +GNU `patch' and Traditional `patch' +=================================== + + The current version of GNU `patch' normally follows the POSIX +standard. *Note patch and POSIX::, for the few exceptions to this +general rule. + + Unfortunately, POSIX redefined the behavior of `patch' in several +important ways. You should be aware of the following differences if +you must interoperate with traditional `patch', or with GNU `patch' +version 2.1 and earlier. + + * In traditional `patch', the `-p' option's operand was optional, + and a bare `-p' was equivalent to `-p0'. The `-p' option now + requires an operand, and `-p 0' is now equivalent to `-p0'. For + maximum compatibility, use options like `-p0' and `-p1'. + + Also, traditional `patch' simply counted slashes when stripping + path prefixes; `patch' now counts pathname components. That is, a + sequence of one or more adjacent slashes now counts as a single + slash. For maximum portability, avoid sending patches containing + `//' in file names. + + * In traditional `patch', backups were enabled by default. This + behavior is now enabled with the `-b' or `--backup' option. + + Conversely, in POSIX `patch', backups are never made, even when + there is a mismatch. In GNU `patch', this behavior is enabled + with the `--no-backup-if-mismatch' option, or by conforming to + POSIX. + + The `-b SUFFIX' option of traditional `patch' is equivalent to the + `-b -z SUFFIX' options of GNU `patch'. + + * Traditional `patch' used a complicated (and incompletely + documented) method to intuit the name of the file to be patched + from the patch header. This method did not conform to POSIX, and + had a few gotchas. Now `patch' uses a different, equally + complicated (but better documented) method that is optionally + POSIX-conforming; we hope it has fewer gotchas. The two methods + are compatible if the file names in the context diff header and the + `Index:' line are all identical after prefix-stripping. Your + patch is normally compatible if each header's file names all + contain the same number of slashes. + + * When traditional `patch' asked the user a question, it sent the + question to standard error and looked for an answer from the first + file in the following list that was a terminal: standard error, + standard output, `/dev/tty', and standard input. Now `patch' + sends questions to standard output and gets answers from + `/dev/tty'. Defaults for some answers have been changed so that + `patch' never goes into an infinite loop when using default + answers. + + * Traditional `patch' exited with a status value that counted the + number of bad hunks, or with status 1 if there was real trouble. + Now `patch' exits with status 1 if some hunks failed, or with 2 if + there was real trouble. + + * Limit yourself to the following options when sending instructions + meant to be executed by anyone running GNU `patch', traditional + `patch', or a `patch' that conforms to POSIX. Spaces are + significant in the following list, and operands are required. + + `-c' + `-d DIR' + `-D DEFINE' + `-e' + `-l' + `-n' + `-N' + `-o OUTFILE' + `-pNUM' + `-R' + `-r REJECTFILE' + + + +File: diff.info, Node: Making Patches, Next: Invoking cmp, Prev: Merging with patch, Up: Top + +Tips for Making and Using Patches +********************************* + + Use some common sense when making and using patches. For example, +when sending bug fixes to a program's maintainer, send several small +patches, one per independent subject, instead of one large, +harder-to-digest patch that covers all the subjects. + + Here are some other things you should keep in mind if you are going +to distribute patches for updating a software package. + +* Menu: + +* Tips for Patch Producers:: Advice for making patches. +* Tips for Patch Consumers:: Advice for using patches. +* Avoiding Common Mistakes:: Avoiding common mistakes when using `patch'. +* Generating Smaller Patches:: How to generate smaller patches. + + +File: diff.info, Node: Tips for Patch Producers, Next: Tips for Patch Consumers, Up: Making Patches + +Tips for Patch Producers +======================== + + To create a patch that changes an older version of a package into a +newer version, first make a copy of the older and newer versions in +adjacent subdirectories. It is common to do that by unpacking `tar' +archives of the two versions. + + To generate the patch, use the command `diff -Naur OLD NEW' where +OLD and NEW identify the old and new directories. The names OLD and +NEW should not contain any slashes. The `-N' option lets the patch +create and remove files; `-a' lets the patch update non-text files; `-u' +generates useful time stamps and enough context; and `-r' lets the +patch update subdirectories. Here is an example command, using Bourne +shell syntax: + + diff -Naur gcc-3.0.3 gcc-3.0.4 + + Tell your recipients how to apply the patches. This should include +which working directory to use, and which `patch' options to use; the +option `-p1' is recommended. Test your procedure by pretending to be a +recipient and applying your patches to a copy of the original files. + + *Note Avoiding Common Mistakes::, for how to avoid common mistakes +when generating a patch. + + +File: diff.info, Node: Tips for Patch Consumers, Next: Avoiding Common Mistakes, Prev: Tips for Patch Producers, Up: Making Patches + +Tips for Patch Consumers +======================== + + A patch producer should tell recipients how to apply the patches, so +the first rule of thumb for a patch consumer is to follow the +instructions supplied with the patch. + + GNU `diff' can analyze files with arbitrarily long lines and files +that end in incomplete lines. However, older versions of `patch' +cannot patch such files. If you are having trouble applying such +patches, try upgrading to a recent version of GNU `patch'. + + +File: diff.info, Node: Avoiding Common Mistakes, Next: Generating Smaller Patches, Prev: Tips for Patch Consumers, Up: Making Patches + +Avoiding Common Mistakes +======================== + + When producing a patch for multiple files, apply `diff' to +directories whose names do not have slashes. This reduces confusion +when the patch consumer specifies the `-pNUMBER' option, since this +option can have surprising results when the old and new file names have +different numbers of slashes. For example, do not send a patch with a +header that looks like this: + + diff -Naur v2.0.29/prog/README prog/README + --- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800 + +++ prog/README 2002-03-17 20:49:32.442260588 -0800 + +because the two file names have different numbers of slashes, and +different versions of `patch' interpret the file names differently. To +avoid confusion, send output that looks like this instead: + + diff -Naur v2.0.29/prog/README v2.0.30/prog/README + --- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800 + +++ v2.0.30/prog/README 2002-03-17 20:49:32.442260588 -0800 + + Make sure you have specified the file names correctly, either in a +context diff header or with an `Index:' line. Take care to not send out +reversed patches, since these make people wonder whether they have +already applied the patch. + + Avoid sending patches that compare backup file names like +`README.orig' or `README~', since this might confuse `patch' into +patching a backup file instead of the real file. Instead, send patches +that compare the same base file names in different directories, e.g. +`old/README' and `new/README'. + + To save people from partially applying a patch before other patches +that should have gone before it, you can make the first patch in the +patch file update a file with a name like `patchlevel.h' or +`version.c', which contains a patch level or version number. If the +input file contains the wrong version number, `patch' will complain +immediately. + + An even clearer way to prevent this problem is to put a `Prereq:' +line before the patch. If the leading text in the patch file contains a +line that starts with `Prereq:', `patch' takes the next word from that +line (normally a version number) and checks whether the next input file +contains that word, preceded and followed by either white space or a +newline. If not, `patch' prompts you for confirmation before +proceeding. This makes it difficult to accidentally apply patches in +the wrong order. + + +File: diff.info, Node: Generating Smaller Patches, Prev: Avoiding Common Mistakes, Up: Making Patches + +Generating Smaller Patches +========================== + + The simplest way to generate a patch is to use `diff -Naur' (*note +Tips for Patch Producers::), but you might be able to reduce the size +of the patch by renaming or removing some files before making the +patch. If the older version of the package contains any files that the +newer version does not, or if any files have been renamed between the +two versions, make a list of `rm' and `mv' commands for the user to +execute in the old version directory before applying the patch. Then +run those commands yourself in the scratch directory. + + If there are any files that you don't need to include in the patch +because they can easily be rebuilt from other files (for example, +`TAGS' and output from `yacc' and `makeinfo'), exclude them from the +patch by giving `diff' the `-x PATTERN' option (*note Comparing +Directories::). If you want your patch to modify a derived file +because your recipients lack tools to build it, make sure that the +patch for the derived file follows any patches for files that it +depends on, so that the recipients' time stamps will not confuse `make'. + + Now you can create the patch using `diff -Naur'. Make sure to +specify the scratch directory first and the newer directory second. + + Add to the top of the patch a note telling the user any `rm' and +`mv' commands to run before applying the patch. Then you can remove +the scratch directory. + + You can also shrink the patch size by using fewer lines of context, +but bear in mind that `patch' typically needs at least two lines for +proper operation when patches do not exactly match the input files. + + +File: diff.info, Node: Invoking cmp, Next: Invoking diff, Prev: Making Patches, Up: Top + +Invoking `cmp' +************** + + The `cmp' command compares two files, and if they differ, tells the +first byte and line number where they differ. Bytes and lines are +numbered starting with 1. The arguments of `cmp' are as follows: + + cmp OPTIONS... FROM-FILE [TO-FILE [FROM-SKIP [TO-SKIP]]] + + The file name `-' is always the standard input. `cmp' also uses the +standard input if one file name is omitted. The FROM-SKIP and TO-SKIP +operands specify how many bytes to ignore at the start of each file; +they are equivalent to the `--ignore-initial=FROM-SKIP:TO-SKIP' option. + + An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +* Menu: + +* cmp Options:: Summary of options to `cmp'. + + +File: diff.info, Node: cmp Options, Up: Invoking cmp + +Options to `cmp' +================ + + Below is a summary of all of the options that GNU `cmp' accepts. +Most options have two equivalent names, one of which is a single letter +preceded by `-', and the other of which is a long name preceded by +`--'. Multiple single letter options (unless they take an argument) +can be combined into a single command line word: `-bl' is equivalent to +`-b -l'. + +`-b' +`--print-bytes' + Print the differing bytes. Display control bytes as a `^' + followed by a letter of the alphabet and precede bytes that have + the high bit set with `M-' (which stands for "meta"). + +`--help' + Output a summary of usage and then exit. + +`-i SKIP' +`--ignore-initial=SKIP' + Ignore any differences in the first SKIP bytes of the input files. + Treat files with fewer than SKIP bytes as if they are empty. If + SKIP is of the form `FROM-SKIP:TO-SKIP', skip the first FROM-SKIP + bytes of the first input file and the first TO-SKIP bytes of the + second. + +`-l' +`--verbose' + Print the (decimal) byte numbers and (octal) values of all + differing bytes. + +`-n COUNT' +`--bytes=COUNT' + Compare at most COUNT input bytes. + +`-s' +`--quiet' +`--silent' + Do not print anything; only return an exit status indicating + whether the files differ. + +`-v' +`--version' + Output version information and then exit. + + In the above table, operands that are byte counts are normally +decimal, but may be preceded by `0' for octal and `0x' for hexadecimal. + + A byte count can be followed by a suffix to specify a multiple of +that count; in this case an omitted integer is understood to be 1. A +bare size letter, or one followed by `iB', specifies a multiple using +powers of 1024. A size letter followed by `B' specifies powers of 1000 +instead. For example, `-n 4M' and `-n 4MiB' are equivalent to `-n +4194304', whereas `-n 4MB' is equivalent to `-n 4000000'. This +notation is upward compatible with the SI prefixes +(http://www.bipm.fr/enus/3_SI/si-prefixes.html) for decimal multiples +and with the IEC 60027-2 prefixes for binary multiples +(http://physics.nist.gov/cuu/Units/binary.html). + + The following suffixes are defined. Large sizes like `1Y' may be +rejected by your computer due to limitations of its arithmetic. + +`kB' + kilobyte: 10^3 = 1000. + +`k' +`K' +`KiB' + kibibyte: 2^10 = 1024. `K' is special: the SI prefix is `k' and + the IEC 60027-2 prefix is `Ki', but tradition and POSIX use `k' to + mean `KiB'. + +`MB' + megabyte: 10^6 = 1,000,000. + +`M' +`MiB' + mebibyte: 2^20 = 1,048,576. + +`GB' + gigabyte: 10^9 = 1,000,000,000. + +`G' +`GiB' + gibibyte: 2^30 = 1,073,741,824. + +`TB' + terabyte: 10^12 = 1,000,000,000,000. + +`T' +`TiB' + tebibyte: 2^40 = 1,099,511,627,776. + +`PB' + petabyte: 10^15 = 1,000,000,000,000,000. + +`P' +`PiB' + pebibyte: 2^50 = 1,125,899,906,842,624. + +`EB' + exabyte: 10^18 = 1,000,000,000,000,000,000. + +`E' +`EiB' + exbibyte: 2^60 = 1,152,921,504,606,846,976. + +`ZB' + zettabyte: 10^21 = 1,000,000,000,000,000,000,000 + +`Z' +`ZiB' + 2^70 = 1,180,591,620,717,411,303,424. (`Zi' is a GNU extension to + IEC 60027-2.) + +`YB' + yottabyte: 10^24 = 1,000,000,000,000,000,000,000,000. + +`Y' +`YiB' + 2^80 = 1,208,925,819,614,629,174,706,176. (`Yi' is a GNU + extension to IEC 60027-2.) + + +File: diff.info, Node: Invoking diff, Next: Invoking diff3, Prev: Invoking cmp, Up: Top + +Invoking `diff' +*************** + + The format for running the `diff' command is: + + diff OPTIONS... FILES... + + In the simplest case, two file names FROM-FILE and TO-FILE are +given, and `diff' compares the contents of FROM-FILE and TO-FILE. A +file name of `-' stands for text read from the standard input. As a +special case, `diff - -' compares a copy of standard input to itself. + + If one file is a directory and the other is not, `diff' compares the +file in the directory whose name is that of the non-directory. The +non-directory file must not be `-'. + + If two file names are given and both are directories, `diff' +compares corresponding files in both directories, in alphabetical +order; this comparison is not recursive unless the `-r' or +`--recursive' option is given. `diff' never compares the actual +contents of a directory as if it were a file. The file that is fully +specified may not be standard input, because standard input is nameless +and the notion of "file with the same name" does not apply. + + If the `--from-file=FILE' option is given, the number of file names +is arbitrary, and FILE is compared to each named file. Similarly, if +the `--to-file=FILE' option is given, each named file is compared to +FILE. + + `diff' options begin with `-', so normally file names may not begin +with `-'. However, `--' as an argument by itself treats the remaining +arguments as file names even if they begin with `-'. + + An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +* Menu: + +* diff Options:: Summary of options to `diff'. + + +File: diff.info, Node: diff Options, Up: Invoking diff + +Options to `diff' +================= + + Below is a summary of all of the options that GNU `diff' accepts. +Most options have two equivalent names, one of which is a single letter +preceded by `-', and the other of which is a long name preceded by +`--'. Multiple single letter options (unless they take an argument) +can be combined into a single command line word: `-ac' is equivalent to +`-a -c'. Long named options can be abbreviated to any unique prefix of +their name. Brackets ([ and ]) indicate that an option takes an +optional argument. + +`-a' +`--text' + Treat all files as text and compare them line-by-line, even if they + do not seem to be text. *Note Binary::. + +`-b' +`--ignore-space-change' + Ignore changes in amount of white space. *Note White Space::. + +`-B' +`--ignore-blank-lines' + Ignore changes that just insert or delete blank lines. *Note + Blank Lines::. + +`--binary' + Read and write data in binary mode. *Note Binary::. + +`-c' + Use the context output format, showing three lines of context. + *Note Context Format::. + +`-C LINES' +`--context[=LINES]' + Use the context output format, showing LINES (an integer) lines of + context, or three if LINES is not given. *Note Context Format::. + For proper operation, `patch' typically needs at least two lines of + context. + + On older systems, `diff' supports an obsolete option `-LINES' that + has effect when combined with `-c' or `-p'. POSIX 1003.1-2001 + (*note Standards conformance::) does not allow this; use `-C LINES' + instead. + +`--changed-group-format=FORMAT' + Use FORMAT to output a line group containing differing lines from + both files in if-then-else format. *Note Line Group Formats::. + +`-d' +`--minimal' + Change the algorithm perhaps find a smaller set of changes. This + makes `diff' slower (sometimes much slower). *Note diff + Performance::. + +`-D NAME' +`--ifdef=NAME' + Make merged `#ifdef' format output, conditional on the preprocessor + macro NAME. *Note If-then-else::. + +`-e' +`--ed' + Make output that is a valid `ed' script. *Note ed Scripts::. + +`-E' +`--ignore-tab-expansion' + Ignore changes due to tab expansion. *Note White Space::. + +`-f' +`--forward-ed' + Make output that looks vaguely like an `ed' script but has changes + in the order they appear in the file. *Note Forward ed::. + +`-F REGEXP' +`--show-function-line=REGEXP' + In context and unified format, for each hunk of differences, show + some of the last preceding line that matches REGEXP. *Note + Specified Headings::. + +`--from-file=FILE' + Compare FILE to each operand; FILE may be a directory. + +`--help' + Output a summary of usage and then exit. + +`--horizon-lines=LINES' + Do not discard the last LINES lines of the common prefix and the + first LINES lines of the common suffix. *Note diff Performance::. + +`-i' +`--ignore-case' + Ignore changes in case; consider upper- and lower-case letters + equivalent. *Note Case Folding::. + +`-I REGEXP' +`--ignore-matching-lines=REGEXP' + Ignore changes that just insert or delete lines that match REGEXP. + *Note Specified Folding::. + +`--ignore-file-name-case' + Ignore case when comparing file names during recursive comparison. + *Note Comparing Directories::. + +`-l' +`--paginate' + Pass the output through `pr' to paginate it. *Note Pagination::. + +`--label=LABEL' + Use LABEL instead of the file name in the context format (*note + Context Format::) and unified format (*note Unified Format::) + headers. *Note RCS::. + +`--left-column' + Print only the left column of two common lines in side by side + format. *Note Side by Side Format::. + +`--line-format=FORMAT' + Use FORMAT to output all input lines in if-then-else format. + *Note Line Formats::. + +`-n' +`--rcs' + Output RCS-format diffs; like `-f' except that each command + specifies the number of lines affected. *Note RCS::. + +`-N' +`--new-file' + In directory comparison, if a file is found in only one directory, + treat it as present but empty in the other directory. *Note + Comparing Directories::. + +`--new-group-format=FORMAT' + Use FORMAT to output a group of lines taken from just the second + file in if-then-else format. *Note Line Group Formats::. + +`--new-line-format=FORMAT' + Use FORMAT to output a line taken from just the second file in + if-then-else format. *Note Line Formats::. + +`--old-group-format=FORMAT' + Use FORMAT to output a group of lines taken from just the first + file in if-then-else format. *Note Line Group Formats::. + +`--old-line-format=FORMAT' + Use FORMAT to output a line taken from just the first file in + if-then-else format. *Note Line Formats::. + +`-p' +`--show-c-function' + Show which C function each change is in. *Note C Function + Headings::. + +`-q' +`--brief' + Report only whether the files differ, not the details of the + differences. *Note Brief::. + +`-r' +`--recursive' + When comparing directories, recursively compare any subdirectories + found. *Note Comparing Directories::. + +`-s' +`--report-identical-files' + Report when two files are the same. *Note Comparing Directories::. + +`-S FILE' +`--starting-file=FILE' + When comparing directories, start with the file FILE. This is + used for resuming an aborted comparison. *Note Comparing + Directories::. + +`--speed-large-files' + Use heuristics to speed handling of large files that have numerous + scattered small changes. *Note diff Performance::. + +`--strip-trailing-cr' + Strip any trailing carriage return at the end of an input line. + *Note Binary::. + +`--suppress-common-lines' + Do not print common lines in side by side format. *Note Side by + Side Format::. + +`-t' +`--expand-tabs' + Expand tabs to spaces in the output, to preserve the alignment of + tabs in the input files. *Note Tabs::. + +`-T' +`--initial-tab' + Output a tab rather than a space before the text of a line in + normal or context format. This causes the alignment of tabs in + the line to look normal. *Note Tabs::. + +`--to-file=FILE' + Compare each operand to FILE; FILE may be a directory. + +`-u' + Use the unified output format, showing three lines of context. + *Note Unified Format::. + +`--unchanged-group-format=FORMAT' + Use FORMAT to output a group of common lines taken from both files + in if-then-else format. *Note Line Group Formats::. + +`--unchanged-line-format=FORMAT' + Use FORMAT to output a line common to both files in if-then-else + format. *Note Line Formats::. + +`--unidirectional-new-file' + When comparing directories, if a file appears only in the second + directory of the two, treat it as present but empty in the other. + *Note Comparing Directories::. + +`-U LINES' +`--unified[=LINES]' + Use the unified output format, showing LINES (an integer) lines of + context, or three if LINES is not given. *Note Unified Format::. + For proper operation, `patch' typically needs at least two lines of + context. + + On older systems, `diff' supports an obsolete option `-LINES' that + has effect when combined with `-u'. POSIX 1003.1-2001 (*note + Standards conformance::) does not allow this; use `-U LINES' + instead. + +`-v' +`--version' + Output version information and then exit. + +`-w' +`--ignore-all-space' + Ignore white space when comparing lines. *Note White Space::. + +`-W COLUMNS' +`--width=COLUMNS' + Output at most COLUMNS (default 130) print columns per line in + side by side format. *Note Side by Side Format::. + +`-x PATTERN' +`--exclude=PATTERN' + When comparing directories, ignore files and subdirectories whose + basenames match PATTERN. *Note Comparing Directories::. + +`-X FILE' +`--exclude-from=FILE' + When comparing directories, ignore files and subdirectories whose + basenames match any pattern contained in FILE. *Note Comparing + Directories::. + +`-y' +`--side-by-side' + Use the side by side output format. *Note Side by Side Format::. + + +File: diff.info, Node: Invoking diff3, Next: Invoking patch, Prev: Invoking diff, Up: Top + +Invoking `diff3' +**************** + + The `diff3' command compares three files and outputs descriptions of +their differences. Its arguments are as follows: + + diff3 OPTIONS... MINE OLDER YOURS + + The files to compare are MINE, OLDER, and YOURS. At most one of +these three file names may be `-', which tells `diff3' to read the +standard input for that file. + + An exit status of 0 means `diff3' was successful, 1 means some +conflicts were found, and 2 means trouble. + +* Menu: + +* diff3 Options:: Summary of options to `diff3'. + + +File: diff.info, Node: diff3 Options, Up: Invoking diff3 + +Options to `diff3' +================== + + Below is a summary of all of the options that GNU `diff3' accepts. +Multiple single letter options (unless they take an argument) can be +combined into a single command line argument. + +`-a' +`--text' + Treat all files as text and compare them line-by-line, even if they + do not appear to be text. *Note Binary::. + +`-A' +`--show-all' + Incorporate all unmerged changes from OLDER to YOURS into MINE, + surrounding conflicts with bracket lines. *Note Marking + Conflicts::. + +`--diff-program=PROGRAM' + Use the compatible comparison program PROGRAM to compare files + instead of `diff'. + +`-e' +`--ed' + Generate an `ed' script that incorporates all the changes from + OLDER to YOURS into MINE. *Note Which Changes::. + +`-E' +`--show-overlap' + Like `-e', except bracket lines from overlapping changes' first + and third files. *Note Marking Conflicts::. With `-E', an + overlapping change looks like this: + + <<<<<<< MINE + lines from MINE + ======= + lines from YOURS + >>>>>>> YOURS + +`--help' + Output a summary of usage and then exit. + +`-i' + Generate `w' and `q' commands at the end of the `ed' script for + System V compatibility. This option must be combined with one of + the `-AeExX3' options, and may not be combined with `-m'. *Note + Saving the Changed File::. + +`-L LABEL' +`--label=LABEL' + Use the label LABEL for the brackets output by the `-A', `-E' and + `-X' options. This option may be given up to three times, one for + each input file. The default labels are the names of the input + files. Thus `diff3 -L X -L Y -L Z -m A B C' acts like `diff3 -m A + B C', except that the output looks like it came from files named + `X', `Y' and `Z' rather than from files named `A', `B' and `C'. + *Note Marking Conflicts::. + +`-m' +`--merge' + Apply the edit script to the first file and send the result to + standard output. Unlike piping the output from `diff3' to `ed', + this works even for binary files and incomplete lines. `-A' is + assumed if no edit script option is specified. *Note Bypassing + ed::. + +`-T' +`--initial-tab' + Output a tab rather than two spaces before the text of a line in + normal format. This causes the alignment of tabs in the line to + look normal. *Note Tabs::. + +`-v' +`--version' + Output version information and then exit. + +`-x' +`--overlap-only' + Like `-e', except output only the overlapping changes. *Note + Which Changes::. + +`-X' + Like `-E', except output only the overlapping changes. In other + words, like `-x', except bracket changes as in `-E'. *Note + Marking Conflicts::. + +`-3' +`--easy-only' + Like `-e', except output only the nonoverlapping changes. *Note + Which Changes::. + + +File: diff.info, Node: Invoking patch, Next: Invoking sdiff, Prev: Invoking diff3, Up: Top + +Invoking `patch' +**************** + + Normally `patch' is invoked like this: + + patch <PATCHFILE + + The full format for invoking `patch' is: + + patch OPTIONS... [ORIGFILE [PATCHFILE]] + + You can also specify where to read the patch from with the `-i +PATCHFILE' or `--input=PATCHFILE' option. If you do not specify +PATCHFILE, or if PATCHFILE is `-', `patch' reads the patch (that is, +the `diff' output) from the standard input. + + If you do not specify an input file on the command line, `patch' +tries to intuit from the "leading text" (any text in the patch that +comes before the `diff' output) which file to edit. *Note Multiple +Patches::. + + By default, `patch' replaces the original input file with the +patched version, possibly after renaming the original file into a +backup file (*note Backup Names::, for a description of how `patch' +names backup files). You can also specify where to put the output with +the `-o FILE' or `--output=FILE' option; however, do not use this option +if FILE is one of the input files. + +* Menu: + +* patch Options:: Summary table of options to `patch'. + + +File: diff.info, Node: patch Options, Up: Invoking patch + +Options to `patch' +================== + + Here is a summary of all of the options that GNU `patch' accepts. +*Note patch and Tradition::, for which of these options are safe to use +in older versions of `patch'. + + Multiple single-letter options that do not take an argument can be +combined into a single command line argument with only one dash. + +`-b' +`--backup' + Back up the original contents of each file, even if backups would + normally not be made. *Note Backups::. + +`-B PREFIX' +`--prefix=PREFIX' + Prepend PREFIX to backup file names. *Note Backup Names::. + +`--backup-if-mismatch' + Back up the original contents of each file if the patch does not + exactly match the file. This is the default behavior when not + conforming to POSIX. *Note Backups::. + +`--binary' + Read and write all files in binary mode, except for standard output + and `/dev/tty'. This option has no effect on POSIX-conforming + systems like GNU/Linux. On systems where this option makes a + difference, the patch should be generated by `diff -a --binary'. + *Note Binary::. + +`-c' +`--context' + Interpret the patch file as a context diff. *Note patch Input::. + +`-d DIRECTORY' +`--directory=DIRECTORY' + Make directory DIRECTORY the current directory for interpreting + both file names in the patch file, and file names given as + arguments to other options. *Note patch Directories::. + +`-D NAME' +`--ifdef=NAME' + Make merged if-then-else output using NAME. *Note If-then-else::. + +`--dry-run' + Print the results of applying the patches without actually changing + any files. *Note Dry Runs::. + +`-e' +`--ed' + Interpret the patch file as an `ed' script. *Note patch Input::. + +`-E' +`--remove-empty-files' + Remove output files that are empty after the patches have been + applied. *Note Creating and Removing::. + +`-f' +`--force' + Assume that the user knows exactly what he or she is doing, and do + not ask any questions. *Note patch Messages::. + +`-F LINES' +`--fuzz=LINES' + Set the maximum fuzz factor to LINES. *Note Inexact::. + +`-g NUM' +`--get=NUM' + If NUM is positive, get input files from a revision control system + as necessary; if zero, do not get the files; if negative, ask the + user whether to get the files. *Note Revision Control::. + +`--help' + Output a summary of usage and then exit. + +`-i PATCHFILE' +`--input=PATCHFILE' + Read the patch from PATCHFILE rather than from standard input. + *Note patch Options::. + +`-l' +`--ignore-white-space' + Let any sequence of blanks (spaces or tabs) in the patch file match + any sequence of blanks in the input file. *Note Changed White + Space::. + +`-n' +`--normal' + Interpret the patch file as a normal diff. *Note patch Input::. + +`-N' +`--forward' + Ignore patches that `patch' thinks are reversed or already applied. + See also `-R'. *Note Reversed Patches::. + +`--no-backup-if-mismatch' + Do not back up the original contents of files. This is the default + behavior when conforming to POSIX. *Note Backups::. + +`-o FILE' +`--output=FILE' + Use FILE as the output file name. *Note patch Options::. + +`-pNUMBER' +`--strip=NUMBER' + Set the file name strip count to NUMBER. *Note patch + Directories::. + +`--posix' + Conform to POSIX, as if the `POSIXLY_CORRECT' environment variable + had been set. *Note patch and POSIX::. + +`--quoting-style=WORD' + Use style WORD to quote names in diagnostics, as if the + `QUOTING_STYLE' environment variable had been set to WORD. *Note + patch Quoting Style::. + +`-r REJECT-FILE' +`--reject-file=REJECT-FILE' + Use REJECT-FILE as the reject file name. *Note Reject Names::. + +`-R' +`--reverse' + Assume that this patch was created with the old and new files + swapped. *Note Reversed Patches::. + +`-s' +`--quiet' +`--silent' + Work silently unless an error occurs. *Note patch Messages::. + +`-t' +`--batch' + Do not ask any questions. *Note patch Messages::. + +`-T' +`--set-time' + Set the modification and access times of patched files from time + stamps given in context diff headers, assuming that the context + diff headers use local time. *Note Patching Time Stamps::. + +`-u' +`--unified' + Interpret the patch file as a unified diff. *Note patch Input::. + +`-v' +`--version' + Output version information and then exit. + +`-V BACKUP-STYLE' +`--version=control=BACKUP-STYLE' + Select the naming convention for backup file names. *Note Backup + Names::. + +`--verbose' + Print more diagnostics than usual. *Note patch Messages::. + +`-x NUMBER' +`--debug=NUMBER' + Set internal debugging flags. Of interest only to `patch' + patchers. + +`-Y PREFIX' +`--basename-prefix=PREFIX' + Prepend PREFIX to base names of backup files. *Note Backup + Names::. + +`-z SUFFIX' +`--suffix=SUFFIX' + Use SUFFIX as the backup extension instead of `.orig' or `~'. + *Note Backup Names::. + +`-Z' +`--set-utc' + Set the modification and access times of patched files from time + stamps given in context diff headers, assuming that the context + diff headers use UTC. *Note Patching Time Stamps::. + + +File: diff.info, Node: Invoking sdiff, Next: Standards conformance, Prev: Invoking patch, Up: Top + +Invoking `sdiff' +**************** + + The `sdiff' command merges two files and interactively outputs the +results. Its arguments are as follows: + + sdiff -o OUTFILE OPTIONS... FROM-FILE TO-FILE + + This merges FROM-FILE with TO-FILE, with output to OUTFILE. If +FROM-FILE is a directory and TO-FILE is not, `sdiff' compares the file +in FROM-FILE whose file name is that of TO-FILE, and vice versa. +FROM-FILE and TO-FILE may not both be directories. + + `sdiff' options begin with `-', so normally FROM-FILE and TO-FILE +may not begin with `-'. However, `--' as an argument by itself treats +the remaining arguments as file names even if they begin with `-'. You +may not use `-' as an input file. + + `sdiff' without `-o' (or `--output') produces a side-by-side +difference. This usage is obsolete; use the `-y' or `--side-by-side' +option of `diff' instead. + + An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +* Menu: + +* sdiff Options:: Summary of options to `diff'. + + +File: diff.info, Node: sdiff Options, Up: Invoking sdiff + +Options to `sdiff' +================== + + Below is a summary of all of the options that GNU `sdiff' accepts. +Each option has two equivalent names, one of which is a single letter +preceded by `-', and the other of which is a long name preceded by +`--'. Multiple single letter options (unless they take an argument) +can be combined into a single command line argument. Long named +options can be abbreviated to any unique prefix of their name. + +`-a' +`--text' + Treat all files as text and compare them line-by-line, even if they + do not appear to be text. *Note Binary::. + +`-b' +`--ignore-space-change' + Ignore changes in amount of white space. *Note White Space::. + +`-B' +`--ignore-blank-lines' + Ignore changes that just insert or delete blank lines. *Note + Blank Lines::. + +`-d' +`--minimal' + Change the algorithm to perhaps find a smaller set of changes. + This makes `sdiff' slower (sometimes much slower). *Note diff + Performance::. + +`--diff-program=PROGRAM' + Use the compatible comparison program PROGRAM to compare files + instead of `diff'. + +`-E' +`--ignore-tab-expansion' + Ignore changes due to tab expansion. *Note White Space::. + +`--help' + Output a summary of usage and then exit. + +`-i' +`--ignore-case' + Ignore changes in case; consider upper- and lower-case to be the + same. *Note Case Folding::. + +`-I REGEXP' +`--ignore-matching-lines=REGEXP' + Ignore changes that just insert or delete lines that match REGEXP. + *Note Specified Folding::. + +`-l' +`--left-column' + Print only the left column of two common lines. *Note Side by + Side Format::. + +`-o FILE' +`--output=FILE' + Put merged output into FILE. This option is required for merging. + +`-s' +`--suppress-common-lines' + Do not print common lines. *Note Side by Side Format::. + +`--speed-large-files' + Use heuristics to speed handling of large files that have numerous + scattered small changes. *Note diff Performance::. + +`--strip-trailing-cr' + Strip any trailing carriage return at the end of an input line. + *Note Binary::. + +`-t' +`--expand-tabs' + Expand tabs to spaces in the output, to preserve the alignment of + tabs in the input files. *Note Tabs::. + +`-v' +`--version' + Output version information and then exit. + +`-w COLUMNS' +`--width=COLUMNS' + Output at most COLUMNS (default 130) print columns per line. + *Note Side by Side Format::. Note that for historical reasons, + this option is `-W' in `diff', `-w' in `sdiff'. + +`-W' +`--ignore-all-space' + Ignore white space when comparing lines. *Note White Space::. + Note that for historical reasons, this option is `-w' in `diff', + `-W' in `sdiff'. + + +File: diff.info, Node: Standards conformance, Next: Projects, Prev: Invoking sdiff, Up: Top + +Standards conformance +********************* + + In a few cases, the GNU utilities' default behavior is incompatible +with the POSIX standard. To suppress these incompatibilities, define +the `POSIXLY_CORRECT' environment variable. Unless you are checking +for POSIX conformance, you probably do not need to define +`POSIXLY_CORRECT'. + + Normally options and operands can appear in any order, and programs +act as if all the options appear before any operands. For example, +`diff lao tzu -C 2' acts like `diff -C 2 lao tzu', since `2' is an +option-argument of `-C'. However, if the `POSIXLY_CORRECT' environment +variable is set, options must appear before operands, unless otherwise +specified for a particular command. + + Newer versions of POSIX are occasionally incompatible with older +versions. For example, older versions of POSIX allowed the command +`diff -c -10' to have the same meaning as `diff -C 10', but POSIX +1003.1-2001 `diff' no longer allows digit-string options like `-10'. + + The GNU utilities normally conform to the version of POSIX that is +standard for your system. To cause them to conform to a different +version of POSIX, define the `_POSIX2_VERSION' environment variable to +a value of the form YYYYMM specifying the year and month the standard +was adopted. Two values are currently supported for `_POSIX2_VERSION': +`199209' stands for POSIX 1003.2-1992, and `200112' stands for POSIX +1003.1-2001. For example, if you are running older software that +assumes an older version of POSIX and uses `diff -c -10', you can work +around the compatibility problems by setting `_POSIX2_VERSION=199209' +in your environment. + + +File: diff.info, Node: Projects, Next: Copying This Manual, Prev: Standards conformance, Up: Top + +Future Projects +*************** + + Here are some ideas for improving GNU `diff' and `patch'. The GNU +project has identified some improvements as potential programming +projects for volunteers. You can also help by reporting any bugs that +you find. + + If you are a programmer and would like to contribute something to the +GNU project, please consider volunteering for one of these projects. +If you are seriously contemplating work, please write to <gnu@gnu.org> +to coordinate with other volunteers. + +* Menu: + +* Shortcomings:: Suggested projects for improvements. +* Bugs:: Reporting bugs. + + +File: diff.info, Node: Shortcomings, Next: Bugs, Up: Projects + +Suggested Projects for Improving GNU `diff' and `patch' +======================================================= + + One should be able to use GNU `diff' to generate a patch from any +pair of directory trees, and given the patch and a copy of one such +tree, use `patch' to generate a faithful copy of the other. +Unfortunately, some changes to directory trees cannot be expressed using +current patch formats; also, `patch' does not handle some of the +existing formats. These shortcomings motivate the following suggested +projects. + +* Menu: + +* Internationalization:: Handling multibyte and varying-width characters. +* Changing Structure:: Handling changes to the directory structure. +* Special Files:: Handling symbolic links, device special files, etc. +* Unusual File Names:: Handling file names that contain unusual characters. +* Time Stamp Order:: Outputting diffs in time stamp order. +* Ignoring Changes:: Ignoring certain changes while showing others. +* Speedups:: Improving performance. + + +File: diff.info, Node: Internationalization, Next: Changing Structure, Up: Shortcomings + +Handling Multibyte and Varying-Width Characters +----------------------------------------------- + + `diff', `diff3' and `sdiff' treat each line of input as a string of +unibyte characters. This can mishandle multibyte characters in some +cases. For example, when asked to ignore spaces, `diff' does not +properly ignore a multibyte space character. + + Also, `diff' currently assumes that each byte is one column wide, +and this assumption is incorrect in some locales, e.g., locales that +use UTF-8 encoding. This causes problems with the `-y' or +`--side-by-side' option of `diff'. + + These problems need to be fixed without unduly affecting the +performance of the utilities in unibyte environments. + + The IBM GNU/Linux Technology Center Internationalization Team has +proposed some patches to support internationalized `diff' +`http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz'. +Unfortunately, these patches are incomplete and are to an older version +of `diff', so more work needs to be done in this area. + + +File: diff.info, Node: Changing Structure, Next: Special Files, Prev: Internationalization, Up: Shortcomings + +Handling Changes to the Directory Structure +------------------------------------------- + + `diff' and `patch' do not handle some changes to directory +structure. For example, suppose one directory tree contains a directory +named `D' with some subsidiary files, and another contains a file with +the same name `D'. `diff -r' does not output enough information for +`patch' to transform the directory subtree into the file. + + There should be a way to specify that a file has been removed without +having to include its entire contents in the patch file. There should +also be a way to tell `patch' that a file was renamed, even if there is +no way for `diff' to generate such information. There should be a way +to tell `patch' that a file's time stamp has changed, even if its +contents have not changed. + + These problems can be fixed by extending the `diff' output format to +represent changes in directory structure, and extending `patch' to +understand these extensions. + + +File: diff.info, Node: Special Files, Next: Unusual File Names, Prev: Changing Structure, Up: Shortcomings + +Files that are Neither Directories Nor Regular Files +---------------------------------------------------- + + Some files are neither directories nor regular files: they are +unusual files like symbolic links, device special files, named pipes, +and sockets. Currently, `diff' treats symbolic links like regular +files; it treats other special files like regular files if they are +specified at the top level, but simply reports their presence when +comparing directories. This means that `patch' cannot represent changes +to such files. For example, if you change which file a symbolic link +points to, `diff' outputs the difference between the two files, instead +of the change to the symbolic link. + + `diff' should optionally report changes to special files specially, +and `patch' should be extended to understand these extensions. + + +File: diff.info, Node: Unusual File Names, Next: Time Stamp Order, Prev: Special Files, Up: Shortcomings + +File Names that Contain Unusual Characters +------------------------------------------ + + When a file name contains an unusual character like a newline or +white space, `diff -r' generates a patch that `patch' cannot parse. +The problem is with format of `diff' output, not just with `patch', +because with odd enough file names one can cause `diff' to generate a +patch that is syntactically correct but patches the wrong files. The +format of `diff' output should be extended to handle all possible file +names. + + +File: diff.info, Node: Time Stamp Order, Next: Ignoring Changes, Prev: Unusual File Names, Up: Shortcomings + +Outputting Diffs in Time Stamp Order +------------------------------------ + + Applying `patch' to a multiple-file diff can result in files whose +time stamps are out of order. GNU `patch' has options to restore the +time stamps of the updated files (*note Patching Time Stamps::), but +sometimes it is useful to generate a patch that works even if the +recipient does not have GNU patch, or does not use these options. One +way to do this would be to implement a `diff' option to output diffs in +time stamp order. + + +File: diff.info, Node: Ignoring Changes, Next: Speedups, Prev: Time Stamp Order, Up: Shortcomings + +Ignoring Certain Changes +------------------------ + + It would be nice to have a feature for specifying two strings, one in +FROM-FILE and one in TO-FILE, which should be considered to match. +Thus, if the two strings are `foo' and `bar', then if two lines differ +only in that `foo' in file 1 corresponds to `bar' in file 2, the lines +are treated as identical. + + It is not clear how general this feature can or should be, or what +syntax should be used for it. + + A partial substitute is to filter one or both files before comparing, +e.g.: + + sed 's/foo/bar/g' file1 | diff - file2 + + However, this outputs the filtered text, not the original. + + +File: diff.info, Node: Speedups, Prev: Ignoring Changes, Up: Shortcomings + +Improving Performance +--------------------- + + When comparing two large directory structures, one of which was +originally copied from the other with time stamps preserved (e.g., with +`cp -pR'), it would greatly improve performance if an option told +`diff' to assume that two files with the same size and time stamps have +the same content. *Note diff Performance::. + + +File: diff.info, Node: Bugs, Prev: Shortcomings, Up: Projects + +Reporting Bugs +============== + + If you think you have found a bug in GNU `cmp', `diff', `diff3', or +`sdiff', please report it by electronic mail to the GNU utilities bug +report mailing list +(http://mail.gnu.org/mailman/listinfo/bug-gnu-utils) +<bug-gnu-utils@gnu.org>. Please send bug reports for GNU `patch' to +<bug-patch@gnu.org>. Send as precise a description of the problem as +you can, including the output of the `--version' option and sample +input files that produce the bug, if applicable. If you have a +nontrivial fix for the bug, please send it as well. If you have a +patch, please send it too. It may simplify the maintainer's job if the +patch is relative to a recent test release, which you can find in the +directory `ftp://alpha.gnu.org/gnu/diffutils/'. + + +File: diff.info, Node: Copying This Manual, Next: Index, Prev: Projects, Up: Top + +Copying This Manual +******************* + +* Menu: + +* GNU Free Documentation License:: License for copying this manual. + + +File: diff.info, Node: GNU Free Documentation License, Up: Copying This Manual + +GNU Free Documentation License +============================== + + Version 1.1, March 2000 + Copyright (C) 2000 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + written 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 that contains a + notice placed by the copyright holder saying it can be distributed + under the terms of this License. The "Document", below, refers to + any such manual or work. Any member of the public is a licensee, + and is addressed as "you". + + 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. + (For example, 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. + + 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 "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, whose contents can be viewed and edited directly + and 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 has been designed + to thwart or discourage subsequent modification by readers is not + Transparent. 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 designed for human modification. + Opaque formats include PostScript, PDF, 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 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. + + 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 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 publicly-accessible + computer-network location containing a complete Transparent copy + of the Document, free of added material, which the general + network-using public has access to download anonymously at no + charge using public-standard network protocols. 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 less than five). + + 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", and 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. In any section entitled "Acknowledgments" or "Dedications", + preserve the section's title, and preserve in the section all + the substance and tone of each of the contributor + acknowledgments 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 as "Endorsements" or to + conflict in title with any Invariant Section. + + 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. + + 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 + "Acknowledgments", 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, does not as a whole count as a + Modified Version of the Document, provided no compilation + copyright is claimed for the compilation. Such a compilation is + called an "aggregate", and this License does not apply to the + other self-contained works thus compiled with the Document, on + account of their being thus compiled, if they 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 + quarter of the entire aggregate, the Document's Cover Texts may be + placed on covers that surround only the Document within the + aggregate. Otherwise they must appear on covers around 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 provided that you also include the + original English version of this License. In case of a + disagreement between the translation and the original English + version of this License, the original English version will prevail. + + 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. + +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.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have no Invariant Sections, write "with no Invariant Sections" +instead of saying which ones are invariant. If you have no Front-Cover +Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being +LIST"; likewise for Back-Cover Texts. + + 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: diff.info, Node: Index, Prev: Copying This Manual, Up: Top + +Index +***** + +* Menu: + +* ! output format: Context. +* +- output format: Unified Format. +* < output format: Normal. +* <<<<<<< for marking conflicts: Marking Conflicts. +* _POSIX2_VERSION: Standards conformance. +* aligning tab stops: Tabs. +* alternate file names: Alternate Names. +* backup file names: Backup Names. +* backup file strategy: Backups. +* binary file diff: Binary. +* blank and tab difference suppression: White Space. +* blank line difference suppression: Blank Lines. +* brief difference reports: Brief. +* bug reports: Bugs. +* C function headings: C Function Headings. +* C if-then-else output format: If-then-else. +* case difference suppression: Case Folding. +* ClearCase: Revision Control. +* cmp invocation: Invoking cmp. +* cmp options: cmp Options. +* columnar output: Side by Side. +* common mistakes with patches: Avoiding Common Mistakes. +* comparing three files: Comparing Three Files. +* conflict: diff3 Merging. +* conflict marking: Marking Conflicts. +* context output format: Context. +* creating files: Creating and Removing. +* diagnostics from patch: patch Messages. +* diff invocation: Invoking diff. +* diff merging: Interactive Merging. +* diff options: diff Options. +* diff sample input: Sample diff Input. +* diff3 hunks: diff3 Hunks. +* diff3 invocation: Invoking diff3. +* diff3 options: diff3 Options. +* diff3 sample input: Sample diff3 Input. +* directories and patch: patch Directories. +* directory structure changes: Changing Structure. +* dry runs for patch: Dry Runs. +* ed script output format: ed Scripts. +* EDITOR: Merge Commands. +* empty files, removing: Creating and Removing. +* exabyte, definition of: cmp Options. +* exbibyte, definition of: cmp Options. +* FDL, GNU Free Documentation License: GNU Free Documentation License. +* file name alternates: Alternate Names. +* file names with unusual characters: Unusual File Names. +* format of diff output: Output Formats. +* format of diff3 output: Comparing Three Files. +* formats for if-then-else line groups: Line Group Formats. +* forward ed script output format: Forward ed. +* full lines: Incomplete Lines. +* function headings, C: C Function Headings. +* fuzz factor when patching: Inexact. +* gibibyte, definition of: cmp Options. +* gigabyte, definition of: cmp Options. +* headings: Sections. +* hunks: Hunks. +* hunks for diff3: diff3 Hunks. +* if-then-else output format: If-then-else. +* ifdef output format: If-then-else. +* imperfect patch application: Imperfect. +* incomplete line merging: Merging Incomplete Lines. +* incomplete lines: Incomplete Lines. +* inexact patches: Inexact. +* inhibit messages from patch: More or Fewer Messages. +* interactive merging: Interactive Merging. +* introduction: Comparison. +* intuiting file names from patches: Multiple Patches. +* invoking cmp: Invoking cmp. +* invoking diff: Invoking diff. +* invoking diff3: Invoking diff3. +* invoking patch: Invoking patch. +* invoking sdiff: Invoking sdiff. +* keyboard input to patch: patch and Keyboard Input. +* kibibyte, definition of: cmp Options. +* kilobyte, definition of: cmp Options. +* LC_COLLATE: Comparing Directories. +* LC_NUMERIC: Line Group Formats. +* LC_TIME: Detailed Context. +* line formats: Line Formats. +* line group formats: Line Group Formats. +* mebibyte, definition of: cmp Options. +* megabyte, definition of: cmp Options. +* merge commands: Merge Commands. +* merged diff3 format: Bypassing ed. +* merged output format: If-then-else. +* merging from a common ancestor: diff3 Merging. +* merging interactively: Merge Commands. +* messages from patch: patch Messages. +* multibyte characters: Internationalization. +* multiple patches: Multiple Patches. +* newline treatment by diff: Incomplete Lines. +* normal output format: Normal. +* options for cmp: cmp Options. +* options for diff: diff Options. +* options for diff3: diff3 Options. +* options for patch: patch Options. +* options for sdiff: sdiff Options. +* output formats: Output Formats. +* overlap: diff3 Merging. +* overlapping change, selection of: Which Changes. +* overview of diff and patch: Overview. +* paginating diff output: Pagination. +* patch consumer tips: Tips for Patch Consumers. +* patch input format: patch Input. +* patch invocation: Invoking patch. +* patch messages and questions: patch Messages. +* patch options: patch Options. +* patch producer tips: Tips for Patch Producers. +* patch, common mistakes: Avoiding Common Mistakes. +* PATCH_GET: Revision Control. +* PATCH_VERSION_CONTROL: Backup Names. +* patches, shrinking: Generating Smaller Patches. +* patching directories: patch Directories. +* pebibyte, definition of: cmp Options. +* performance of diff: diff Performance. +* petabyte, definition of: cmp Options. +* POSIX <1>: Standards conformance. +* POSIX: patch and POSIX. +* POSIXLY_CORRECT <1>: patch and POSIX. +* POSIXLY_CORRECT: Standards conformance. +* projects for directories: Shortcomings. +* quoting style: patch Quoting Style. +* QUOTING_STYLE: patch Quoting Style. +* RCS: Revision Control. +* RCS script output format: RCS. +* regular expression matching headings: Specified Headings. +* regular expression suppression: Specified Folding. +* reject file names: Reject Names. +* removing empty files: Creating and Removing. +* reporting bugs: Bugs. +* reversed patches: Reversed Patches. +* revision control: Revision Control. +* sample input for diff: Sample diff Input. +* sample input for diff3: Sample diff3 Input. +* SCCS: Revision Control. +* script output formats: Scripts. +* sdiff invocation: Invoking sdiff. +* sdiff options: sdiff Options. +* sdiff output format: sdiff Option Summary. +* section headings: Sections. +* side by side: Side by Side. +* side by side format: Side by Side Format. +* SIMPLE_BACKUP_SUFFIX: Backup Names. +* special files: Special Files. +* specified headings: Specified Headings. +* summarizing which files differ: Brief. +* System V diff3 compatibility: Saving the Changed File. +* tab and blank difference suppression: White Space. +* tab stop alignment: Tabs. +* tebibyte, definition of: cmp Options. +* terabyte, definition of: cmp Options. +* testing patch: Dry Runs. +* text versus binary diff: Binary. +* time stamp format, context diffs: Detailed Context. +* time stamp format, unified diffs: Detailed Unified. +* time stamps on patched files: Patching Time Stamps. +* traditional patch: patch and Tradition. +* two-column output: Side by Side. +* unified output format: Unified Format. +* unmerged change: Which Changes. +* varying-width characters: Internationalization. +* verbose messages from patch: More or Fewer Messages. +* version control: Revision Control. +* VERSION_CONTROL <1>: Backup Names. +* VERSION_CONTROL: Revision Control. +* white space in patches: Changed White Space. +* yottabyte, definition of: cmp Options. +* zettabyte, definition of: cmp Options. + + + +Tag Table: +Node: Top1653 +Node: Overview4045 +Node: Comparison7202 +Node: Hunks9888 +Node: White Space11313 +Node: Blank Lines12807 +Node: Case Folding13562 +Node: Specified Folding13977 +Node: Brief15052 +Node: Binary16295 +Node: Output Formats20358 +Node: Sample diff Input21076 +Node: Normal22569 +Node: Detailed Normal23564 +Node: Example Normal25289 +Node: Context26011 +Node: Context Format27567 +Node: Detailed Context28345 +Node: Example Context30234 +Node: Less Context31748 +Node: Unified Format32894 +Node: Detailed Unified33676 +Node: Example Unified34787 +Node: Sections35807 +Node: Specified Headings36552 +Node: C Function Headings38083 +Node: Alternate Names38908 +Node: Side by Side39808 +Node: Side by Side Format41947 +Node: Example Side by Side42836 +Node: Scripts44162 +Node: ed Scripts44563 +Node: Detailed ed45756 +Node: Example ed47497 +Node: Forward ed47934 +Node: RCS48696 +Node: If-then-else49904 +Node: Line Group Formats51572 +Node: Line Formats57437 +Node: Detailed If-then-else60693 +Node: Example If-then-else62583 +Node: Incomplete Lines63632 +Node: Comparing Directories65263 +Node: Adjusting Output69220 +Node: Tabs69645 +Node: Pagination71177 +Node: diff Performance71626 +Node: Comparing Three Files74708 +Node: Sample diff3 Input75580 +Node: Detailed diff3 Normal76528 +Node: diff3 Hunks78307 +Node: Example diff3 Normal79593 +Node: diff3 Merging80616 +Node: Which Changes82854 +Node: Marking Conflicts84258 +Node: Bypassing ed86714 +Node: Merging Incomplete Lines88068 +Node: Saving the Changed File88784 +Node: Interactive Merging89390 +Node: sdiff Option Summary90094 +Node: Merge Commands91242 +Node: Merging with patch92503 +Node: patch Input94867 +Node: Revision Control95537 +Node: Imperfect96689 +Node: Changed White Space97825 +Node: Reversed Patches98606 +Node: Inexact100056 +Node: Dry Runs103599 +Node: Creating and Removing104447 +Node: Patching Time Stamps105486 +Node: Multiple Patches107677 +Node: patch Directories110328 +Node: Backups111942 +Node: Backup Names112996 +Ref: Backup Names-Footnote-1115955 +Node: Reject Names116082 +Node: patch Messages116660 +Node: More or Fewer Messages117706 +Node: patch and Keyboard Input118319 +Node: patch Quoting Style119332 +Node: patch and POSIX120464 +Node: patch and Tradition121290 +Node: Making Patches124734 +Node: Tips for Patch Producers125552 +Node: Tips for Patch Consumers126796 +Node: Avoiding Common Mistakes127421 +Node: Generating Smaller Patches129934 +Node: Invoking cmp131683 +Node: cmp Options132532 +Node: Invoking diff135896 +Node: diff Options137599 +Node: Invoking diff3145722 +Node: diff3 Options146352 +Node: Invoking patch149255 +Node: patch Options150455 +Node: Invoking sdiff155669 +Node: sdiff Options156808 +Node: Standards conformance159561 +Node: Projects161299 +Node: Shortcomings162002 +Node: Internationalization163092 +Node: Changing Structure164247 +Node: Special Files165336 +Node: Unusual File Names166282 +Node: Time Stamp Order166904 +Node: Ignoring Changes167531 +Node: Speedups168285 +Node: Bugs168733 +Node: Copying This Manual169574 +Node: GNU Free Documentation License169782 +Node: Index189646 + +End Tag Table diff --git a/gnu/dist/diffutils/doc/diff.texi b/gnu/dist/diffutils/doc/diff.texi new file mode 100644 index 00000000000..3550ff58824 --- /dev/null +++ b/gnu/dist/diffutils/doc/diff.texi @@ -0,0 +1,4557 @@ +\input texinfo @c -*-texinfo-*- +@c $NetBSD: diff.texi,v 1.1.1.1 2003/01/26 00:43:12 wiz Exp $ +@comment $Id: diff.texi,v 1.1.1.1 2003/01/26 00:43:12 wiz Exp $ +@comment %**start of header +@setfilename diff.info +@include version.texi +@settitle Comparing and Merging Files +@syncodeindex vr cp +@setchapternewpage odd +@comment %**end of header +@copying +This manual is for GNU Diffutils +(version @value{VERSION}, @value{UPDATED}), +and documents the @sc{gnu} @command{diff}, @command{diff3}, +@command{sdiff}, and @command{cmp} commands for showing the +differences between files and the @sc{gnu} @command{patch} command for +using their output to update files. + +Copyright @copyright{} 1992, 1993, 1994, 1998, 2001, 2002 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 freedom to copy and modify +this GNU Manual, like GNU software. Copies published by the Free +Software Foundation raise funds for GNU development.'' +@end quotation +@end copying + +@c Debian install-info (up through at least version 1.9.20) uses only the +@c first dircategory. Put this one first, as it is more useful in practice. +@dircategory Individual utilities +@direntry +* cmp: (diff)Invoking cmp. Compare 2 files byte by byte. +* diff: (diff)Invoking diff. Compare 2 files line by line. +* diff3: (diff)Invoking diff3. Compare 3 files line by line. +* patch: (diff)Invoking patch. Apply a patch to a file. +* sdiff: (diff)Invoking sdiff. Merge 2 files side-by-side. +@end direntry + +@dircategory GNU packages +@direntry +* Diff: (diff). Comparing and merging files. +@end direntry + +@titlepage +@title Comparing and Merging Files +@subtitle for Diffutils @value{VERSION} and @code{patch} 2.5.4 +@subtitle @value{UPDATED} +@author David MacKenzie, Paul Eggert, and Richard Stallman +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@shortcontents +@contents + +@ifnottex +@node Top +@top Comparing and Merging Files + +@insertcopying +@end ifnottex + +@menu +* Overview:: Preliminary information. +* Comparison:: What file comparison means. + +* Output Formats:: Formats for two-way difference reports. +* Incomplete Lines:: Lines that lack trailing newlines. +* Comparing Directories:: Comparing files and directories. +* Adjusting Output:: Making @command{diff} output prettier. +* diff Performance:: Making @command{diff} smarter or faster. + +* Comparing Three Files:: Formats for three-way difference reports. +* diff3 Merging:: Merging from a common ancestor. + +* Interactive Merging:: Interactive merging with @command{sdiff}. + +* Merging with patch:: Using @command{patch} to change old files into new ones. +* Making Patches:: Tips for making and using patch distributions. + +* Invoking cmp:: Compare two files byte by byte. +* Invoking diff:: Compare two files line by line. +* Invoking diff3:: Compare three files line by line. +* Invoking patch:: Apply a diff file to an original. +* Invoking sdiff:: Side-by-side merge of file differences. + +* Standards conformance:: Conformance to the @sc{posix} standard. +* Projects:: If you've found a bug or other shortcoming. + +* Copying This Manual:: How to make copies of this manual. +* Index:: Index. +@end menu + +@node Overview +@unnumbered Overview +@cindex overview of @command{diff} and @command{patch} + +Computer users often find occasion to ask how two files differ. Perhaps +one file is a newer version of the other file. Or maybe the two files +started out as identical copies but were changed by different people. + +You can use the @command{diff} command to show differences between two +files, or each corresponding file in two directories. @command{diff} +outputs differences between files line by line in any of several +formats, selectable by command line options. This set of differences is +often called a @dfn{diff} or @dfn{patch}. For files that are identical, +@command{diff} normally produces no output; for binary (non-text) files, +@command{diff} normally reports only that they are different. + +You can use the @command{cmp} command to show the byte and line numbers +where two files differ. @command{cmp} can also show all the bytes +that differ between the two files, side by side. A way to compare +two files character by character is the Emacs command @kbd{M-x +compare-windows}. @xref{Other Window, , Other Window, emacs, The @sc{gnu} +Emacs Manual}, for more information on that command. + +You can use the @command{diff3} command to show differences among three +files. When two people have made independent changes to a common +original, @command{diff3} can report the differences between the original +and the two changed versions, and can produce a merged file that +contains both persons' changes together with warnings about conflicts. + +You can use the @command{sdiff} command to merge two files interactively. + +You can use the set of differences produced by @command{diff} to distribute +updates to text files (such as program source code) to other people. +This method is especially useful when the differences are small compared +to the complete files. Given @command{diff} output, you can use the +@command{patch} program to update, or @dfn{patch}, a copy of the file. If you +think of @command{diff} as subtracting one file from another to produce +their difference, you can think of @command{patch} as adding the difference +to one file to reproduce the other. + +This manual first concentrates on making diffs, and later shows how to +use diffs to update files. + +@sc{gnu} @command{diff} was written by Paul Eggert, Mike Haertel, +David Hayes, Richard Stallman, and Len Tower. Wayne Davison designed and +implemented the unified output format. The basic algorithm is described +in ``An O(ND) Difference Algorithm and its Variations'', Eugene W. Myers, +@cite{Algorithmica} Vol.@: 1 No.@: 2, 1986, pp.@: 251--266; and in ``A File +Comparison Program'', Webb Miller and Eugene W. Myers, +@cite{Software---Practice and Experience} Vol.@: 15 No.@: 11, 1985, +pp.@: 1025--1040. +@c From: "Gene Myers" <gene@cs.arizona.edu> +@c They are about the same basic algorithm; the Algorithmica +@c paper gives a rigorous treatment and the sub-algorithm for +@c delivering scripts and should be the primary reference, but +@c both should be mentioned. +The algorithm was independently discovered as described in +``Algorithms for Approximate String Matching'', +E. Ukkonen, @cite{Information and Control} Vol.@: 64, 1985, pp.@: 100--118. +@c From: "Gene Myers" <gene@cs.arizona.edu> +@c Date: Wed, 29 Sep 1993 08:27:55 MST +@c Ukkonen should be given credit for also discovering the algorithm used +@c in GNU diff. + +@sc{gnu} @command{diff3} was written by Randy Smith. @sc{gnu} +@command{sdiff} was written by Thomas Lord. @sc{gnu} @command{cmp} +was written by Torbjorn Granlund and David MacKenzie. + +@command{patch} was written mainly by Larry Wall and Paul Eggert; +several @sc{gnu} enhancements were contributed by Wayne Davison and +David MacKenzie. Parts of this manual are adapted from a manual page +written by Larry Wall, with his permission. + +@node Comparison +@chapter What Comparison Means +@cindex introduction + +There are several ways to think about the differences between two files. +One way to think of the differences is as a series of lines that were +deleted from, inserted in, or changed in one file to produce the other +file. @command{diff} compares two files line by line, finds groups of +lines that differ, and reports each group of differing lines. It can +report the differing lines in several formats, which have different +purposes. + +@sc{gnu} @command{diff} can show whether files are different without detailing +the differences. It also provides ways to suppress certain kinds of +differences that are not important to you. Most commonly, such +differences are changes in the amount of white space between words or +lines. @command{diff} also provides ways to suppress differences in +alphabetic case or in lines that match a regular expression that you +provide. These options can accumulate; for example, you can ignore +changes in both white space and alphabetic case. + +Another way to think of the differences between two files is as a +sequence of pairs of bytes that can be either identical or +different. @command{cmp} reports the differences between two files +byte by byte, instead of line by line. As a result, it is often +more useful than @command{diff} for comparing binary files. For text +files, @command{cmp} is useful mainly when you want to know only whether +two files are identical, or whether one file is a prefix of the other. + +To illustrate the effect that considering changes byte by byte +can have compared with considering them line by line, think of what +happens if a single newline character is added to the beginning of a +file. If that file is then compared with an otherwise identical file +that lacks the newline at the beginning, @command{diff} will report that a +blank line has been added to the file, while @command{cmp} will report that +almost every byte of the two files differs. + +@command{diff3} normally compares three input files line by line, finds +groups of lines that differ, and reports each group of differing lines. +Its output is designed to make it easy to inspect two different sets of +changes to the same file. + +@menu +* Hunks:: Groups of differing lines. +* White Space:: Suppressing differences in white space. +* Blank Lines:: Suppressing differences in blank lines. +* Case Folding:: Suppressing differences in alphabetic case. +* Specified Folding:: Suppressing differences that match regular expressions. +* Brief:: Summarizing which files are different. +* Binary:: Comparing binary files or forcing text comparisons. +@end menu + +@node Hunks +@section Hunks +@cindex hunks + +When comparing two files, @command{diff} finds sequences of lines common to +both files, interspersed with groups of differing lines called +@dfn{hunks}. Comparing two identical files yields one sequence of +common lines and no hunks, because no lines differ. Comparing two +entirely different files yields no common lines and one large hunk that +contains all lines of both files. In general, there are many ways to +match up lines between two given files. @command{diff} tries to minimize +the total hunk size by finding large sequences of common lines +interspersed with small hunks of differing lines. + +For example, suppose the file @file{F} contains the three lines +@samp{a}, @samp{b}, @samp{c}, and the file @file{G} contains the same +three lines in reverse order @samp{c}, @samp{b}, @samp{a}. If +@command{diff} finds the line @samp{c} as common, then the command +@samp{diff F G} produces this output: + +@example +1,2d0 +< a +< b +3a2,3 +> b +> a +@end example + +@noindent +But if @command{diff} notices the common line @samp{b} instead, it produces +this output: + +@example +1c1 +< a +--- +> c +3c3 +< c +--- +> a +@end example + +@noindent +It is also possible to find @samp{a} as the common line. @command{diff} +does not always find an optimal matching between the files; it takes +shortcuts to run faster. But its output is usually close to the +shortest possible. You can adjust this tradeoff with the +@option{--minimal} option (@pxref{diff Performance}). + +@node White Space +@section Suppressing Differences in Blank and Tab Spacing +@cindex blank and tab difference suppression +@cindex tab and blank difference suppression + +The @option{-E} and @option{--ignore-tab-expansion} options ignore the +distinction between tabs and spaces on input. A tab is considered to be +equivalent to the number of spaces to the next tab stop. @command{diff} +assumes that tab stops are set every 8 print columns. + +The @option{-b} and @option{--ignore-space-change} options are stronger. +They ignore white space at line end, and consider all other sequences of +one or more white space characters to be equivalent. With these +options, @command{diff} considers the following two lines to be equivalent, +where @samp{$} denotes the line end: + +@example +Here lyeth muche rychnesse in lytell space. -- John Heywood$ +Here lyeth muche rychnesse in lytell space. -- John Heywood $ +@end example + +The @option{-w} and @option{--ignore-all-space} options are stronger still. +They ignore difference even if one line has white space where +the other line has none. @dfn{White space} characters include +tab, newline, vertical tab, form feed, carriage return, and space; +some locales may define additional characters to be white space. +With these options, @command{diff} considers the +following two lines to be equivalent, where @samp{$} denotes the line +end and @samp{^M} denotes a carriage return: + +@example +Here lyeth muche rychnesse in lytell space.-- John Heywood$ + He relyeth much erychnes seinly tells pace. --John Heywood ^M$ +@end example + +@node Blank Lines +@section Suppressing Differences in Blank Lines +@cindex blank line difference suppression + +The @option{-B} and @option{--ignore-blank-lines} options ignore insertions +or deletions of blank lines. These options affect only lines +that are completely empty; they do not affect lines that look empty but +contain space or tab characters. With these options, for example, a +file containing +@example +1. A point is that which has no part. + +2. A line is breadthless length. +-- Euclid, The Elements, I +@end example +@noindent +is considered identical to a file containing +@example +1. A point is that which has no part. +2. A line is breadthless length. + + +-- Euclid, The Elements, I +@end example + +@node Case Folding +@section Suppressing Case Differences +@cindex case difference suppression + +@sc{gnu} @command{diff} can treat lower case letters as equivalent to their +upper case counterparts, so that, for example, it considers @samp{Funky +Stuff}, @samp{funky STUFF}, and @samp{fUNKy stuFf} to all be the same. +To request this, use the @option{-i} or @option{--ignore-case} option. + +@node Specified Folding +@section Suppressing Lines Matching a Regular Expression +@cindex regular expression suppression + +To ignore insertions and deletions of lines that match a +@command{grep}-style regular expression, use the @option{-I +@var{regexp}} or @option{--ignore-matching-lines=@var{regexp}} option. +You should escape +regular expressions that contain shell metacharacters to prevent the +shell from expanding them. For example, @samp{diff -I '^[[:digit:]]'} ignores +all changes to lines beginning with a digit. + +However, @option{-I} only ignores the insertion or deletion of lines that +contain the regular expression if every changed line in the hunk---every +insertion and every deletion---matches the regular expression. In other +words, for each nonignorable change, @command{diff} prints the complete set +of changes in its vicinity, including the ignorable ones. + +You can specify more than one regular expression for lines to ignore by +using more than one @option{-I} option. @command{diff} tries to match each +line against each regular expression. + +@node Brief +@section Summarizing Which Files Differ +@cindex summarizing which files differ +@cindex brief difference reports + +When you only want to find out whether files are different, and you +don't care what the differences are, you can use the summary output +format. In this format, instead of showing the differences between the +files, @command{diff} simply reports whether files differ. The @option{-q} +and @option{--brief} options select this output format. + +This format is especially useful when comparing the contents of two +directories. It is also much faster than doing the normal line by line +comparisons, because @command{diff} can stop analyzing the files as soon as +it knows that there are any differences. + +You can also get a brief indication of whether two files differ by using +@command{cmp}. For files that are identical, @command{cmp} produces no +output. When the files differ, by default, @command{cmp} outputs the byte +and line number where the first difference occurs. You can use +the @option{-s} option to suppress that information, so that @command{cmp} +produces no output and reports whether the files differ using only its +exit status (@pxref{Invoking cmp}). + +@c Fix this. +Unlike @command{diff}, @command{cmp} cannot compare directories; it can only +compare two files. + +@node Binary +@section Binary Files and Forcing Text Comparisons +@cindex binary file diff +@cindex text versus binary diff + +If @command{diff} thinks that either of the two files it is comparing is +binary (a non-text file), it normally treats that pair of files much as +if the summary output format had been selected (@pxref{Brief}), and +reports only that the binary files are different. This is because line +by line comparisons are usually not meaningful for binary files. + +@command{diff} determines whether a file is text or binary by checking the +first few bytes in the file; the exact number of bytes is system +dependent, but it is typically several thousand. If every byte in +that part of the file is non-null, @command{diff} considers the file to be +text; otherwise it considers the file to be binary. + +Sometimes you might want to force @command{diff} to consider files to be +text. For example, you might be comparing text files that contain +null characters; @command{diff} would erroneously decide that those are +non-text files. Or you might be comparing documents that are in a +format used by a word processing system that uses null characters to +indicate special formatting. You can force @command{diff} to consider all +files to be text files, and compare them line by line, by using the +@option{-a} or @option{--text} option. If the files you compare using this +option do not in fact contain text, they will probably contain few +newline characters, and the @command{diff} output will consist of hunks +showing differences between long lines of whatever characters the files +contain. + +You can also force @command{diff} to consider all files to be binary files, +and report only whether they differ (but not how). Use the +@option{-q} or @option{--brief} option for this. + +Differing binary files are considered to cause trouble because the +resulting @command{diff} output does not capture all the differences. +This trouble causes @command{diff} to exit with status 2. However, +this trouble cannot occur with the @option{--a} or @option{--text} +option, or with the @option{-q} or @option{--brief} option, as these +options both cause @command{diff} to treat binary files like text +files. + +In operating systems that distinguish between text and binary files, +@command{diff} normally reads and writes all data as text. Use the +@option{--binary} option to force @command{diff} to read and write binary +data instead. This option has no effect on a @sc{posix}-compliant system +like @sc{gnu} or traditional Unix. However, many personal computer +operating systems represent the end of a line with a carriage return +followed by a newline. On such systems, @command{diff} normally ignores +these carriage returns on input and generates them at the end of each +output line, but with the @option{--binary} option @command{diff} treats +each carriage return as just another input character, and does not +generate a carriage return at the end of each output line. This can be +useful when dealing with non-text files that are meant to be +interchanged with @sc{posix}-compliant systems. + +The @option{--strip-trailing-cr} causes @command{diff} to treat input +lines that end in carriage return followed by newline as if they end +in plain newline. This can be useful when comparing text that is +imperfectly imported from many personal computer operating systems. +This option affects how lines are read, which in turn affects how they +are compared and output. + +If you want to compare two files byte by byte, you can use the +@command{cmp} program with the @option{-l} option to show the values +of each differing byte in the two files. With @sc{gnu} @command{cmp}, +you can also use the @option{-b} option to show the @sc{ascii} +representation of those bytes. @xref{Invoking cmp}, for more +information. + +If @command{diff3} thinks that any of the files it is comparing is binary +(a non-text file), it normally reports an error, because such +comparisons are usually not useful. @command{diff3} uses the same test as +@command{diff} to decide whether a file is binary. As with @command{diff}, if +the input files contain a few non-text bytes but otherwise are like +text files, you can force @command{diff3} to consider all files to be text +files and compare them line by line by using the @option{-a} or +@option{--text} options. + +@node Output Formats +@chapter @command{diff} Output Formats +@cindex output formats +@cindex format of @command{diff} output + +@command{diff} has several mutually exclusive options for output format. +The following sections describe each format, illustrating how +@command{diff} reports the differences between two sample input files. + +@menu +* Sample diff Input:: Sample @command{diff} input files for examples. +* Normal:: Showing differences without surrounding text. +* Context:: Showing differences with the surrounding text. +* Side by Side:: Showing differences in two columns. +* Scripts:: Generating scripts for other programs. +* If-then-else:: Merging files with if-then-else. +@end menu + +@node Sample diff Input +@section Two Sample Input Files +@cindex @command{diff} sample input +@cindex sample input for @command{diff} + +Here are two sample files that we will use in numerous examples to +illustrate the output of @command{diff} and how various options can change +it. + +This is the file @file{lao}: + +@example +The Way that can be told of is not the eternal Way; +The name that can be named is not the eternal name. +The Nameless is the origin of Heaven and Earth; +The Named is the mother of all things. +Therefore let there always be non-being, + so we may see their subtlety, +And let there always be being, + so we may see their outcome. +The two are the same, +But after they are produced, + they have different names. +@end example + +This is the file @file{tzu}: + +@example +The Nameless is the origin of Heaven and Earth; +The named is the mother of all things. + +Therefore let there always be non-being, + so we may see their subtlety, +And let there always be being, + so we may see their outcome. +The two are the same, +But after they are produced, + they have different names. +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +@end example + +In this example, the first hunk contains just the first two lines of +@file{lao}, the second hunk contains the fourth line of @file{lao} +opposing the second and third lines of @file{tzu}, and the last hunk +contains just the last three lines of @file{tzu}. + +@node Normal +@section Showing Differences Without Context +@cindex normal output format +@cindex @samp{<} output format + +The ``normal'' @command{diff} output format shows each hunk of differences +without any surrounding context. Sometimes such output is the clearest +way to see how lines have changed, without the clutter of nearby +unchanged lines (although you can get similar results with the context +or unified formats by using 0 lines of context). However, this format +is no longer widely used for sending out patches; for that purpose, the +context format (@pxref{Context Format}) and the unified format +(@pxref{Unified Format}) are superior. Normal format is the default for +compatibility with older versions of @command{diff} and the @sc{posix} +standard. Use the @option{--normal} option to select this output +format explicitly. + +@menu +* Detailed Normal:: A detailed description of normal output format. +* Example Normal:: Sample output in the normal format. +@end menu + +@node Detailed Normal +@subsection Detailed Description of Normal Format + +The normal output format consists of one or more hunks of differences; +each hunk shows one area where the files differ. Normal format hunks +look like this: + +@example +@var{change-command} +< @var{from-file-line} +< @var{from-file-line}@dots{} +--- +> @var{to-file-line} +> @var{to-file-line}@dots{} +@end example + +There are three types of change commands. Each consists of a line +number or comma-separated range of lines in the first file, a single +character indicating the kind of change to make, and a line number or +comma-separated range of lines in the second file. All line numbers are +the original line numbers in each file. The types of change commands +are: + +@table @samp +@item @var{l}a@var{r} +Add the lines in range @var{r} of the second file after line @var{l} of +the first file. For example, @samp{8a12,15} means append lines 12--15 +of file 2 after line 8 of file 1; or, if changing file 2 into file 1, +delete lines 12--15 of file 2. + +@item @var{f}c@var{t} +Replace the lines in range @var{f} of the first file with lines in range +@var{t} of the second file. This is like a combined add and delete, but +more compact. For example, @samp{5,7c8,10} means change lines 5--7 of +file 1 to read as lines 8--10 of file 2; or, if changing file 2 into +file 1, change lines 8--10 of file 2 to read as lines 5--7 of file 1. + +@item @var{r}d@var{l} +Delete the lines in range @var{r} from the first file; line @var{l} is where +they would have appeared in the second file had they not been deleted. +For example, @samp{5,7d3} means delete lines 5--7 of file 1; or, if +changing file 2 into file 1, append lines 5--7 of file 1 after line 3 of +file 2. +@end table + +@node Example Normal +@subsection An Example of Normal Format + +Here is the output of the command @samp{diff lao tzu} +(@pxref{Sample diff Input}, for the complete contents of the two files). +Notice that it shows only the lines that are different between the two +files. + +@example +1,2d0 +< The Way that can be told of is not the eternal Way; +< The name that can be named is not the eternal name. +4c2,3 +< The Named is the mother of all things. +--- +> The named is the mother of all things. +> +11a11,13 +> They both may be called deep and profound. +> Deeper and more profound, +> The door of all subtleties! +@end example + +@node Context +@section Showing Differences in Their Context +@cindex context output format +@cindex @samp{!} output format + +Usually, when you are looking at the differences between files, you will +also want to see the parts of the files near the lines that differ, to +help you understand exactly what has changed. These nearby parts of the +files are called the @dfn{context}. + +@sc{gnu} @command{diff} provides two output formats that show context +around the differing lines: @dfn{context format} and @dfn{unified +format}. It can optionally show in which function or section of the +file the differing lines are found. + +If you are distributing new versions of files to other people in the +form of @command{diff} output, you should use one of the output formats +that show context so that they can apply the diffs even if they have +made small changes of their own to the files. @command{patch} can apply +the diffs in this case by searching in the files for the lines of +context around the differing lines; if those lines are actually a few +lines away from where the diff says they are, @command{patch} can adjust +the line numbers accordingly and still apply the diff correctly. +@xref{Imperfect}, for more information on using @command{patch} to apply +imperfect diffs. + +@menu +* Context Format:: An output format that shows surrounding lines. +* Unified Format:: A more compact output format that shows context. +* Sections:: Showing which sections of the files differences are in. +* Alternate Names:: Showing alternate file names in context headers. +@end menu + +@node Context Format +@subsection Context Format + +The context output format shows several lines of context around the +lines that differ. It is the standard format for distributing updates +to source code. + +To select this output format, use the @option{-C @var{lines}}, +@option{--context@r{[}=@var{lines}@r{]}}, or @option{-c} option. The +argument @var{lines} that some of these options take is the number of +lines of context to show. If you do not specify @var{lines}, it +defaults to three. For proper operation, @command{patch} typically needs +at least two lines of context. + +@menu +* Detailed Context:: A detailed description of the context output format. +* Example Context:: Sample output in context format. +* Less Context:: Another sample with less context. +@end menu + +@node Detailed Context +@subsubsection Detailed Description of Context Format + +The context output format starts with a two-line header, which looks +like this: + +@example +*** @var{from-file} @var{from-file-modification-time} +--- @var{to-file} @var{to-file-modification time} +@end example + +@noindent +@vindex LC_TIME +@cindex time stamp format, context diffs +The time stamp normally looks like @samp{2002-02-21 23:30:39.942229878 +-0800} to indicate the date, time with fractional seconds, and time +zone in @uref{ftp://ftp.isi.edu/in-notes/rfc2822.txt, Internet RFC +2822 format}. However, a traditional time stamp like @samp{Thu Feb 21 +23:30:39 2002} is used if the @env{LC_TIME} locale category is either +@samp{C} or @samp{POSIX}. + +You can change the header's content with the +@option{--label=@var{label}} option; see @ref{Alternate Names}. + +Next come one or more hunks of differences; each hunk shows one area +where the files differ. Context format hunks look like this: + +@example +*************** +*** @var{from-file-line-range} **** + @var{from-file-line} + @var{from-file-line}@dots{} +--- @var{to-file-line-range} ---- + @var{to-file-line} + @var{to-file-line}@dots{} +@end example + +The lines of context around the lines that differ start with two space +characters. The lines that differ between the two files start with one +of the following indicator characters, followed by a space character: + +@table @samp +@item ! +A line that is part of a group of one or more lines that changed between +the two files. There is a corresponding group of lines marked with +@samp{!} in the part of this hunk for the other file. + +@item + +An ``inserted'' line in the second file that corresponds to nothing in +the first file. + +@item - +A ``deleted'' line in the first file that corresponds to nothing in the +second file. +@end table + +If all of the changes in a hunk are insertions, the lines of +@var{from-file} are omitted. If all of the changes are deletions, the +lines of @var{to-file} are omitted. + +@node Example Context +@subsubsection An Example of Context Format + +Here is the output of @samp{diff -c lao tzu} (@pxref{Sample diff Input}, +for the complete contents of the two files). Notice that up to three +lines that are not different are shown around each line that is +different; they are the context lines. Also notice that the first two +hunks have run together, because their contents overlap. + +@example +*** lao 2002-02-21 23:30:39.942229878 -0800 +--- tzu 2002-02-21 23:30:50.442260588 -0800 +*************** +*** 1,7 **** +- The Way that can be told of is not the eternal Way; +- The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; +! The Named is the mother of all things. + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, +--- 1,6 ---- + The Nameless is the origin of Heaven and Earth; +! The named is the mother of all things. +! + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, +*************** +*** 9,11 **** +--- 8,13 ---- + The two are the same, + But after they are produced, + they have different names. ++ They both may be called deep and profound. ++ Deeper and more profound, ++ The door of all subtleties! +@end example + +@node Less Context +@subsubsection An Example of Context Format with Less Context + +Here is the output of @samp{diff -C 1 lao tzu} (@pxref{Sample diff +Input}, for the complete contents of the two files). Notice that at +most one context line is reported here. + +@example +*** lao 2002-02-21 23:30:39.942229878 -0800 +--- tzu 2002-02-21 23:30:50.442260588 -0800 +*************** +*** 1,5 **** +- The Way that can be told of is not the eternal Way; +- The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; +! The Named is the mother of all things. + Therefore let there always be non-being, +--- 1,4 ---- + The Nameless is the origin of Heaven and Earth; +! The named is the mother of all things. +! + Therefore let there always be non-being, +*************** +*** 11 **** +--- 10,13 ---- + they have different names. ++ They both may be called deep and profound. ++ Deeper and more profound, ++ The door of all subtleties! +@end example + +@node Unified Format +@subsection Unified Format +@cindex unified output format +@cindex @samp{+-} output format + +The unified output format is a variation on the context format that is +more compact because it omits redundant context lines. To select this +output format, use the @option{-U @var{lines}}, +@option{--unified@r{[}=@var{lines}@r{]}}, or @option{-u} +option. The argument @var{lines} is the number of lines of context to +show. When it is not given, it defaults to three. + +At present, only @sc{gnu} @command{diff} can produce this format and +only @sc{gnu} @command{patch} can automatically apply diffs in this +format. For proper operation, @command{patch} typically needs at +least three lines of context. + +@menu +* Detailed Unified:: A detailed description of unified format. +* Example Unified:: Sample output in unified format. +@end menu + +@node Detailed Unified +@subsubsection Detailed Description of Unified Format + +The unified output format starts with a two-line header, which looks +like this: + +@example +--- @var{from-file} @var{from-file-modification-time} ++++ @var{to-file} @var{to-file-modification-time} +@end example + +@noindent +@cindex time stamp format, unified diffs +The time stamp looks like @samp{2002-02-21 23:30:39.942229878 -0800} +to indicate the date, time with fractional seconds, and time zone. + +You can change the header's content with the +@option{--label=@var{label}} option; see @xref{Alternate Names}. + +Next come one or more hunks of differences; each hunk shows one area +where the files differ. Unified format hunks look like this: + +@example +@@@@ @var{from-file-range} @var{to-file-range} @@@@ + @var{line-from-either-file} + @var{line-from-either-file}@dots{} +@end example + +The lines common to both files begin with a space character. The lines +that actually differ between the two files have one of the following +indicator characters in the left print column: + +@table @samp +@item + +A line was added here to the first file. + +@item - +A line was removed here from the first file. +@end table + +@node Example Unified +@subsubsection An Example of Unified Format + +Here is the output of the command @samp{diff -u lao tzu} +(@pxref{Sample diff Input}, for the complete contents of the two files): + +@example +--- lao 2002-02-21 23:30:39.942229878 -0800 ++++ tzu 2002-02-21 23:30:50.442260588 -0800 +@@@@ -1,7 +1,6 @@@@ +-The Way that can be told of is not the eternal Way; +-The name that can be named is not the eternal name. + The Nameless is the origin of Heaven and Earth; +-The Named is the mother of all things. ++The named is the mother of all things. ++ + Therefore let there always be non-being, + so we may see their subtlety, + And let there always be being, +@@@@ -9,3 +8,6 @@@@ + The two are the same, + But after they are produced, + they have different names. ++They both may be called deep and profound. ++Deeper and more profound, ++The door of all subtleties! +@end example + +@node Sections +@subsection Showing Which Sections Differences Are in +@cindex headings +@cindex section headings + +Sometimes you might want to know which part of the files each change +falls in. If the files are source code, this could mean which function +was changed. If the files are documents, it could mean which chapter or +appendix was changed. @sc{gnu} @command{diff} can show this by displaying the +nearest section heading line that precedes the differing lines. Which +lines are ``section headings'' is determined by a regular expression. + +@menu +* Specified Headings:: Showing headings that match regular expressions. +* C Function Headings:: Showing headings of C functions. +@end menu + +@node Specified Headings +@subsubsection Showing Lines That Match Regular Expressions +@cindex specified headings +@cindex regular expression matching headings + +To show in which sections differences occur for files that are not +source code for C or similar languages, use the @option{-F @var{regexp}} +or @option{--show-function-line=@var{regexp}} option. @command{diff} +considers lines that match the @command{grep}-style regular expression +@var{regexp} to be the beginning +of a section of the file. Here are suggested regular expressions for +some common languages: + +@c Please add to this list, e.g. Fortran, Pascal, Perl, Python. +@table @samp +@item ^[[:alpha:]$_] +C, C++, Prolog +@item ^( +Lisp +@item ^@@node +Texinfo +@end table + +This option does not automatically select an output format; in order to +use it, you must select the context format (@pxref{Context Format}) or +unified format (@pxref{Unified Format}). In other output formats it +has no effect. + +The @option{-F} and @option{--show-function-line} options find the nearest +unchanged line that precedes each hunk of differences and matches the +given regular expression. Then they add that line to the end of the +line of asterisks in the context format, or to the @samp{@@@@} line in +unified format. If no matching line exists, they leave the output for +that hunk unchanged. If that line is more than 40 characters long, they +output only the first 40 characters. You can specify more than one +regular expression for such lines; @command{diff} tries to match each line +against each regular expression, starting with the last one given. This +means that you can use @option{-p} and @option{-F} together, if you wish. + +@node C Function Headings +@subsubsection Showing C Function Headings +@cindex C function headings +@cindex function headings, C + +To show in which functions differences occur for C and similar +languages, you can use the @option{-p} or @option{--show-c-function} option. +This option automatically defaults to the context output format +(@pxref{Context Format}), with the default number of lines of context. +You can override that number with @option{-C @var{lines}} elsewhere in the +command line. You can override both the format and the number with +@option{-U @var{lines}} elsewhere in the command line. + +The @option{-p} and @option{--show-c-function} options are equivalent to +@option{-F '^[[:alpha:]$_]'} if the unified format is specified, otherwise +@option{-c -F '^[[:alpha:]$_]'} (@pxref{Specified Headings}). @sc{gnu} +@command{diff} provides them for the sake of convenience. + +@node Alternate Names +@subsection Showing Alternate File Names +@cindex alternate file names +@cindex file name alternates + +If you are comparing two files that have meaningless or uninformative +names, you might want @command{diff} to show alternate names in the header +of the context and unified output formats. To do this, use the +@option{--label=@var{label}} option. The first time +you give this option, its argument replaces the name and date of the +first file in the header; the second time, its argument replaces the +name and date of the second file. If you give this option more than +twice, @command{diff} reports an error. The @option{--label} option does not +affect the file names in the @command{pr} header when the @option{-l} or +@option{--paginate} option is used (@pxref{Pagination}). + +Here are the first two lines of the output from @samp{diff -C 2 +--label=original --label=modified lao tzu}: + +@example +*** original +--- modified +@end example + +@node Side by Side +@section Showing Differences Side by Side +@cindex side by side +@cindex two-column output +@cindex columnar output + +@command{diff} can produce a side by side difference listing of two files. +The files are listed in two columns with a gutter between them. The +gutter contains one of the following markers: + +@table @asis +@item white space +The corresponding lines are in common. That is, either the lines are +identical, or the difference is ignored because of one of the +@option{--ignore} options (@pxref{White Space}). + +@item @samp{|} +The corresponding lines differ, and they are either both complete +or both incomplete. + +@item @samp{<} +The files differ and only the first file contains the line. + +@item @samp{>} +The files differ and only the second file contains the line. + +@item @samp{(} +Only the first file contains the line, but the difference is ignored. + +@item @samp{)} +Only the second file contains the line, but the difference is ignored. + +@item @samp{\} +The corresponding lines differ, and only the first line is incomplete. + +@item @samp{/} +The corresponding lines differ, and only the second line is incomplete. +@end table + +Normally, an output line is incomplete if and only if the lines that it +contains are incomplete; @xref{Incomplete Lines}. However, when an +output line represents two differing lines, one might be incomplete +while the other is not. In this case, the output line is complete, +but its the gutter is marked @samp{\} if the first line is incomplete, +@samp{/} if the second line is. + +Side by side format is sometimes easiest to read, but it has limitations. +It generates much wider output than usual, and truncates lines that are +too long to fit. Also, it relies on lining up output more heavily than +usual, so its output looks particularly bad if you use varying +width fonts, nonstandard tab stops, or nonprinting characters. + +You can use the @command{sdiff} command to interactively merge side by side +differences. @xref{Interactive Merging}, for more information on merging files. + +@menu +* Side by Side Format:: Controlling side by side output format. +* Example Side by Side:: Sample side by side output. +@end menu + +@node Side by Side Format +@subsection Controlling Side by Side Format +@cindex side by side format + +The @option{-y} or @option{--side-by-side} option selects side by side +format. Because side by side output lines contain two input lines, the +output is wider than usual: normally 130 print columns, which can fit +onto a traditional printer line. You can set the width of the output +with the @option{-W @var{columns}} or @option{--width=@var{columns}} +option. The output is split into two halves of equal width, separated by a +small gutter to mark differences; the right half is aligned to a tab +stop so that tabs line up. Input lines that are too long to fit in half +of an output line are truncated for output. + +The @option{--left-column} option prints only the left column of two +common lines. The @option{--suppress-common-lines} option suppresses +common lines entirely. + +@node Example Side by Side +@subsection An Example of Side by Side Format + +Here is the output of the command @samp{diff -y -W 72 lao tzu} +(@pxref{Sample diff Input}, for the complete contents of the two files). + +@example +The Way that can be told of is n < +The name that can be named is no < +The Nameless is the origin of He The Nameless is the origin of He +The Named is the mother of all t | The named is the mother of all t + > +Therefore let there always be no Therefore let there always be no + so we may see their subtlety, so we may see their subtlety, +And let there always be being, And let there always be being, + so we may see their outcome. so we may see their outcome. +The two are the same, The two are the same, +But after they are produced, But after they are produced, + they have different names. they have different names. + > They both may be called deep and + > Deeper and more profound, + > The door of all subtleties! +@end example + +@node Scripts +@section Making Edit Scripts +@cindex script output formats + +Several output modes produce command scripts for editing @var{from-file} +to produce @var{to-file}. + +@menu +* ed Scripts:: Using @command{diff} to produce commands for @command{ed}. +* Forward ed:: Making forward @command{ed} scripts. +* RCS:: A special @command{diff} output format used by @sc{rcs}. +@end menu + +@node ed Scripts +@subsection @command{ed} Scripts +@cindex @command{ed} script output format + +@command{diff} can produce commands that direct the @command{ed} text editor +to change the first file into the second file. Long ago, this was the +only output mode that was suitable for editing one file into another +automatically; today, with @command{patch}, it is almost obsolete. Use the +@option{-e} or @option{--ed} option to select this output format. + +Like the normal format (@pxref{Normal}), this output format does not +show any context; unlike the normal format, it does not include the +information necessary to apply the diff in reverse (to produce the first +file if all you have is the second file and the diff). + +If the file @file{d} contains the output of @samp{diff -e old new}, then +the command @samp{(cat d && echo w) | ed - old} edits @file{old} to make +it a copy of @file{new}. More generally, if @file{d1}, @file{d2}, +@dots{}, @file{dN} contain the outputs of @samp{diff -e old new1}, +@samp{diff -e new1 new2}, @dots{}, @samp{diff -e newN-1 newN}, +respectively, then the command @samp{(cat d1 d2 @dots{} dN && echo w) | +ed - old} edits @file{old} to make it a copy of @file{newN}. + +@menu +* Detailed ed:: A detailed description of @command{ed} format. +* Example ed:: A sample @command{ed} script. +@end menu + +@node Detailed ed +@subsubsection Detailed Description of @command{ed} Format + +The @command{ed} output format consists of one or more hunks of +differences. The changes closest to the ends of the files come first so +that commands that change the number of lines do not affect how +@command{ed} interprets line numbers in succeeding commands. @command{ed} +format hunks look like this: + +@example +@var{change-command} +@var{to-file-line} +@var{to-file-line}@dots{} +. +@end example + +Because @command{ed} uses a single period on a line to indicate the end of +input, @sc{gnu} @command{diff} protects lines of changes that contain a single +period on a line by writing two periods instead, then writing a +subsequent @command{ed} command to change the two periods into one. The +@command{ed} format cannot represent an incomplete line, so if the second +file ends in a changed incomplete line, @command{diff} reports an error and +then pretends that a newline was appended. + +There are three types of change commands. Each consists of a line +number or comma-separated range of lines in the first file and a single +character indicating the kind of change to make. All line numbers are +the original line numbers in the file. The types of change commands +are: + +@table @samp +@item @var{l}a +Add text from the second file after line @var{l} in the first file. For +example, @samp{8a} means to add the following lines after line 8 of file +1. + +@item @var{r}c +Replace the lines in range @var{r} in the first file with the following +lines. Like a combined add and delete, but more compact. For example, +@samp{5,7c} means change lines 5--7 of file 1 to read as the text file +2. + +@item @var{r}d +Delete the lines in range @var{r} from the first file. For example, +@samp{5,7d} means delete lines 5--7 of file 1. +@end table + +@node Example ed +@subsubsection Example @command{ed} Script + +Here is the output of @samp{diff -e lao tzu} (@pxref{Sample +diff Input}, for the complete contents of the two files): + +@example +11a +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +. +4c +The named is the mother of all things. + +. +1,2d +@end example + +@node Forward ed +@subsection Forward @command{ed} Scripts +@cindex forward @command{ed} script output format + +@command{diff} can produce output that is like an @command{ed} script, but +with hunks in forward (front to back) order. The format of the commands +is also changed slightly: command characters precede the lines they +modify, spaces separate line numbers in ranges, and no attempt is made +to disambiguate hunk lines consisting of a single period. Like +@command{ed} format, forward @command{ed} format cannot represent incomplete +lines. + +Forward @command{ed} format is not very useful, because neither @command{ed} +nor @command{patch} can apply diffs in this format. It exists mainly for +compatibility with older versions of @command{diff}. Use the @option{-f} or +@option{--forward-ed} option to select it. + +@node RCS +@subsection @sc{rcs} Scripts +@cindex @sc{rcs} script output format + +The @sc{rcs} output format is designed specifically for use by the Revision +Control System, which is a set of free programs used for organizing +different versions and systems of files. Use the @option{-n} or +@option{--rcs} option to select this output format. It is like the +forward @command{ed} format (@pxref{Forward ed}), but it can represent +arbitrary changes to the contents of a file because it avoids the +forward @command{ed} format's problems with lines consisting of a single +period and with incomplete lines. Instead of ending text sections with +a line consisting of a single period, each command specifies the number +of lines it affects; a combination of the @samp{a} and @samp{d} +commands are used instead of @samp{c}. Also, if the second file ends +in a changed incomplete line, then the output also ends in an +incomplete line. + +Here is the output of @samp{diff -n lao tzu} (@pxref{Sample +diff Input}, for the complete contents of the two files): + +@example +d1 2 +d4 1 +a4 2 +The named is the mother of all things. + +a11 3 +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +@end example + +@node If-then-else +@section Merging Files with If-then-else +@cindex merged output format +@cindex if-then-else output format +@cindex C if-then-else output format +@cindex @command{ifdef} output format + +You can use @command{diff} to merge two files of C source code. The output +of @command{diff} in this format contains all the lines of both files. +Lines common to both files are output just once; the differing parts are +separated by the C preprocessor directives @code{#ifdef @var{name}} or +@code{#ifndef @var{name}}, @code{#else}, and @code{#endif}. When +compiling the output, you select which version to use by either defining +or leaving undefined the macro @var{name}. + +To merge two files, use @command{diff} with the @option{-D @var{name}} or +@option{--ifdef=@var{name}} option. The argument @var{name} is the C +preprocessor identifier to use in the @code{#ifdef} and @code{#ifndef} +directives. + +For example, if you change an instance of @code{wait (&s)} to +@code{waitpid (-1, &s, 0)} and then merge the old and new files with +the @option{--ifdef=HAVE_WAITPID} option, then the affected part of your code +might look like this: + +@example + do @{ +#ifndef HAVE_WAITPID + if ((w = wait (&s)) < 0 && errno != EINTR) +#else /* HAVE_WAITPID */ + if ((w = waitpid (-1, &s, 0)) < 0 && errno != EINTR) +#endif /* HAVE_WAITPID */ + return w; + @} while (w != child); +@end example + +You can specify formats for languages other than C by using line group +formats and line formats, as described in the next sections. + +@menu +* Line Group Formats:: Formats for general if-then-else line groups. +* Line Formats:: Formats for each line in a line group. +* Detailed If-then-else:: A detailed description of if-then-else format. +* Example If-then-else:: Sample if-then-else format output. +@end menu + +@node Line Group Formats +@subsection Line Group Formats +@cindex line group formats +@cindex formats for if-then-else line groups + +Line group formats let you specify formats suitable for many +applications that allow if-then-else input, including programming +languages and text formatting languages. A line group format specifies +the output format for a contiguous group of similar lines. + +For example, the following command compares the TeX files @file{old} +and @file{new}, and outputs a merged file in which old regions are +surrounded by @samp{\begin@{em@}}-@samp{\end@{em@}} lines, and new +regions are surrounded by @samp{\begin@{bf@}}-@samp{\end@{bf@}} lines. + +@example +diff \ + --old-group-format='\begin@{em@} +%<\end@{em@} +' \ + --new-group-format='\begin@{bf@} +%>\end@{bf@} +' \ + old new +@end example + +The following command is equivalent to the above example, but it is a +little more verbose, because it spells out the default line group formats. + +@example +diff \ + --old-group-format='\begin@{em@} +%<\end@{em@} +' \ + --new-group-format='\begin@{bf@} +%>\end@{bf@} +' \ + --unchanged-group-format='%=' \ + --changed-group-format='\begin@{em@} +%<\end@{em@} +\begin@{bf@} +%>\end@{bf@} +' \ + old new +@end example + +Here is a more advanced example, which outputs a diff listing with +headers containing line numbers in a ``plain English'' style. + +@example +diff \ + --unchanged-group-format='' \ + --old-group-format='-------- %dn line%(n=1?:s) deleted at %df: +%<' \ + --new-group-format='-------- %dN line%(N=1?:s) added after %de: +%>' \ + --changed-group-format='-------- %dn line%(n=1?:s) changed at %df: +%<-------- to: +%>' \ + old new +@end example + +To specify a line group format, use @command{diff} with one of the options +listed below. You can specify up to four line group formats, one for +each kind of line group. You should quote @var{format}, because it +typically contains shell metacharacters. + +@table @option +@item --old-group-format=@var{format} +These line groups are hunks containing only lines from the first file. +The default old group format is the same as the changed group format if +it is specified; otherwise it is a format that outputs the line group as-is. + +@item --new-group-format=@var{format} +These line groups are hunks containing only lines from the second +file. The default new group format is same as the changed group +format if it is specified; otherwise it is a format that outputs the +line group as-is. + +@item --changed-group-format=@var{format} +These line groups are hunks containing lines from both files. The +default changed group format is the concatenation of the old and new +group formats. + +@item --unchanged-group-format=@var{format} +These line groups contain lines common to both files. The default +unchanged group format is a format that outputs the line group as-is. +@end table + +In a line group format, ordinary characters represent themselves; +conversion specifications start with @samp{%} and have one of the +following forms. + +@table @samp +@item %< +stands for the lines from the first file, including the trailing newline. +Each line is formatted according to the old line format (@pxref{Line Formats}). + +@item %> +stands for the lines from the second file, including the trailing newline. +Each line is formatted according to the new line format. + +@item %= +stands for the lines common to both files, including the trailing newline. +Each line is formatted according to the unchanged line format. + +@item %% +stands for @samp{%}. + +@item %c'@var{C}' +where @var{C} is a single character, stands for @var{C}. +@var{C} may not be a backslash or an apostrophe. +For example, @samp{%c':'} stands for a colon, even inside +the then-part of an if-then-else format, which a colon would +normally terminate. + +@item %c'\@var{O}' +where @var{O} is a string of 1, 2, or 3 octal digits, +stands for the character with octal code @var{O}. +For example, @samp{%c'\0'} stands for a null character. + +@item @var{F}@var{n} +where @var{F} is a @code{printf} conversion specification and @var{n} is one +of the following letters, stands for @var{n}'s value formatted with @var{F}. + +@table @samp +@item e +The line number of the line just before the group in the old file. + +@item f +The line number of the first line in the group in the old file; +equals @var{e} + 1. + +@item l +The line number of the last line in the group in the old file. + +@item m +The line number of the line just after the group in the old file; +equals @var{l} + 1. + +@item n +The number of lines in the group in the old file; equals @var{l} - @var{f} + 1. + +@item E, F, L, M, N +Likewise, for lines in the new file. + +@end table + +@vindex LC_NUMERIC +The @code{printf} conversion specification can be @samp{%d}, +@samp{%o}, @samp{%x}, or @samp{%X}, specifying decimal, octal, +lower case hexadecimal, or upper case hexadecimal output +respectively. After the @samp{%} the following options can appear in +sequence: a series of zero or more flags; an integer +specifying the minimum field width; and a period followed by an +optional integer specifying the minimum number of digits. +The flags are @samp{-} for left-justification, @samp{'} for separating +the digit into groups as specified by the @env{LC_NUMERIC} locale category, +and @samp{0} for padding with zeros instead of spaces. +For example, @samp{%5dN} prints the number of new lines in the group +in a field of width 5 characters, using the @code{printf} format @code{"%5d"}. + +@item (@var{A}=@var{B}?@var{T}:@var{E}) +If @var{A} equals @var{B} then @var{T} else @var{E}. +@var{A} and @var{B} are each either a decimal constant +or a single letter interpreted as above. +This format spec is equivalent to @var{T} if +@var{A}'s value equals @var{B}'s; otherwise it is equivalent to @var{E}. + +For example, @samp{%(N=0?no:%dN) line%(N=1?:s)} is equivalent to +@samp{no lines} if @var{N} (the number of lines in the group in the the +new file) is 0, to @samp{1 line} if @var{N} is 1, and to @samp{%dN lines} +otherwise. +@end table + +@node Line Formats +@subsection Line Formats +@cindex line formats + +Line formats control how each line taken from an input file is +output as part of a line group in if-then-else format. + +For example, the following command outputs text with a one-character +change indicator to the left of the text. The first character of output +is @samp{-} for deleted lines, @samp{|} for added lines, and a space for +unchanged lines. The formats contain newline characters where newlines +are desired on output. + +@example +diff \ + --old-line-format='-%l +' \ + --new-line-format='|%l +' \ + --unchanged-line-format=' %l +' \ + old new +@end example + +To specify a line format, use one of the following options. You should +quote @var{format}, since it often contains shell metacharacters. + +@table @option +@item --old-line-format=@var{format} +formats lines just from the first file. + +@item --new-line-format=@var{format} +formats lines just from the second file. + +@item --unchanged-line-format=@var{format} +formats lines common to both files. + +@item --line-format=@var{format} +formats all lines; in effect, it sets all three above options simultaneously. +@end table + +In a line format, ordinary characters represent themselves; +conversion specifications start with @samp{%} and have one of the +following forms. + +@table @samp +@item %l +stands for the contents of the line, not counting its trailing +newline (if any). This format ignores whether the line is incomplete; +@xref{Incomplete Lines}. + +@item %L +stands for the contents of the line, including its trailing newline +(if any). If a line is incomplete, this format preserves its +incompleteness. + +@item %% +stands for @samp{%}. + +@item %c'@var{C}' +where @var{C} is a single character, stands for @var{C}. +@var{C} may not be a backslash or an apostrophe. +For example, @samp{%c':'} stands for a colon. + +@item %c'\@var{O}' +where @var{O} is a string of 1, 2, or 3 octal digits, +stands for the character with octal code @var{O}. +For example, @samp{%c'\0'} stands for a null character. + +@item @var{F}n +where @var{F} is a @code{printf} conversion specification, +stands for the line number formatted with @var{F}. +For example, @samp{%.5dn} prints the line number using the +@code{printf} format @code{"%.5d"}. @xref{Line Group Formats}, for +more about printf conversion specifications. + +@end table + +The default line format is @samp{%l} followed by a newline character. + +If the input contains tab characters and it is important that they line +up on output, you should ensure that @samp{%l} or @samp{%L} in a line +format is just after a tab stop (e.g.@: by preceding @samp{%l} or +@samp{%L} with a tab character), or you should use the @option{-t} or +@option{--expand-tabs} option. + +Taken together, the line and line group formats let you specify many +different formats. For example, the following command uses a format +similar to normal @command{diff} format. You can tailor this command +to get fine control over @command{diff} output. + +@example +diff \ + --old-line-format='< %l +' \ + --new-line-format='> %l +' \ + --old-group-format='%df%(f=l?:,%dl)d%dE +%<' \ + --new-group-format='%dea%dF%(F=L?:,%dL) +%>' \ + --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL) +%<--- +%>' \ + --unchanged-group-format='' \ + old new +@end example + +@node Detailed If-then-else +@subsection Detailed Description of If-then-else Format + +For lines common to both files, @command{diff} uses the unchanged line +group format. For each hunk of differences in the merged output +format, if the hunk contains only lines from the first file, +@command{diff} uses the old line group format; if the hunk contains only +lines from the second file, @command{diff} uses the new group format; +otherwise, @command{diff} uses the changed group format. + +The old, new, and unchanged line formats specify the output format of +lines from the first file, lines from the second file, and lines common +to both files, respectively. + +The option @option{--ifdef=@var{name}} is equivalent to +the following sequence of options using shell syntax: + +@example +--old-group-format='#ifndef @var{name} +%<#endif /* ! @var{name} */ +' \ +--new-group-format='#ifdef @var{name} +%>#endif /* @var{name} */ +' \ +--unchanged-group-format='%=' \ +--changed-group-format='#ifndef @var{name} +%<#else /* @var{name} */ +%>#endif /* @var{name} */ +' +@end example + +You should carefully check the @command{diff} output for proper nesting. +For example, when using the @option{-D @var{name}} or +@option{--ifdef=@var{name}} option, you should check that if the +differing lines contain any of the C preprocessor directives +@samp{#ifdef}, @samp{#ifndef}, @samp{#else}, @samp{#elif}, or +@samp{#endif}, they are nested properly and match. If they don't, you +must make corrections manually. It is a good idea to carefully check +the resulting code anyway to make sure that it really does what you +want it to; depending on how the input files were produced, the output +might contain duplicate or otherwise incorrect code. + +The @command{patch} @option{-D @var{name}} option behaves like +the @command{diff} @option{-D @var{name}} option, except it operates on +a file and a diff to produce a merged file; @xref{patch Options}. + +@node Example If-then-else +@subsection An Example of If-then-else Format + +Here is the output of @samp{diff -DTWO lao tzu} (@pxref{Sample +diff Input}, for the complete contents of the two files): + +@example +#ifndef TWO +The Way that can be told of is not the eternal Way; +The name that can be named is not the eternal name. +#endif /* ! TWO */ +The Nameless is the origin of Heaven and Earth; +#ifndef TWO +The Named is the mother of all things. +#else /* TWO */ +The named is the mother of all things. + +#endif /* TWO */ +Therefore let there always be non-being, + so we may see their subtlety, +And let there always be being, + so we may see their outcome. +The two are the same, +But after they are produced, + they have different names. +#ifdef TWO +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +#endif /* TWO */ +@end example + +@node Incomplete Lines +@chapter Incomplete Lines +@cindex incomplete lines +@cindex full lines +@cindex newline treatment by @command{diff} + +When an input file ends in a non-newline character, its last line is +called an @dfn{incomplete line} because its last character is not a +newline. All other lines are called @dfn{full lines} and end in a +newline character. Incomplete lines do not match full lines unless +differences in white space are ignored (@pxref{White Space}). + +An incomplete line is normally distinguished on output from a full line +by a following line that starts with @samp{\}. However, the @sc{rcs} format +(@pxref{RCS}) outputs the incomplete line as-is, without any trailing +newline or following line. The side by side format normally represents +incomplete lines as-is, but in some cases uses a @samp{\} or @samp{/} +gutter marker; @xref{Side by Side}. The if-then-else line format +preserves a line's incompleteness with @samp{%L}, and discards the +newline with @samp{%l}; @xref{Line Formats}. Finally, with the +@command{ed} and forward @command{ed} output formats (@pxref{Output Formats}) +@command{diff} cannot represent an incomplete line, so it pretends there +was a newline and reports an error. + +For example, suppose @file{F} and @file{G} are one-byte files that +contain just @samp{f} and @samp{g}, respectively. Then @samp{diff F G} +outputs + +@example +1c1 +< f +\ No newline at end of file +--- +> g +\ No newline at end of file +@end example + +@noindent +(The exact message may differ in non-English locales.) +@samp{diff -n F G} outputs the following without a trailing newline: + +@example +d1 1 +a1 1 +g +@end example + +@noindent +@samp{diff -e F G} reports two errors and outputs the following: + +@example +1c +g +. +@end example + +@node Comparing Directories +@chapter Comparing Directories + +@vindex LC_COLLATE +You can use @command{diff} to compare some or all of the files in two +directory trees. When both file name arguments to @command{diff} are +directories, it compares each file that is contained in both +directories, examining file names in alphabetical order as specified by +the @env{LC_COLLATE} locale category. Normally +@command{diff} is silent about pairs of files that contain no differences, +but if you use the @option{-s} or @option{--report-identical-files} option, +it reports pairs of identical files. Normally @command{diff} reports +subdirectories common to both directories without comparing +subdirectories' files, but if you use the @option{-r} or +@option{--recursive} option, it compares every corresponding pair of files +in the directory trees, as many levels deep as they go. + +For file names that are in only one of the directories, @command{diff} +normally does not show the contents of the file that exists; it reports +only that the file exists in that directory and not in the other. You +can make @command{diff} act as though the file existed but was empty in the +other directory, so that it outputs the entire contents of the file that +actually exists. (It is output as either an insertion or a +deletion, depending on whether it is in the first or the second +directory given.) To do this, use the @option{-N} or @option{--new-file} +option. + +If the older directory contains one or more large files that are not in +the newer directory, you can make the patch smaller by using the +@option{--unidirectional-new-file} option instead of @option{-N}. +This option is like @option{-N} except that it only inserts the contents +of files that appear in the second directory but not the first (that is, +files that were added). At the top of the patch, write instructions for +the user applying the patch to remove the files that were deleted before +applying the patch. @xref{Making Patches}, for more discussion of +making patches for distribution. + +To ignore some files while comparing directories, use the @option{-x +@var{pattern}} or @option{--exclude=@var{pattern}} option. This option +ignores any files or subdirectories whose base names match the shell +pattern @var{pattern}. Unlike in the shell, a period at the start of +the base of a file name matches a wildcard at the start of a pattern. +You should enclose @var{pattern} in quotes so that the shell does not +expand it. For example, the option @option{-x '*.[ao]'} ignores any file +whose name ends with @samp{.a} or @samp{.o}. + +This option accumulates if you specify it more than once. For example, +using the options @option{-x 'RCS' -x '*,v'} ignores any file or +subdirectory whose base name is @samp{RCS} or ends with @samp{,v}. + +If you need to give this option many times, you can instead put the +patterns in a file, one pattern per line, and use the @option{-X +@var{file}} or @option{--exclude-from=@var{file}} option. + +If you have been comparing two directories and stopped partway through, +later you might want to continue where you left off. You can do this by +using the @option{-S @var{file}} or @option{--starting-file=@var{file}} +option. This compares only the file @var{file} and all alphabetically +later files in the topmost directory level. + +If two directories differ only in that file names are lower case in +one directory and upper case in the upper, @command{diff} normally +reports many differences because it compares file names in a +case sensitive way. With the @option{--ignore-file-name-case} option, +@command{diff} ignores case differences in file names, so that for example +the contents of the file @file{Tao} in one directory are compared to +the contents of the file @file{TAO} in the other. The +@option{--no-ignore-file-name-case} option cancels the effect of the +@option{--ignore-file-name-case} option, reverting to the default +behavior. + +If an @option{-x @var{pattern}}, @option{--exclude=@var{pattern}}, +@option{-X @var{file}}, or @option{--exclude-from=@var{file}} option +is specified while the @option{--ignore-file-name-case} option is in +effect, case is ignored when excluding file names matching the +specified patterns. + +@node Adjusting Output +@chapter Making @command{diff} Output Prettier + +@command{diff} provides several ways to adjust the appearance of its output. +These adjustments can be applied to any output format. + +@menu +* Tabs:: Preserving the alignment of tab stops. +* Pagination:: Page numbering and time-stamping @command{diff} output. +@end menu + +@node Tabs +@section Preserving Tab Stop Alignment +@cindex tab stop alignment +@cindex aligning tab stops + +The lines of text in some of the @command{diff} output formats are preceded +by one or two characters that indicate whether the text is inserted, +deleted, or changed. The addition of those characters can cause tabs to +move to the next tab stop, throwing off the alignment of columns in the +line. @sc{gnu} @command{diff} provides two ways to make tab-aligned columns +line up correctly. + +The first way is to have @command{diff} convert all tabs into the correct +number of spaces before outputting them; select this method with the +@option{-t} or @option{--expand-tabs} option. @command{diff} assumes that +tab stops are set every 8 print columns. To use this form of output with +@command{patch}, you must give @command{patch} the @option{-l} or +@option{--ignore-white-space} option (@pxref{Changed White Space}, for more +information). + +The other method for making tabs line up correctly is to add a tab +character instead of a space after the indicator character at the +beginning of the line. This ensures that all following tab characters +are in the same position relative to tab stops that they were in the +original files, so that the output is aligned correctly. Its +disadvantage is that it can make long lines too long to fit on one line +of the screen or the paper. It also does not work with the unified +output format, which does not have a space character after the change +type indicator character. Select this method with the @option{-T} or +@option{--initial-tab} option. + +@node Pagination +@section Paginating @command{diff} Output +@cindex paginating @command{diff} output + +It can be convenient to have long output page-numbered and time-stamped. +The @option{-l} and @option{--paginate} options do this by sending the +@command{diff} output through the @command{pr} program. Here is what the page +header might look like for @samp{diff -lc lao tzu}: + +@example +2002-02-22 14:20 diff -lc lao tzu Page 1 +@end example + +@node diff Performance +@chapter @command{diff} Performance Tradeoffs +@cindex performance of @command{diff} + +@sc{gnu} @command{diff} runs quite efficiently; however, in some circumstances +you can cause it to run faster or produce a more compact set of changes. + +One way to improve @command{diff} performance is to use hard or +symbolic links to files instead of copies. This improves performance +because @command{diff} normally does not need to read two hard or +symbolic links to the same file, since their contents must be +identical. For example, suppose you copy a large directory hierarchy, +make a few changes to the copy, and then often use @samp{diff -r} to +compare the original to the copy. If the original files are +read-only, you can greatly improve performance by creating the copy +using hard or symbolic links (e.g., with @sc{gnu} @samp{cp -lR} or +@samp{cp -sR}). Before editing a file in the copy for the first time, +you should break the link and replace it with a regular copy. + +You can also affect the performance of @sc{gnu} @command{diff} by +giving it options that change the way it compares files. +Performance has more than one dimension. These options improve one +aspect of performance at the cost of another, or they improve +performance in some cases while hurting it in others. + +The way that @sc{gnu} @command{diff} determines which lines have changed always +comes up with a near-minimal set of differences. Usually it is good +enough for practical purposes. If the @command{diff} output is large, you +might want @command{diff} to use a modified algorithm that sometimes +produces a smaller set of differences. The @option{-d} or +@option{--minimal} option does this; however, it can also cause +@command{diff} to run more slowly than usual, so it is not the default +behavior. + +When the files you are comparing are large and have small groups of +changes scattered throughout them, you can use the +@option{--speed-large-files} option to make a different modification to +the algorithm that @command{diff} uses. If the input files have a constant +small density of changes, this option speeds up the comparisons without +changing the output. If not, @command{diff} might produce a larger set of +differences; however, the output will still be correct. + +Normally @command{diff} discards the prefix and suffix that is common to +both files before it attempts to find a minimal set of differences. +This makes @command{diff} run faster, but occasionally it may produce +non-minimal output. The @option{--horizon-lines=@var{lines}} option +prevents @command{diff} from discarding the last @var{lines} lines of the +prefix and the first @var{lines} lines of the suffix. This gives +@command{diff} further opportunities to find a minimal output. + +Suppose a run of changed lines includes a sequence of lines at one end +and there is an identical sequence of lines just outside the other end. +The @command{diff} command is free to choose which identical sequence is +included in the hunk. In this case, @command{diff} normally shifts the +hunk's boundaries when this merges adjacent hunks, or shifts a hunk's +lines towards the end of the file. Merging hunks can make the output +look nicer in some cases. + +@node Comparing Three Files +@chapter Comparing Three Files +@cindex comparing three files +@cindex format of @command{diff3} output + +Use the program @command{diff3} to compare three files and show any +differences among them. (@command{diff3} can also merge files; see +@ref{diff3 Merging}). + +The ``normal'' @command{diff3} output format shows each hunk of +differences without surrounding context. Hunks are labeled depending +on whether they are two-way or three-way, and lines are annotated by +their location in the input files. + +@xref{Invoking diff3}, for more information on how to run @command{diff3}. + +@menu +* Sample diff3 Input:: Sample @command{diff3} input for examples. +* Detailed diff3 Normal:: A detailed description of normal output format. +* diff3 Hunks:: The format of normal output format. +* Example diff3 Normal:: Sample output in the normal format. +@end menu + +@node Sample diff3 Input +@section A Third Sample Input File +@cindex @command{diff3} sample input +@cindex sample input for @command{diff3} + +Here is a third sample file that will be used in examples to illustrate +the output of @command{diff3} and how various options can change it. The +first two files are the same that we used for @command{diff} (@pxref{Sample +diff Input}). This is the third sample file, called @file{tao}: + +@example +The Way that can be told of is not the eternal Way; +The name that can be named is not the eternal name. +The Nameless is the origin of Heaven and Earth; +The named is the mother of all things. + +Therefore let there always be non-being, + so we may see their subtlety, +And let there always be being, + so we may see their result. +The two are the same, +But after they are produced, + they have different names. + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +@end example + +@node Detailed diff3 Normal +@section Detailed Description of @command{diff3} Normal Format + +Each hunk begins with a line marked @samp{====}. Three-way hunks have +plain @samp{====} lines, and two-way hunks have @samp{1}, @samp{2}, or +@samp{3} appended to specify which of the three input files differ in +that hunk. The hunks contain copies of two or three sets of input +lines each preceded by one or two commands identifying where the lines +came from. + +Normally, two spaces precede each copy of an input line to distinguish +it from the commands. But with the @option{-T} or @option{--initial-tab} +option, @command{diff3} uses a tab instead of two spaces; this lines up +tabs correctly. @xref{Tabs}, for more information. + +Commands take the following forms: + +@table @samp +@item @var{file}:@var{l}a +This hunk appears after line @var{l} of file @var{file}, and +contains no lines in that file. To edit this file to yield the other +files, one must append hunk lines taken from the other files. For +example, @samp{1:11a} means that the hunk follows line 11 in the first +file and contains no lines from that file. + +@item @var{file}:@var{r}c +This hunk contains the lines in the range @var{r} of file @var{file}. +The range @var{r} is a comma-separated pair of line numbers, or just one +number if the range is a singleton. To edit this file to yield the +other files, one must change the specified lines to be the lines taken +from the other files. For example, @samp{2:11,13c} means that the hunk +contains lines 11 through 13 from the second file. +@end table + +If the last line in a set of input lines is incomplete +(@pxref{Incomplete Lines}), it is distinguished on output from a full +line by a following line that starts with @samp{\}. + +@node diff3 Hunks +@section @command{diff3} Hunks +@cindex hunks for @command{diff3} +@cindex @command{diff3} hunks + +Groups of lines that differ in two or three of the input files are +called @dfn{diff3 hunks}, by analogy with @command{diff} hunks +(@pxref{Hunks}). If all three input files differ in a @command{diff3} +hunk, the hunk is called a @dfn{three-way hunk}; if just two input files +differ, it is a @dfn{two-way hunk}. + +As with @command{diff}, several solutions are possible. When comparing the +files @samp{A}, @samp{B}, and @samp{C}, @command{diff3} normally finds +@command{diff3} hunks by merging the two-way hunks output by the two +commands @samp{diff A B} and @samp{diff A C}. This does not necessarily +minimize the size of the output, but exceptions should be rare. + +For example, suppose @file{F} contains the three lines @samp{a}, +@samp{b}, @samp{f}, @file{G} contains the lines @samp{g}, @samp{b}, +@samp{g}, and @file{H} contains the lines @samp{a}, @samp{b}, +@samp{h}. @samp{diff3 F G H} might output the following: + +@example +====2 +1:1c +3:1c + a +2:1c + g +==== +1:3c + f +2:3c + g +3:3c + h +@end example + +@noindent +because it found a two-way hunk containing @samp{a} in the first and +third files and @samp{g} in the second file, then the single line +@samp{b} common to all three files, then a three-way hunk containing +the last line of each file. + +@node Example diff3 Normal +@section An Example of @command{diff3} Normal Format + +Here is the output of the command @samp{diff3 lao tzu tao} +(@pxref{Sample diff3 Input}, for the complete contents of the files). +Notice that it shows only the lines that are different among the three +files. + +@example +====2 +1:1,2c +3:1,2c + The Way that can be told of is not the eternal Way; + The name that can be named is not the eternal name. +2:0a +====1 +1:4c + The Named is the mother of all things. +2:2,3c +3:4,5c + The named is the mother of all things. + +====3 +1:8c +2:7c + so we may see their outcome. +3:9c + so we may see their result. +==== +1:11a +2:11,13c + They both may be called deep and profound. + Deeper and more profound, + The door of all subtleties! +3:13,14c + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +@end example + +@node diff3 Merging +@chapter Merging From a Common Ancestor +@cindex merging from a common ancestor + +When two people have made changes to copies of the same file, +@command{diff3} can produce a merged output that contains both sets of +changes together with warnings about conflicts. + +One might imagine programs with names like @command{diff4} and @command{diff5} +to compare more than three files simultaneously, but in practice the +need rarely arises. You can use @command{diff3} to merge three or more +sets of changes to a file by merging two change sets at a time. + +@command{diff3} can incorporate changes from two modified versions into a +common preceding version. This lets you merge the sets of changes +represented by the two newer files. Specify the common ancestor version +as the second argument and the two newer versions as the first and third +arguments, like this: + +@example +diff3 @var{mine} @var{older} @var{yours} +@end example + +@noindent +You can remember the order of the arguments by noting that they are in +alphabetical order. + +@cindex conflict +@cindex overlap +You can think of this as subtracting @var{older} from @var{yours} and +adding the result to @var{mine}, or as merging into @var{mine} the +changes that would turn @var{older} into @var{yours}. This merging is +well-defined as long as @var{mine} and @var{older} match in the +neighborhood of each such change. This fails to be true when all three +input files differ or when only @var{older} differs; we call this +a @dfn{conflict}. When all three input files differ, we call the +conflict an @dfn{overlap}. + +@command{diff3} gives you several ways to handle overlaps and conflicts. +You can omit overlaps or conflicts, or select only overlaps, +or mark conflicts with special @samp{<<<<<<<} and @samp{>>>>>>>} lines. + +@command{diff3} can output the merge results as an @command{ed} script that +that can be applied to the first file to yield the merged output. +However, it is usually better to have @command{diff3} generate the merged +output directly; this bypasses some problems with @command{ed}. + +@menu +* Which Changes:: Selecting changes to incorporate. +* Marking Conflicts:: Marking conflicts. +* Bypassing ed:: Generating merged output directly. +* Merging Incomplete Lines:: How @command{diff3} merges incomplete lines. +* Saving the Changed File:: Emulating System V behavior. +@end menu + +@node Which Changes +@section Selecting Which Changes to Incorporate +@cindex overlapping change, selection of +@cindex unmerged change + +You can select all unmerged changes from @var{older} to @var{yours} for merging +into @var{mine} with the @option{-e} or @option{--ed} option. You can +select only the nonoverlapping unmerged changes with @option{-3} or +@option{--easy-only}, and you can select only the overlapping changes with +@option{-x} or @option{--overlap-only}. + +The @option{-e}, @option{-3} and @option{-x} options select only +@dfn{unmerged changes}, i.e.@: changes where @var{mine} and @var{yours} +differ; they ignore changes from @var{older} to @var{yours} where +@var{mine} and @var{yours} are identical, because they assume that such +changes have already been merged. If this assumption is not a safe +one, you can use the @option{-A} or @option{--show-all} option +(@pxref{Marking Conflicts}). + +Here is the output of the command @command{diff3} with each of these three +options (@pxref{Sample diff3 Input}, for the complete contents of the files). +Notice that @option{-e} outputs the union of the disjoint sets of changes +output by @option{-3} and @option{-x}. + +Output of @samp{diff3 -e lao tzu tao}: +@example +11a + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +. +8c + so we may see their result. +. +@end example + +Output of @samp{diff3 -3 lao tzu tao}: +@example +8c + so we may see their result. +. +@end example + +Output of @samp{diff3 -x lao tzu tao}: +@example +11a + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +. +@end example + +@node Marking Conflicts +@section Marking Conflicts +@cindex conflict marking +@cindex @samp{<<<<<<<} for marking conflicts + +@command{diff3} can mark conflicts in the merged output by +bracketing them with special marker lines. A conflict +that comes from two files @var{A} and @var{B} is marked as follows: + +@example +<<<<<<< @var{A} +@r{lines from @var{A}} +======= +@r{lines from @var{B}} +>>>>>>> @var{B} +@end example + +A conflict that comes from three files @var{A}, @var{B} and @var{C} is +marked as follows: + +@example +<<<<<<< @var{A} +@r{lines from @var{A}} +||||||| @var{B} +@r{lines from @var{B}} +======= +@r{lines from @var{C}} +>>>>>>> @var{C} +@end example + +The @option{-A} or @option{--show-all} option acts like the @option{-e} +option, except that it brackets conflicts, and it outputs all changes +from @var{older} to @var{yours}, not just the unmerged changes. Thus, +given the sample input files (@pxref{Sample diff3 Input}), @samp{diff3 +-A lao tzu tao} puts brackets around the conflict where only @file{tzu} +differs: + +@example +<<<<<<< tzu +======= +The Way that can be told of is not the eternal Way; +The name that can be named is not the eternal name. +>>>>>>> tao +@end example + +And it outputs the three-way conflict as follows: + +@example +<<<<<<< lao +||||||| tzu +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +>>>>>>> tao +@end example + +The @option{-E} or @option{--show-overlap} option outputs less information +than the @option{-A} or @option{--show-all} option, because it outputs only +unmerged changes, and it never outputs the contents of the second +file. Thus the @option{-E} option acts like the @option{-e} option, +except that it brackets the first and third files from three-way +overlapping changes. Similarly, @option{-X} acts like @option{-x}, except +it brackets all its (necessarily overlapping) changes. For example, +for the three-way overlapping change above, the @option{-E} and @option{-X} +options output the following: + +@example +<<<<<<< lao +======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +>>>>>>> tao +@end example + +If you are comparing files that have meaningless or uninformative names, +you can use the @option{-L @var{label}} or @option{--label=@var{label}} +option to show alternate names in the @samp{<<<<<<<}, @samp{|||||||} +and @samp{>>>>>>>} brackets. This option can be given up to three +times, once for each input file. Thus @samp{diff3 -A -L X -L Y -L Z A +B C} acts like @samp{diff3 -A A B C}, except that the output looks like +it came from files named @samp{X}, @samp{Y} and @samp{Z} rather than +from files named @samp{A}, @samp{B} and @samp{C}. + +@node Bypassing ed +@section Generating the Merged Output Directly +@cindex merged @command{diff3} format + +With the @option{-m} or @option{--merge} option, @command{diff3} outputs the +merged file directly. This is more efficient than using @command{ed} to +generate it, and works even with non-text files that @command{ed} would +reject. If you specify @option{-m} without an @command{ed} script option, +@option{-A} (@option{--show-all}) is assumed. + +For example, the command @samp{diff3 -m lao tzu tao} +(@pxref{Sample diff3 Input} for a copy of the input files) would output +the following: + +@example +<<<<<<< tzu +======= +The Way that can be told of is not the eternal Way; +The name that can be named is not the eternal name. +>>>>>>> tao +The Nameless is the origin of Heaven and Earth; +The Named is the mother of all things. +Therefore let there always be non-being, + so we may see their subtlety, +And let there always be being, + so we may see their result. +The two are the same, +But after they are produced, + they have different names. +<<<<<<< lao +||||||| tzu +They both may be called deep and profound. +Deeper and more profound, +The door of all subtleties! +======= + + -- The Way of Lao-Tzu, tr. Wing-tsit Chan +>>>>>>> tao +@end example + +@node Merging Incomplete Lines +@section How @command{diff3} Merges Incomplete Lines +@cindex incomplete line merging + +With @option{-m}, incomplete lines (@pxref{Incomplete Lines}) are simply +copied to the output as they are found; if the merged output ends in an +conflict and one of the input files ends in an incomplete +line, succeeding @samp{|||||||}, @samp{=======} or @samp{>>>>>>>} +brackets appear somewhere other than the start of a line because +they are appended to the incomplete line. + +Without @option{-m}, if an @command{ed} script option is specified and an +incomplete line is found, @command{diff3} generates a warning and acts as +if a newline had been present. + +@node Saving the Changed File +@section Saving the Changed File +@cindex System V @command{diff3} compatibility + +Traditional Unix @command{diff3} generates an @command{ed} script without the +trailing @samp{w} and @samp{q} commands that save the changes. +System V @command{diff3} generates these extra commands. @sc{gnu} +@command{diff3} normally behaves like traditional Unix +@command{diff3}, but with the @option{-i} option it behaves like +System V @command{diff3} and appends the @samp{w} and @samp{q} +commands. + +The @option{-i} option requires one of the @command{ed} script options +@option{-AeExX3}, and is incompatible with the merged output option +@option{-m}. + +@node Interactive Merging +@chapter Interactive Merging with @command{sdiff} +@cindex diff merging +@cindex interactive merging + +With @command{sdiff}, you can merge two files interactively based on a +side-by-side @option{-y} format comparison (@pxref{Side by Side}). Use +@option{-o @var{file}} or @option{--output=@var{file}} to specify where to +put the merged text. @xref{Invoking sdiff}, for more details on the +options to @command{sdiff}. + +Another way to merge files interactively is to use the Emacs Lisp +package @command{emerge}. @xref{emerge, , emerge, emacs, The @sc{gnu} Emacs +Manual}, for more information. + +@menu +* sdiff Option Summary:: Summary of @command{sdiff} options. +* Merge Commands:: Merging two files interactively. +@end menu + +@node sdiff Option Summary +@section Specifying @command{diff} Options to @command{sdiff} +@cindex @command{sdiff} output format + +The following @command{sdiff} options have the same meaning as for +@command{diff}. @xref{diff Options}, for the use of these options. + +@example +-a -b -d -i -t -v +-B -E -I @var{regexp} + +--ignore-blank-lines --ignore-case +--ignore-matching-lines=@var{regexp} --ignore-space-change +--ignore-tab-expansion +--left-column --minimal --speed-large-files +--strip-trailing-cr --suppress-common-lines --expand-tabs +--text --version --width=@var{columns} +@end example + +For historical reasons, @command{sdiff} has alternate names for some +options. The @option{-l} option is equivalent to the +@option{--left-column} option, and similarly @option{-s} is equivalent +to @option{--suppress-common-lines}. The meaning of the @command{sdiff} +@option{-w} and @option{-W} options is interchanged from that of +@command{diff}: with @command{sdiff}, @option{-w @var{columns}} is +equivalent to @option{--width=@var{columns}}, and @option{-W} is +equivalent to @option{--ignore-all-space}. @command{sdiff} without the +@option{-o} option is equivalent to @command{diff} with the @option{-y} +or @option{--side-by-side} option (@pxref{Side by Side}). + +@node Merge Commands +@section Merge Commands +@cindex merge commands +@cindex merging interactively + +Groups of common lines, with a blank gutter, are copied from the first +file to the output. After each group of differing lines, @command{sdiff} +prompts with @samp{%} and pauses, waiting for one of the following +commands. Follow each command with @key{RET}. + +@table @samp +@item e +Discard both versions. +Invoke a text editor on an empty temporary file, +then copy the resulting file to the output. + +@item eb +Concatenate the two versions, edit the result in a temporary file, +then copy the edited result to the output. + +@item ed +Like @samp{eb}, except precede each version with a header that +shows what file and lines the version came from. + +@item el +Edit a copy of the left version, then copy the result to the output. + +@item er +Edit a copy of the right version, then copy the result to the output. + +@item l +Copy the left version to the output. + +@item q +Quit. + +@item r +Copy the right version to the output. + +@item s +Silently copy common lines. + +@item v +Verbosely copy common lines. This is the default. +@end table + +@vindex EDITOR +The text editor invoked is specified by the @env{EDITOR} environment +variable if it is set. The default is system-dependent. + +@node Merging with patch +@chapter Merging with @command{patch} + +@command{patch} takes comparison output produced by @command{diff} and applies +the differences to a copy of the original file, producing a patched +version. With @command{patch}, you can distribute just the changes to a +set of files instead of distributing the entire file set; your +correspondents can apply @command{patch} to update their copy of the files +with your changes. @command{patch} automatically determines the diff +format, skips any leading or trailing headers, and uses the headers to +determine which file to patch. This lets your correspondents feed a +mail message containing a difference listing directly to +@command{patch}. + +@command{patch} detects and warns about common problems like forward +patches. It saves any patches that it could not apply. It can also maintain a +@code{patchlevel.h} file to ensure that your correspondents apply +diffs in the proper order. + +@command{patch} accepts a series of diffs in its standard input, usually +separated by headers that specify which file to patch. It applies +@command{diff} hunks (@pxref{Hunks}) one by one. If a hunk does not +exactly match the original file, @command{patch} uses heuristics to try to +patch the file as well as it can. If no approximate match can be found, +@command{patch} rejects the hunk and skips to the next hunk. @command{patch} +normally replaces each file @var{f} with its new version, putting reject +hunks (if any) into @samp{@var{f}.rej}. + +@xref{Invoking patch}, for detailed information on the options to +@command{patch}. + +@menu +* patch Input:: Selecting the type of @command{patch} input. +* Revision Control:: Getting files from @sc{rcs}, @sc{sccs}, etc. +* Imperfect:: Dealing with imperfect patches. +* Creating and Removing:: Creating and removing files with a patch. +* Patching Time Stamps:: Updating time stamps on patched files. +* Multiple Patches:: Handling multiple patches in a file. +* patch Directories:: Changing directory and stripping directories. +* Backups:: Whether backup files are made. +* Backup Names:: Backup file names. +* Reject Names:: Reject file names. +* patch Messages:: Messages and questions @command{patch} can produce. +* patch and POSIX:: Conformance to the @sc{posix} standard. +* patch and Tradition:: @sc{gnu} versus traditional @command{patch}. +@end menu + +@node patch Input +@section Selecting the @command{patch} Input Format +@cindex @command{patch} input format + +@command{patch} normally determines which @command{diff} format the patch +file uses by examining its contents. For patch files that contain +particularly confusing leading text, you might need to use one of the +following options to force @command{patch} to interpret the patch file as a +certain format of diff. The output formats listed here are the only +ones that @command{patch} can understand. + +@table @option +@item -c +@itemx --context +context diff. + +@item -e +@itemx --ed +@command{ed} script. + +@item -n +@itemx --normal +normal diff. + +@item -u +@itemx --unified +unified diff. +@end table + +@node Revision Control +@section Revision Control +@cindex revision control +@cindex version control +@cindex @sc{rcs} +@cindex ClearCase +@cindex @sc{sccs} + +If a nonexistent input file is under a revision control system +supported by @command{patch}, @command{patch} normally asks the user +whether to get (or check out) the file from the revision control +system. Patch currently supports @sc{rcs}, ClearCase and @sc{sccs}. +Under @sc{rcs} and @sc{sccs}, @command{patch} also asks when the input +file is read-only and matches the default version in the revision +control system. + +@vindex PATCH_GET +The @option{-g @var{num}} or @option{--get=@var{num}} affects access +to files under supported revision control systems. If @var{num} is +positive, @command{patch} gets the file without asking the user; if +zero, @command{patch} neither asks the user nor gets the file; and if +negative, @command{patch} asks the user before getting the file. The +default value of @var{num} is given by the value of the +@env{PATCH_GET} environment variable if it is set; if not, the default +value is zero if @command{patch} is conforming to @sc{posix}, negative +otherwise. @xref{patch and POSIX}. + +@vindex VERSION_CONTROL +The choice of revision control system is unaffected by the +@env{VERSION_CONTROL} environment variable (@pxref{Backup Names}). + +@node Imperfect +@section Applying Imperfect Patches +@cindex imperfect patch application + +@command{patch} tries to skip any leading text in the patch file, +apply the diff, and then skip any trailing text. Thus you can feed a +mail message directly to @command{patch}, and it should work. If the +entire diff is indented by a constant amount of white space, +@command{patch} automatically ignores the indentation. If a context +diff contains trailing carriage return on each line, @command{patch} +automatically ignores the carriage return. If a context diff has been +encapsulated by prepending @w{@samp{- }} to lines beginning with @samp{-} +as per @uref{ftp://ftp.isi.edu/in-notes/rfc934.txt, Internet RFC 934}, +@command{patch} automatically unencapsulates the input. + +However, certain other types of imperfect input require user +intervention or testing. + +@menu +* Changed White Space:: When tabs and spaces don't match exactly. +* Reversed Patches:: Applying reversed patches correctly. +* Inexact:: Helping @command{patch} find close matches. +* Dry Runs:: Predicting what @command{patch} will do. +@end menu + +@node Changed White Space +@subsection Applying Patches with Changed White Space +@cindex white space in patches + +Sometimes mailers, editors, or other programs change spaces into tabs, +or vice versa. If this happens to a patch file or an input file, the +files might look the same, but @command{patch} will not be able to match +them properly. If this problem occurs, use the @option{-l} or +@option{--ignore-white-space} option, which makes @command{patch} compare +blank characters (i.e.@: spaces and tabs) loosely so that any nonempty +sequence of blanks in the patch file matches any nonempty sequence of +blanks in the input files. Non-blank +characters must still match exactly. Each line of the context must +still match a line in the input file. + +@node Reversed Patches +@subsection Applying Reversed Patches +@cindex reversed patches + +Sometimes people run @command{diff} with the new file first instead of +second. This creates a diff that is ``reversed''. To apply such +patches, give @command{patch} the @option{-R} or @option{--reverse} option. +@command{patch} then attempts to swap each hunk around before applying it. +Rejects come out in the swapped format. + +Often @command{patch} can guess that the patch is reversed. If the first +hunk of a patch fails, @command{patch} reverses the hunk to see if it can +apply it that way. If it can, @command{patch} asks you if you want to have +the @option{-R} option set; if it can't, @command{patch} continues to apply +the patch normally. This method cannot detect a reversed patch if it is +a normal diff and the first command is an append (which should have been +a delete) since appends always succeed, because a null context matches +anywhere. But most patches add or change lines rather than delete them, +so most reversed normal diffs begin with a delete, which fails, and +@command{patch} notices. + +If you apply a patch that you have already applied, @command{patch} thinks +it is a reversed patch and offers to un-apply the patch. This could be +construed as a feature. If you did this inadvertently and you don't +want to un-apply the patch, just answer @samp{n} to this offer and to +the subsequent ``apply anyway'' question---or type @kbd{C-c} to kill the +@command{patch} process. + +@node Inexact +@subsection Helping @command{patch} Find Inexact Matches +@cindex inexact patches +@cindex fuzz factor when patching + +For context diffs, and to a lesser extent normal diffs, @command{patch} can +detect when the line numbers mentioned in the patch are incorrect, and +it attempts to find the correct place to apply each hunk of the patch. +As a first guess, it takes the line number mentioned in the hunk, plus +or minus any offset used in applying the previous hunk. If that is not +the correct place, @command{patch} scans both forward and backward for a +set of lines matching the context given in the hunk. + +First @command{patch} looks for a place where all lines of the context +match. If it cannot find such a place, and it is reading a context or +unified diff, and the maximum fuzz factor is set to 1 or more, then +@command{patch} makes another scan, ignoring the first and last line of +context. If that fails, and the maximum fuzz factor is set to 2 or +more, it makes another scan, ignoring the first two and last two lines +of context are ignored. It continues similarly if the maximum fuzz +factor is larger. + +The @option{-F @var{lines}} or @option{--fuzz=@var{lines}} option sets the +maximum fuzz factor to @var{lines}. This option only applies to context +and unified diffs; it ignores up to @var{lines} lines while looking for +the place to install a hunk. Note that a larger fuzz factor increases +the odds of making a faulty patch. The default fuzz factor is 2; there +is no point to setting it to more than the number of lines of context +in the diff, ordinarily 3. + +If @command{patch} cannot find a place to install a hunk of the patch, it +writes the hunk out to a reject file (@pxref{Reject Names}, for information +on how reject files are named). It writes out rejected hunks in context +format no matter what form the input patch is in. If the input is a +normal or @command{ed} diff, many of the contexts are simply null. The +line numbers on the hunks in the reject file may be different from those +in the patch file: they show the approximate location where @command{patch} +thinks the failed hunks belong in the new file rather than in the old +one. + +If the @option{--verbose} option is given, then +as it completes each hunk @command{patch} tells you whether the hunk +succeeded or failed, and if it failed, on which line (in the new file) +@command{patch} thinks the hunk should go. If this is different from the +line number specified in the diff, it tells you the offset. A single +large offset @emph{may} indicate that @command{patch} installed a hunk in +the wrong place. @command{patch} also tells you if it used a fuzz factor +to make the match, in which case you should also be slightly suspicious. + +@command{patch} cannot tell if the line numbers are off in an @command{ed} +script, and can only detect wrong line numbers in a normal diff when it +finds a change or delete command. It may have the same problem with a +context diff using a fuzz factor equal to or greater than the number of +lines of context shown in the diff (typically 3). In these cases, you +should probably look at a context diff between your original and patched +input files to see if the changes make sense. Compiling without errors +is a pretty good indication that the patch worked, but not a guarantee. + +A patch against an empty file applies to a nonexistent file, and vice +versa. @xref{Creating and Removing}. + +@command{patch} usually produces the correct results, even when it must +make many guesses. However, the results are guaranteed only when +the patch is applied to an exact copy of the file that the patch was +generated from. + +@node Dry Runs +@subsection Predicting what @command{patch} will do +@cindex testing @command{patch} +@cindex dry runs for @command{patch} + +It may not be obvious in advance what @command{patch} will do with a +complicated or poorly formatted patch. If you are concerned that the +input might cause @command{patch} to modify the wrong files, you can +use the @option{--dry-run} option, which causes @command{patch} to +print the results of applying patches without actually changing any +files. You can then inspect the diagnostics generated by the dry run +to see whether @command{patch} will modify the files that you expect. +If the patch does not do what you want, you can modify the patch (or +the other options to @command{patch}) and try another dry run. Once +you are satisfied with the proposed patch you can apply it by invoking +@command{patch} as before, but this time without the +@option{--dry-run} option. + +@node Creating and Removing +@section Creating and Removing Files +@cindex creating files +@cindex empty files, removing +@cindex removing empty files + +Sometimes when comparing two directories, a file may exist in one +directory but not the other. If you give @command{diff} the +@option{-N} or @option{--new-file} option, or if you supply an old or +new file that is named @file{/dev/null} or is empty and is dated the +Epoch (1970-01-01 00:00:00 UTC), @command{diff} outputs a patch that +adds or deletes the contents of this file. When given such a patch, +@command{patch} normally creates a new file or removes the old file. +However, when conforming to @sc{posix} (@pxref{patch and POSIX}), +@command{patch} does not remove the old file, but leaves it empty. +The @option{-E} or @option{--remove-empty-files} option causes +@command{patch} to remove output files that are empty after applying a +patch, even if the patch does not appear to be one that removed the +file. + +If the patch appears to create a file that already exists, +@command{patch} asks for confirmation before applying the patch. + +@node Patching Time Stamps +@section Updating Time Stamps on Patched Files +@cindex time stamps on patched files + +When @command{patch} updates a file, it normally sets the file's +last-modified time stamp to the current time of day. If you are using +@command{patch} to track a software distribution, this can cause +@command{make} to incorrectly conclude that a patched file is out of +date. For example, if @file{syntax.c} depends on @file{syntax.y}, and +@command{patch} updates @file{syntax.c} and then @file{syntax.y}, then +@file{syntax.c} will normally appear to be out of date with respect to +@file{syntax.y} even though its contents are actually up to date. + +The @option{-Z} or @option{--set-utc} option causes @command{patch} to +set a patched file's modification and access times to the time stamps +given in context diff headers. If the context diff headers do not +specify a time zone, they are assumed to use Coordinated Universal +Time (@sc{utc}, often known as @sc{gmt}). + +The @option{-T} or @option{--set-time} option acts like @option{-Z} or +@option{--set-utc}, except that it assumes that the context diff +headers' time stamps use local time instead of @sc{utc}. This option +is not recommended, because patches using local time cannot easily be +used by people in other time zones, and because local time stamps are +ambiguous when local clocks move backwards during daylight-saving time +adjustments. If the context diff headers specify a time zone, this +option is equivalent to @option{-Z} or @option{--set-utc}. + +@command{patch} normally refrains from setting a file's time stamps if +the file's original last-modified time stamp does not match the time +given in the diff header, of if the file's contents do not exactly +match the patch. However, if the @option{-f} or @option{--force} +option is given, the file's time stamps are set regardless. + +Due to the limitations of the current @command{diff} format, +@command{patch} cannot update the times of files whose contents have +not changed. Also, if you set file time stamps to values other than +the current time of day, you should also remove (e.g., with @samp{make +clean}) all files that depend on the patched files, so that later +invocations of @command{make} do not get confused by the patched +files' times. + +@node Multiple Patches +@section Multiple Patches in a File +@cindex multiple patches +@cindex intuiting file names from patches + +If the patch file contains more than one patch, and if you do not +specify an input file on the command line, @command{patch} tries to +apply each patch as if they came from separate patch files. This +means that it determines the name of the file to patch for each patch, +and that it examines the leading text before each patch for file names +and prerequisite revision level (@pxref{Making Patches}, for more on +that topic). + +@command{patch} uses the following rules to intuit a file name from +the leading text before a patch. First, @command{patch} takes an +ordered list of candidate file names as follows: + +@itemize @bullet +@item +If the header is that of a context diff, @command{patch} takes the old +and new file names in the header. A name is ignored if it does not +have enough slashes to satisfy the @option{-p@var{num}} or +@option{--strip=@var{num}} option. The name @file{/dev/null} is also +ignored. + +@item +If there is an @samp{Index:} line in the leading garbage and if either +the old and new names are both absent or if @command{patch} is +conforming to @sc{posix}, @command{patch} takes the name in the +@samp{Index:} line. + +@item +For the purpose of the following rules, the candidate file names are +considered to be in the order (old, new, index), regardless of the +order that they appear in the header. +@end itemize + +@noindent +Then @command{patch} selects a file name from the candidate list as +follows: + +@itemize @bullet +@item +If some of the named files exist, @command{patch} selects the first +name if conforming to @sc{posix}, and the best name otherwise. + +@item +If @command{patch} is not ignoring @sc{rcs}, ClearCase, and @sc{sccs} +(@pxref{Revision Control}), and no named files exist but an @sc{rcs}, +ClearCase, or @sc{sccs} master is found, @command{patch} selects the +first named file with an @sc{rcs}, ClearCase, or @sc{sccs} master. + +@item +If no named files exist, no @sc{rcs}, ClearCase, or @sc{sccs} master +was found, some names are given, @command{patch} is not conforming to +@sc{posix}, and the patch appears to create a file, @command{patch} +selects the best name requiring the creation of the fewest +directories. + +@item +If no file name results from the above heuristics, you are asked for +the name of the file to patch, and @command{patch} selects that name. +@end itemize + +To determine the @dfn{best} of a nonempty list of file names, +@command{patch} first takes all the names with the fewest path name +components; of those, it then takes all the names with the shortest +basename; of those, it then takes all the shortest names; finally, it +takes the first remaining name. + +@xref{patch and POSIX}, to see whether @command{patch} is conforming +to @sc{posix}. + +@node patch Directories +@section Applying Patches in Other Directories +@cindex directories and patch +@cindex patching directories + +The @option{-d @var{directory}} or @option{--directory=@var{directory}} +option to @command{patch} makes directory @var{directory} the current +directory for interpreting both file names in the patch file, and file +names given as arguments to other options (such as @option{-B} and +@option{-o}). For example, while in a mail reading program, you can patch +a file in the @file{/usr/src/emacs} directory directly from a message +containing the patch like this: + +@example +| patch -d /usr/src/emacs +@end example + +Sometimes the file names given in a patch contain leading directories, +but you keep your files in a directory different from the one given in +the patch. In those cases, you can use the +@option{-p@var{number}} or @option{--strip=@var{number}} +option to set the file name strip count to @var{number}. The strip +count tells @command{patch} how many slashes, along with the directory +names between them, to strip from the front of file names. A sequence +of one or more adjacent slashes is counted as a single slash. By +default, @command{patch} strips off all leading directories, leaving +just the base file names. + +For example, suppose the file name in the patch file is +@file{/gnu/src/emacs/etc/NEWS}. Using @option{-p0} gives the +entire file name unmodified, @option{-p1} gives +@file{gnu/src/emacs/etc/NEWS} (no leading slash), @option{-p4} gives +@file{etc/NEWS}, and not specifying @option{-p} at all gives @file{NEWS}. + +@command{patch} looks for each file (after any slashes have been stripped) +in the current directory, or if you used the @option{-d @var{directory}} +option, in that directory. + +@node Backups +@section Backup Files +@cindex backup file strategy + +Normally, @command{patch} creates a backup file if the patch does not +exactly match the original input file, because in that case the +original data might not be recovered if you undo the patch with +@samp{patch -R} (@pxref{Reversed Patches}). However, when conforming +to @sc{posix}, @command{patch} does not create backup files by +default. @xref{patch and POSIX}. + +The @option{-b} or @option{--backup} option causes @command{patch} to +make a backup file regardless of whether the patch matches the +original input. The @option{--backup-if-mismatch} option causes +@command{patch} to create backup files for mismatches files; this is +the default when not conforming to @sc{posix}. The +@option{--no-backup-if-mismatch} option causes @command{patch} to not +create backup files, even for mismatched patches; this is the default +when conforming to @sc{posix}. + +When backing up a file that does not exist, an empty, unreadable +backup file is created as a placeholder to represent the nonexistent +file. + +@node Backup Names +@section Backup File Names +@cindex backup file names + +Normally, @command{patch} renames an original input file into a backup +file by appending to its name the extension @samp{.orig}, or @samp{~} +if using @samp{.orig} would make the backup file name too +long.@footnote{A coding error in @sc{gnu} @command{patch} version +2.5.4 causes it to always use @samp{~}, but this should be fixed in +the next release.} The @option{-z @var{backup-suffix}} or +@option{--suffix=@var{backup-suffix}} option causes @command{patch} to +use @var{backup-suffix} as the backup extension instead. + +@vindex SIMPLE_BACKUP_SUFFIX +Alternately, you can specify the extension for backup files with the +@env{SIMPLE_BACKUP_SUFFIX} environment variable, which the options +override. + +@command{patch} can also create numbered backup files the way @sc{gnu} Emacs +does. With this method, instead of having a single backup of each file, +@command{patch} makes a new backup file name each time it patches a file. +For example, the backups of a file named @file{sink} would be called, +successively, @file{sink.~1~}, @file{sink.~2~}, @file{sink.~3~}, etc. + +@vindex PATCH_VERSION_CONTROL +@vindex VERSION_CONTROL +The @option{-V @var{backup-style}} or +@option{--version-control=@var{backup-style}} option takes as an +argument a method for creating backup file names. You can alternately +control the type of backups that @command{patch} makes with the +@env{PATCH_VERSION_CONTROL} environment variable, which the +@option{-V} option overrides. If @env{PATCH_VERSION_CONTROL} is not +set, the @env{VERSION_CONTROL} environment variable is used instead. +Please note that these options and variables control backup file +names; they do not affect the choice of revision control system +(@pxref{Revision Control}). + +The values of these environment variables and the argument to the +@option{-V} option are like the @sc{gnu} Emacs @code{version-control} +variable (@pxref{Backup Names, , , emacs, The @sc{gnu} Emacs Manual}, +for more information on backup versions in Emacs). They also +recognize synonyms that are more descriptive. The valid values are +listed below; unique abbreviations are acceptable. + +@table @option +@item t +@itemx numbered +Always make numbered backups. + +@item nil +@itemx existing +Make numbered backups of files that already have them, simple backups of +the others. This is the default. + +@item never +@itemx simple +Always make simple backups. +@end table + +You can also tell @command{patch} to prepend a prefix, such as a +directory name, to produce backup file names. The @option{-B +@var{prefix}} or @option{--prefix=@var{prefix}} option makes backup +files by prepending @var{prefix} to them. The @option{-Y +@var{prefix}} or @option{--basename-prefix=@var{prefix}} prepends +@var{prefix} to the last file name component of backup file names +instead; for example, @option{-Y ~} causes the backup name for +@file{dir/file.c} to be @file{dir/~file.c}. If you use either of +these prefix options, the suffix-based options are ignored. + +If you specify the output file with the @option{-o} option, that file is +the one that is backed up, not the input file. + +Options that affect the names of backup files do not affect whether +backups are made. For example, if you specify the +@option{--no-backup-if-mismatch} option, none of the options described +in this section have any affect, because no backups are made. + +@node Reject Names +@section Reject File Names +@cindex reject file names + +The names for reject files (files containing patches that +@command{patch} could not find a place to apply) are normally the name +of the output file with @samp{.rej} appended (or @samp{#} if if using +@samp{.rej} would make the backup file name too long). + +Alternatively, you can tell @command{patch} to place all of the rejected +patches in a single file. The @option{-r @var{reject-file}} or +@option{--reject-file=@var{reject-file}} option uses @var{reject-file} as +the reject file name. + +@node patch Messages +@section Messages and Questions from @command{patch} +@cindex @command{patch} messages and questions +@cindex diagnostics from @command{patch} +@cindex messages from @command{patch} + +@command{patch} can produce a variety of messages, especially if it +has trouble decoding its input. In a few situations where it's not +sure how to proceed, @command{patch} normally prompts you for more +information from the keyboard. There are options to produce more or +fewer messages, to have it not ask for keyboard input, and to +affect the way that file names are quoted in messages. + +@menu +* More or Fewer Messages:: Controlling the verbosity of @command{patch}. +* patch and Keyboard Input:: Inhibiting keyboard input. +* patch Quoting Style:: Quoting file names in diagnostics. +@end menu + +@command{patch} exits with status 0 if all hunks are applied successfully, +1 if some hunks cannot be applied, and 2 if there is more serious trouble. +When applying a set of patches in a loop, you should check the +exit status, so you don't apply a later patch to a partially patched +file. + +@node More or Fewer Messages +@subsection Controlling the Verbosity of @command{patch} +@cindex verbose messages from @command{patch} +@cindex inhibit messages from @command{patch} + +You can cause @command{patch} to produce more messages by using the +@option{--verbose} option. For example, when you give this option, +the message @samp{Hmm...} indicates that @command{patch} is reading text in +the patch file, attempting to determine whether there is a patch in that +text, and if so, what kind of patch it is. + +You can inhibit all terminal output from @command{patch}, unless an error +occurs, by using the @option{-s}, @option{--quiet}, or @option{--silent} +option. + +@node patch and Keyboard Input +@subsection Inhibiting Keyboard Input +@cindex keyboard input to @command{patch} + +There are two ways you can prevent @command{patch} from asking you any +questions. The @option{-f} or @option{--force} option assumes that you know +what you are doing. It causes @command{patch} to do the following: + +@itemize @bullet +@item +Skip patches that do not contain file names in their headers. + +@item +Patch files even though they have the wrong version for the +@samp{Prereq:} line in the patch; + +@item +Assume that patches are not reversed even if they look like they are. +@end itemize + +@noindent +The @option{-t} or @option{--batch} option is similar to @option{-f}, in that +it suppresses questions, but it makes somewhat different assumptions: + +@itemize @bullet +@item +Skip patches that do not contain file names in their headers +(the same as @option{-f}). + +@item +Skip patches for which the file has the wrong version for the +@samp{Prereq:} line in the patch; + +@item +Assume that patches are reversed if they look like they are. +@end itemize + +@node patch Quoting Style +@subsection @command{patch} Quoting Style +@cindex quoting style + +When @command{patch} outputs a file name in a diagnostic message, it +can format the name in any of several ways. This can be useful to +output file names unambiguously, even if they contain punctuation or +special characters like newlines. The +@option{--quoting-style=@var{word}} option controls how names are +output. The @var{word} should be one of the following: + +@table @samp +@item literal +Output names as-is. +@item shell +Quote names for the shell if they contain shell metacharacters or would +cause ambiguous output. +@item shell-always +Quote names for the shell, even if they would normally not require quoting. +@item c +Quote names as for a C language string. +@item escape +Quote as with @samp{c} except omit the surrounding double-quote +characters. +@c The following are not yet implemented in patch 2.5.4. +@c @item clocale +@c Quote as with @samp{c} except use quotation marks appropriate for the +@c locale. +@c @item locale +@c @c Use @t instead of @samp to avoid duplicate quoting in some output styles. +@c Like @samp{clocale}, but quote @t{`like this'} instead of @t{"like +@c this"} in the default C locale. This looks nicer on many displays. +@end table + +@vindex QUOTING_STYLE +You can specify the default value of the @option{--quoting-style} +option with the environment variable @env{QUOTING_STYLE}. If that +environment variable is not set, the default value is @samp{shell}, +but this default may change in a future version of @command{patch}. + +@node patch and POSIX +@section @command{patch} and the @sc{posix} Standard +@cindex @sc{posix} + +@vindex POSIXLY_CORRECT +If you specify the @option{--posix} option, or set the +@env{POSIXLY_CORRECT} environment variable, @command{patch} conforms +more strictly to the @sc{posix} standard, as follows: + +@itemize @bullet +@item +Take the first existing file from the list (old, new, index) +when intuiting file names from diff headers. @xref{Multiple Patches}. + +@item +Do not remove files that are removed by a diff. +@xref{Creating and Removing}. + +@item +Do not ask whether to get files from @sc{rcs}, ClearCase, or +@sc{sccs}. @xref{Revision Control}. + +@item +Require that all options precede the files in the command line. + +@item +Do not backup files, even when there is a mismatch. @xref{Backups}. + +@end itemize + +@node patch and Tradition +@section @sc{gnu} @command{patch} and Traditional @command{patch} +@cindex traditional @command{patch} + +The current version of @sc{gnu} @command{patch} normally follows the +@sc{posix} standard. @xref{patch and POSIX}, for the few exceptions +to this general rule. + +Unfortunately, @sc{posix} redefined the behavior of @command{patch} in +several important ways. You should be aware of the following +differences if you must interoperate with traditional @command{patch}, +or with @sc{gnu} @command{patch} version 2.1 and earlier. + +@itemize @bullet +@item +In traditional @command{patch}, the @option{-p} option's operand was +optional, and a bare @option{-p} was equivalent to @option{-p0}. The +@option{-p} option now requires an operand, and @option{-p@ 0} is now +equivalent to @option{-p0}. For maximum compatibility, use options +like @option{-p0} and @option{-p1}. + +Also, traditional @command{patch} simply counted slashes when +stripping path prefixes; @command{patch} now counts pathname +components. That is, a sequence of one or more adjacent slashes now +counts as a single slash. For maximum portability, avoid sending +patches containing @file{//} in file names. + +@item +In traditional @command{patch}, backups were enabled by default. This +behavior is now enabled with the @option{-b} or @option{--backup} +option. + +Conversely, in @sc{posix} @command{patch}, backups are never made, +even when there is a mismatch. In @sc{gnu} @command{patch}, this +behavior is enabled with the @option{--no-backup-if-mismatch} option, +or by conforming to @sc{posix}. + +The @option{-b@ @var{suffix}} option of traditional @command{patch} is +equivalent to the @samp{-b -z@ @var{suffix}} options of @sc{gnu} +@command{patch}. + +@item +Traditional @command{patch} used a complicated (and incompletely +documented) method to intuit the name of the file to be patched from +the patch header. This method did not conform to @sc{posix}, and had +a few gotchas. Now @command{patch} uses a different, equally +complicated (but better documented) method that is optionally +@sc{posix}-conforming; we hope it has fewer gotchas. The two methods +are compatible if the file names in the context diff header and the +@samp{Index:} line are all identical after prefix-stripping. Your +patch is normally compatible if each header's file names all contain +the same number of slashes. + +@item +When traditional @command{patch} asked the user a question, it sent +the question to standard error and looked for an answer from the first +file in the following list that was a terminal: standard error, +standard output, @file{/dev/tty}, and standard input. Now +@command{patch} sends questions to standard output and gets answers +from @file{/dev/tty}. Defaults for some answers have been changed so +that @command{patch} never goes into an infinite loop when using +default answers. + +@item +Traditional @command{patch} exited with a status value that counted +the number of bad hunks, or with status 1 if there was real trouble. +Now @command{patch} exits with status 1 if some hunks failed, or with +2 if there was real trouble. + +@item +Limit yourself to the following options when sending instructions +meant to be executed by anyone running @sc{gnu} @command{patch}, +traditional @command{patch}, or a @command{patch} that conforms to +@sc{posix}. Spaces are significant in the following list, and +operands are required. + +@example +@option{-c} +@option{-d @var{dir}} +@option{-D @var{define}} +@option{-e} +@option{-l} +@option{-n} +@option{-N} +@option{-o @var{outfile}} +@option{-p@var{num}} +@option{-R} +@option{-r @var{rejectfile}} +@end example + +@end itemize + +@node Making Patches +@chapter Tips for Making and Using Patches + +Use some common sense when making and using patches. For example, +when sending bug fixes to a program's maintainer, send several small +patches, one per independent subject, instead of one large, +harder-to-digest patch that covers all the subjects. + +Here are some other things you should keep in mind if you are going to +distribute patches for updating a software package. + +@menu +* Tips for Patch Producers:: Advice for making patches. +* Tips for Patch Consumers:: Advice for using patches. +* Avoiding Common Mistakes:: Avoiding common mistakes when using @command{patch}. +* Generating Smaller Patches:: How to generate smaller patches. +@end menu + +@node Tips for Patch Producers +@section Tips for Patch Producers +@cindex patch producer tips + +To create a patch that changes an older version of a package into a +newer version, first make a copy of the older and newer versions in +adjacent subdirectories. It is common to do that by unpacking +@command{tar} archives of the two versions. + +To generate the patch, use the command @samp{diff -Naur @var{old} +@var{new}} where @var{old} and @var{new} identify the old and new +directories. The names @var{old} and @var{new} should not contain any +slashes. The @option{-N} option lets the patch create and remove +files; @option{-a} lets the patch update non-text files; @option{-u} +generates useful time stamps and enough context; and @option{-r} lets +the patch update subdirectories. Here is an example command, using +Bourne shell syntax: + +@example +diff -Naur gcc-3.0.3 gcc-3.0.4 +@end example + +Tell your recipients how to apply the patches. This should include +which working directory to use, and which @command{patch} options to +use; the option @samp{-p1} is recommended. Test your procedure by +pretending to be a recipient and applying your patches to a copy of +the original files. + +@xref{Avoiding Common Mistakes}, for how to avoid common mistakes when +generating a patch. + +@node Tips for Patch Consumers +@section Tips for Patch Consumers +@cindex patch consumer tips + +A patch producer should tell recipients how to apply the patches, so +the first rule of thumb for a patch consumer is to follow the +instructions supplied with the patch. + +@sc{gnu} @command{diff} can analyze files with arbitrarily long lines +and files that end in incomplete lines. However, older versions of +@command{patch} cannot patch such files. If you are having trouble +applying such patches, try upgrading to a recent version of @sc{gnu} +@command{patch}. + +@node Avoiding Common Mistakes +@section Avoiding Common Mistakes +@cindex common mistakes with patches +@cindex patch, common mistakes + +When producing a patch for multiple files, apply @command{diff} to +directories whose names do not have slashes. This reduces confusion +when the patch consumer specifies the @option{-p@var{number}} option, +since this option can have surprising results when the old and new +file names have different numbers of slashes. For example, do not +send a patch with a header that looks like this: + +@example +diff -Naur v2.0.29/prog/README prog/README +--- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800 ++++ prog/README 2002-03-17 20:49:32.442260588 -0800 +@end example + +@noindent +because the two file names have different numbers of slashes, and +different versions of @command{patch} interpret the file names +differently. To avoid confusion, send output that looks like this +instead: + +@example +diff -Naur v2.0.29/prog/README v2.0.30/prog/README +--- v2.0.29/prog/README 2002-03-10 23:30:39.942229878 -0800 ++++ v2.0.30/prog/README 2002-03-17 20:49:32.442260588 -0800 +@end example + +Make sure you have specified the file names correctly, either in a +context diff header or with an @samp{Index:} line. Take care to not send out +reversed patches, since these make people wonder whether they have +already applied the patch. + +Avoid sending patches that compare backup file names like +@file{README.orig} or @file{README~}, since this might confuse +@command{patch} into patching a backup file instead of the real file. +Instead, send patches that compare the same base file names in +different directories, e.g.@: @file{old/README} and @file{new/README}. + +To save people from partially applying a patch before other patches that +should have gone before it, you can make the first patch in the patch +file update a file with a name like @file{patchlevel.h} or +@file{version.c}, which contains a patch level or version number. If +the input file contains the wrong version number, @command{patch} will +complain immediately. + +An even clearer way to prevent this problem is to put a @samp{Prereq:} +line before the patch. If the leading text in the patch file contains a +line that starts with @samp{Prereq:}, @command{patch} takes the next word +from that line (normally a version number) and checks whether the next +input file contains that word, preceded and followed by either +white space or a newline. If not, @command{patch} prompts you for +confirmation before proceeding. This makes it difficult to accidentally +apply patches in the wrong order. + +@node Generating Smaller Patches +@section Generating Smaller Patches +@cindex patches, shrinking + +The simplest way to generate a patch is to use @samp{diff -Naur} +(@pxref{Tips for Patch Producers}), but you might be able to reduce +the size of the patch by renaming or removing some files before making +the patch. If the older version of the package contains any files +that the newer version does not, or if any files have been renamed +between the two versions, make a list of @command{rm} and @command{mv} +commands for the user to execute in the old version directory before +applying the patch. Then run those commands yourself in the scratch +directory. + +If there are any files that you don't need to include in the patch +because they can easily be rebuilt from other files (for example, +@file{TAGS} and output from @command{yacc} and @command{makeinfo}), +exclude them from the patch by giving @command{diff} the @option{-x +@var{pattern}} option (@pxref{Comparing Directories}). If you want +your patch to modify a derived file because your recipients lack tools +to build it, make sure that the patch for the derived file follows any +patches for files that it depends on, so that the recipients' time +stamps will not confuse @command{make}. + +Now you can create the patch using @samp{diff -Naur}. Make sure to +specify the scratch directory first and the newer directory second. + +Add to the top of the patch a note telling the user any @command{rm} and +@command{mv} commands to run before applying the patch. Then you can +remove the scratch directory. + +You can also shrink the patch size by using fewer lines of context, +but bear in mind that @command{patch} typically needs at least two +lines for proper operation when patches do not exactly match the input +files. + +@node Invoking cmp +@chapter Invoking @command{cmp} +@cindex invoking @command{cmp} +@cindex @command{cmp} invocation + +The @command{cmp} command compares two files, and if they differ, +tells the first byte and line number where they differ. Bytes and +lines are numbered starting with 1. The arguments of @command{cmp} +are as follows: + +@example +cmp @var{options}@dots{} @var{from-file} @r{[}@var{to-file} @r{[}@var{from-skip} @r{[}@var{to-skip}@r{]}@r{]}@r{]} +@end example + +The file name @file{-} is always the standard input. @command{cmp} +also uses the standard input if one file name is omitted. The +@var{from-skip} and @var{to-skip} operands specify how many bytes to +ignore at the start of each file; they are equivalent to the +@option{--ignore-initial=@var{from-skip}:@var{to-skip}} option. + +An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +@menu +* cmp Options:: Summary of options to @command{cmp}. +@end menu + +@node cmp Options +@section Options to @command{cmp} +@cindex @command{cmp} options +@cindex options for @command{cmp} + +Below is a summary of all of the options that @sc{gnu} @command{cmp} accepts. +Most options have two equivalent names, one of which is a single letter +preceded by @samp{-}, and the other of which is a long name preceded by +@samp{--}. Multiple single letter options (unless they take an +argument) can be combined into a single command line word: @option{-bl} is +equivalent to @option{-b -l}. + +@table @option +@item -b +@itemx --print-bytes +Print the differing bytes. Display control bytes as a +@samp{^} followed by a letter of the alphabet and precede bytes +that have the high bit set with @samp{M-} (which stands for ``meta''). + +@item --help +Output a summary of usage and then exit. + +@item -i @var{skip} +@itemx --ignore-initial=@var{skip} +Ignore any differences in the first @var{skip} bytes of the input +files. Treat files with fewer than @var{skip} bytes as if they are +empty. If @var{skip} is of the form +@option{@var{from-skip}:@var{to-skip}}, skip the first @var{from-skip} +bytes of the first input file and the first @var{to-skip} bytes of the +second. + +@item -l +@itemx --verbose +Print the (decimal) byte numbers and (octal) values of all differing bytes. + +@item -n @var{count} +@itemx --bytes=@var{count} +Compare at most @var{count} input bytes. + +@item -s +@itemx --quiet +@itemx --silent +Do not print anything; only return an exit status indicating whether +the files differ. + +@item -v +@itemx --version +Output version information and then exit. +@end table + +In the above table, operands that are byte counts are normally +decimal, but may be preceded by @samp{0} for octal and @samp{0x} for +hexadecimal. + +A byte count can be followed by a suffix to specify a multiple of that +count; in this case an omitted integer is understood to be 1. A bare +size letter, or one followed by @samp{iB}, specifies a multiple using +powers of 1024. A size letter followed by @samp{B} specifies powers +of 1000 instead. For example, @option{-n 4M} and @option{-n 4MiB} are +equivalent to @option{-n 4194304}, whereas @option{-n 4MB} is +equivalent to @option{-n 4000000}. This notation is upward compatible +with the @uref{http://www.bipm.fr/enus/3_SI/si-prefixes.html, SI +prefixes} for decimal multiples and with the +@uref{http://physics.nist.gov/cuu/Units/binary.html, IEC 60027-2 +prefixes for binary multiples}. + +The following suffixes are defined. Large sizes like @code{1Y} may be +rejected by your computer due to limitations of its arithmetic. + +@table @samp +@item kB +@cindex kilobyte, definition of +kilobyte: @math{10^3 = 1000}. +@item k +@itemx K +@itemx KiB +@cindex kibibyte, definition of +kibibyte: @math{2^10 = 1024}. @samp{K} is special: the SI prefix is +@samp{k} and the IEC 60027-2 prefix is @samp{Ki}, but tradition and +@sc{posix} use @samp{k} to mean @samp{KiB}. +@item MB +@cindex megabyte, definition of +megabyte: @math{10^6 = 1,000,000}. +@item M +@itemx MiB +@cindex mebibyte, definition of +mebibyte: @math{2^20 = 1,048,576}. +@item GB +@cindex gigabyte, definition of +gigabyte: @math{10^9 = 1,000,000,000}. +@item G +@itemx GiB +@cindex gibibyte, definition of +gibibyte: @math{2^30 = 1,073,741,824}. +@item TB +@cindex terabyte, definition of +terabyte: @math{10^12 = 1,000,000,000,000}. +@item T +@itemx TiB +@cindex tebibyte, definition of +tebibyte: @math{2^40 = 1,099,511,627,776}. +@item PB +@cindex petabyte, definition of +petabyte: @math{10^15 = 1,000,000,000,000,000}. +@item P +@itemx PiB +@cindex pebibyte, definition of +pebibyte: @math{2^50 = 1,125,899,906,842,624}. +@item EB +@cindex exabyte, definition of +exabyte: @math{10^18 = 1,000,000,000,000,000,000}. +@item E +@itemx EiB +@cindex exbibyte, definition of +exbibyte: @math{2^60 = 1,152,921,504,606,846,976}. +@item ZB +@cindex zettabyte, definition of +zettabyte: @math{10^21 = 1,000,000,000,000,000,000,000} +@item Z +@itemx ZiB +@math{2^70 = 1,180,591,620,717,411,303,424}. +(@samp{Zi} is a GNU extension to IEC 60027-2.) +@item YB +@cindex yottabyte, definition of +yottabyte: @math{10^24 = 1,000,000,000,000,000,000,000,000}. +@item Y +@itemx YiB +@math{2^80 = 1,208,925,819,614,629,174,706,176}. +(@samp{Yi} is a GNU extension to IEC 60027-2.) +@end table + +@node Invoking diff +@chapter Invoking @command{diff} +@cindex invoking @command{diff} +@cindex @command{diff} invocation + +The format for running the @command{diff} command is: + +@example +diff @var{options}@dots{} @var{files}@dots{} +@end example + +In the simplest case, two file names @var{from-file} and +@var{to-file} are given, and @command{diff} compares the contents of +@var{from-file} and @var{to-file}. A file name of @file{-} stands for +text read from the standard input. As a special case, @samp{diff - -} +compares a copy of standard input to itself. + +If one file is a directory and the other is not, @command{diff} compares +the file in the directory whose name is that of the non-directory. +The non-directory file must not be @file{-}. + +If two file names are given and both are directories, +@command{diff} compares corresponding files in both directories, in +alphabetical order; this comparison is not recursive unless the +@option{-r} or @option{--recursive} option is given. @command{diff} never +compares the actual contents of a directory as if it were a file. The +file that is fully specified may not be standard input, because standard +input is nameless and the notion of ``file with the same name'' does not +apply. + +If the @option{--from-file=@var{file}} option is given, the number of +file names is arbitrary, and @var{file} is compared to each named file. +Similarly, if the @option{--to-file=@var{file}} option is given, each +named file is compared to @var{file}. + +@command{diff} options begin with @samp{-}, so normally file names +may not begin with @samp{-}. However, @option{--} as an +argument by itself treats the remaining arguments as file names even if +they begin with @samp{-}. + +An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +@menu +* diff Options:: Summary of options to @command{diff}. +@end menu + +@node diff Options +@section Options to @command{diff} +@cindex @command{diff} options +@cindex options for @command{diff} + +Below is a summary of all of the options that @sc{gnu} @command{diff} accepts. +Most options have two equivalent names, one of which is a single letter +preceded by @samp{-}, and the other of which is a long name preceded by +@samp{--}. Multiple single letter options (unless they take an +argument) can be combined into a single command line word: @option{-ac} is +equivalent to @option{-a -c}. Long named options can be abbreviated to +any unique prefix of their name. Brackets ([ and ]) indicate that an +option takes an optional argument. + +@table @option +@item -a +@itemx --text +Treat all files as text and compare them line-by-line, even if they +do not seem to be text. @xref{Binary}. + +@item -b +@itemx --ignore-space-change +Ignore changes in amount of white space. @xref{White Space}. + +@item -B +@itemx --ignore-blank-lines +Ignore changes that just insert or delete blank lines. @xref{Blank +Lines}. + +@item --binary +Read and write data in binary mode. @xref{Binary}. + +@item -c +Use the context output format, showing three lines of context. +@xref{Context Format}. + +@item -C @var{lines} +@itemx --context@r{[}=@var{lines}@r{]} +Use the context output format, showing @var{lines} (an integer) lines of +context, or three if @var{lines} is not given. @xref{Context Format}. +For proper operation, @command{patch} typically needs at least two lines of +context. + +On older systems, @command{diff} supports an obsolete option +@option{-@var{lines}} that has effect when combined with @option{-c} +or @option{-p}. @sc{posix} 1003.1-2001 (@pxref{Standards +conformance}) does not allow this; use @option{-C @var{lines}} +instead. + +@item --changed-group-format=@var{format} +Use @var{format} to output a line group containing differing lines from +both files in if-then-else format. @xref{Line Group Formats}. + +@item -d +@itemx --minimal +Change the algorithm perhaps find a smaller set of changes. This makes +@command{diff} slower (sometimes much slower). @xref{diff Performance}. + +@item -D @var{name} +@itemx --ifdef=@var{name} +Make merged @samp{#ifdef} format output, conditional on the preprocessor +macro @var{name}. @xref{If-then-else}. + +@item -e +@itemx --ed +Make output that is a valid @command{ed} script. @xref{ed Scripts}. + +@item -E +@itemx --ignore-tab-expansion +Ignore changes due to tab expansion. +@xref{White Space}. + +@item -f +@itemx --forward-ed +Make output that looks vaguely like an @command{ed} script but has changes +in the order they appear in the file. @xref{Forward ed}. + +@item -F @var{regexp} +@itemx --show-function-line=@var{regexp} +In context and unified format, for each hunk of differences, show some +of the last preceding line that matches @var{regexp}. @xref{Specified +Headings}. + +@item --from-file=@var{file} +Compare @var{file} to each operand; @var{file} may be a directory. + +@item --help +Output a summary of usage and then exit. + +@item --horizon-lines=@var{lines} +Do not discard the last @var{lines} lines of the common prefix +and the first @var{lines} lines of the common suffix. +@xref{diff Performance}. + +@item -i +@itemx --ignore-case +Ignore changes in case; consider upper- and lower-case letters +equivalent. @xref{Case Folding}. + +@item -I @var{regexp} +@itemx --ignore-matching-lines=@var{regexp} +Ignore changes that just insert or delete lines that match @var{regexp}. +@xref{Specified Folding}. + +@item --ignore-file-name-case +Ignore case when comparing file names during recursive comparison. +@xref{Comparing Directories}. + +@item -l +@itemx --paginate +Pass the output through @command{pr} to paginate it. @xref{Pagination}. + +@item --label=@var{label} +Use @var{label} instead of the file name in the context format +(@pxref{Context Format}) and unified format (@pxref{Unified Format}) +headers. @xref{RCS}. + +@item --left-column +Print only the left column of two common lines in side by side format. +@xref{Side by Side Format}. + +@item --line-format=@var{format} +Use @var{format} to output all input lines in if-then-else format. +@xref{Line Formats}. + +@item -n +@itemx --rcs +Output @sc{rcs}-format diffs; like @option{-f} except that each command +specifies the number of lines affected. @xref{RCS}. + +@item -N +@itemx --new-file +In directory comparison, if a file is found in only one directory, +treat it as present but empty in the other directory. @xref{Comparing +Directories}. + +@item --new-group-format=@var{format} +Use @var{format} to output a group of lines taken from just the second +file in if-then-else format. @xref{Line Group Formats}. + +@item --new-line-format=@var{format} +Use @var{format} to output a line taken from just the second file in +if-then-else format. @xref{Line Formats}. + +@item --old-group-format=@var{format} +Use @var{format} to output a group of lines taken from just the first +file in if-then-else format. @xref{Line Group Formats}. + +@item --old-line-format=@var{format} +Use @var{format} to output a line taken from just the first file in +if-then-else format. @xref{Line Formats}. + +@item -p +@itemx --show-c-function +Show which C function each change is in. @xref{C Function Headings}. + +@item -q +@itemx --brief +Report only whether the files differ, not the details of the +differences. @xref{Brief}. + +@item -r +@itemx --recursive +When comparing directories, recursively compare any subdirectories +found. @xref{Comparing Directories}. + +@item -s +@itemx --report-identical-files +Report when two files are the same. @xref{Comparing Directories}. + +@item -S @var{file} +@itemx --starting-file=@var{file} +When comparing directories, start with the file @var{file}. This is +used for resuming an aborted comparison. @xref{Comparing Directories}. + +@item --speed-large-files +Use heuristics to speed handling of large files that have numerous +scattered small changes. @xref{diff Performance}. + +@item --strip-trailing-cr +Strip any trailing carriage return at the end of an input line. +@xref{Binary}. + +@item --suppress-common-lines +Do not print common lines in side by side format. +@xref{Side by Side Format}. + +@item -t +@itemx --expand-tabs +Expand tabs to spaces in the output, to preserve the alignment of tabs +in the input files. @xref{Tabs}. + +@item -T +@itemx --initial-tab +Output a tab rather than a space before the text of a line in normal or +context format. This causes the alignment of tabs in the line to look +normal. @xref{Tabs}. + +@item --to-file=@var{file} +Compare each operand to @var{file}; @var{file} may be a directory. + +@item -u +Use the unified output format, showing three lines of context. +@xref{Unified Format}. + +@item --unchanged-group-format=@var{format} +Use @var{format} to output a group of common lines taken from both files +in if-then-else format. @xref{Line Group Formats}. + +@item --unchanged-line-format=@var{format} +Use @var{format} to output a line common to both files in if-then-else +format. @xref{Line Formats}. + +@item --unidirectional-new-file +When comparing directories, if a file appears only in the second +directory of the two, treat it as present but empty in the other. +@xref{Comparing Directories}. + +@item -U @var{lines} +@itemx --unified@r{[}=@var{lines}@r{]} +Use the unified output format, showing @var{lines} (an integer) lines of +context, or three if @var{lines} is not given. @xref{Unified Format}. +For proper operation, @command{patch} typically needs at least two lines of +context. + +On older systems, @command{diff} supports an obsolete option +@option{-@var{lines}} that has effect when combined with @option{-u}. +@sc{posix} 1003.1-2001 (@pxref{Standards conformance}) does not allow +this; use @option{-U @var{lines}} instead. + +@item -v +@itemx --version +Output version information and then exit. + +@item -w +@itemx --ignore-all-space +Ignore white space when comparing lines. @xref{White Space}. + +@item -W @var{columns} +@itemx --width=@var{columns} +Output at most @var{columns} (default 130) print columns per line in +side by side format. @xref{Side by Side Format}. + +@item -x @var{pattern} +@itemx --exclude=@var{pattern} +When comparing directories, ignore files and subdirectories whose basenames +match @var{pattern}. @xref{Comparing Directories}. + +@item -X @var{file} +@itemx --exclude-from=@var{file} +When comparing directories, ignore files and subdirectories whose basenames +match any pattern contained in @var{file}. @xref{Comparing Directories}. + +@item -y +@itemx --side-by-side +Use the side by side output format. @xref{Side by Side Format}. +@end table + +@node Invoking diff3 +@chapter Invoking @command{diff3} +@cindex invoking @command{diff3} +@cindex @command{diff3} invocation + +The @command{diff3} command compares three files and outputs descriptions +of their differences. Its arguments are as follows: + +@example +diff3 @var{options}@dots{} @var{mine} @var{older} @var{yours} +@end example + +The files to compare are @var{mine}, @var{older}, and @var{yours}. +At most one of these three file names may be @file{-}, +which tells @command{diff3} to read the standard input for that file. + +An exit status of 0 means @command{diff3} was successful, 1 means some +conflicts were found, and 2 means trouble. + +@menu +* diff3 Options:: Summary of options to @command{diff3}. +@end menu + +@node diff3 Options +@section Options to @command{diff3} +@cindex @command{diff3} options +@cindex options for @command{diff3} + +Below is a summary of all of the options that @sc{gnu} @command{diff3} +accepts. Multiple single letter options (unless they take an argument) +can be combined into a single command line argument. + +@table @option +@item -a +@itemx --text +Treat all files as text and compare them line-by-line, even if they +do not appear to be text. @xref{Binary}. + +@item -A +@itemx --show-all +Incorporate all unmerged changes from @var{older} to @var{yours} into +@var{mine}, surrounding conflicts with bracket lines. +@xref{Marking Conflicts}. + +@item --diff-program=@var{program} +Use the compatible comparison program @var{program} to compare files +instead of @command{diff}. + +@item -e +@itemx --ed +Generate an @command{ed} script that incorporates all the changes from +@var{older} to @var{yours} into @var{mine}. @xref{Which Changes}. + +@item -E +@itemx --show-overlap +Like @option{-e}, except bracket lines from overlapping changes' first +and third files. +@xref{Marking Conflicts}. +With @option{-E}, an overlapping change looks like this: + +@example +<<<<<<< @var{mine} +@r{lines from @var{mine}} +======= +@r{lines from @var{yours}} +>>>>>>> @var{yours} +@end example + +@item --help +Output a summary of usage and then exit. + +@item -i +Generate @samp{w} and @samp{q} commands at the end of the @command{ed} +script for System V compatibility. This option must be combined with +one of the @option{-AeExX3} options, and may not be combined with @option{-m}. +@xref{Saving the Changed File}. + +@item -L @var{label} +@itemx --label=@var{label} +Use the label @var{label} for the brackets output by the @option{-A}, +@option{-E} and @option{-X} options. This option may be given up to three +times, one for each input file. The default labels are the names of +the input files. Thus @samp{diff3 -L X -L Y -L Z -m A B C} acts like +@samp{diff3 -m A B C}, except that the output looks like it came from +files named @samp{X}, @samp{Y} and @samp{Z} rather than from files +named @samp{A}, @samp{B} and @samp{C}. @xref{Marking Conflicts}. + +@item -m +@itemx --merge +Apply the edit script to the first file and send the result to standard +output. Unlike piping the output from @command{diff3} to @command{ed}, this +works even for binary files and incomplete lines. @option{-A} is assumed +if no edit script option is specified. @xref{Bypassing ed}. + +@item -T +@itemx --initial-tab +Output a tab rather than two spaces before the text of a line in normal format. +This causes the alignment of tabs in the line to look normal. @xref{Tabs}. + +@item -v +@itemx --version +Output version information and then exit. + +@item -x +@itemx --overlap-only +Like @option{-e}, except output only the overlapping changes. +@xref{Which Changes}. + +@item -X +Like @option{-E}, except output only the overlapping changes. +In other words, like @option{-x}, except bracket changes as in @option{-E}. +@xref{Marking Conflicts}. + +@item -3 +@itemx --easy-only +Like @option{-e}, except output only the nonoverlapping changes. +@xref{Which Changes}. +@end table + +@node Invoking patch +@chapter Invoking @command{patch} +@cindex invoking @command{patch} +@cindex @command{patch} invocation + +Normally @command{patch} is invoked like this: + +@example +patch <@var{patchfile} +@end example + +The full format for invoking @command{patch} is: + +@example +patch @var{options}@dots{} @r{[}@var{origfile} @r{[}@var{patchfile}@r{]}@r{]} +@end example + +You can also specify where to read the patch from with the @option{-i +@var{patchfile}} or @option{--input=@var{patchfile}} option. +If you do not specify @var{patchfile}, or if @var{patchfile} is +@file{-}, @command{patch} reads the patch (that is, the @command{diff} output) +from the standard input. + +If you do not specify an input file on the command line, @command{patch} +tries to intuit from the @dfn{leading text} (any text in the patch +that comes before the @command{diff} output) which file to edit. +@xref{Multiple Patches}. + +By default, @command{patch} replaces the original input file with the +patched version, possibly after renaming the original file into a +backup file (@pxref{Backup Names}, for a description of how +@command{patch} names backup files). You can also specify where to +put the output with the @option{-o @var{file}} or +@option{--output=@var{file}} option; however, do not use this option +if @var{file} is one of the input files. + +@menu +* patch Options:: Summary table of options to @command{patch}. +@end menu + +@node patch Options +@section Options to @command{patch} +@cindex @command{patch} options +@cindex options for @command{patch} + +Here is a summary of all of the options that @sc{gnu} @command{patch} +accepts. @xref{patch and Tradition}, for which of these options are +safe to use in older versions of @command{patch}. + +Multiple single-letter options that do not take an argument can be +combined into a single command line argument with only one dash. + +@table @option +@item -b +@itemx --backup +Back up the original contents of each file, even if backups would +normally not be made. @xref{Backups}. + +@item -B @var{prefix} +@itemx --prefix=@var{prefix} +Prepend @var{prefix} to backup file names. @xref{Backup Names}. + +@item --backup-if-mismatch +Back up the original contents of each file if the patch does not +exactly match the file. This is the default behavior when not +conforming to @sc{posix}. @xref{Backups}. + +@item --binary +Read and write all files in binary mode, except for standard output +and @file{/dev/tty}. This option has no effect on +@sc{posix}-conforming systems like @sc{gnu}/Linux. On systems where +this option makes a difference, the patch should be generated by +@samp{diff -a --binary}. @xref{Binary}. + +@item -c +@itemx --context +Interpret the patch file as a context diff. @xref{patch Input}. + +@item -d @var{directory} +@itemx --directory=@var{directory} +Make directory @var{directory} the current directory for interpreting +both file names in the patch file, and file names given as arguments to +other options. @xref{patch Directories}. + +@item -D @var{name} +@itemx --ifdef=@var{name} +Make merged if-then-else output using @var{name}. @xref{If-then-else}. + +@item --dry-run +Print the results of applying the patches without actually changing +any files. @xref{Dry Runs}. + +@item -e +@itemx --ed +Interpret the patch file as an @command{ed} script. @xref{patch Input}. + +@item -E +@itemx --remove-empty-files +Remove output files that are empty after the patches have been applied. +@xref{Creating and Removing}. + +@item -f +@itemx --force +Assume that the user knows exactly what he or she is doing, and do not +ask any questions. @xref{patch Messages}. + +@item -F @var{lines} +@itemx --fuzz=@var{lines} +Set the maximum fuzz factor to @var{lines}. @xref{Inexact}. + +@item -g @var{num} +@itemx --get=@var{num} +If @var{num} is positive, get input files from a revision control +system as necessary; if zero, do not get the files; if negative, ask +the user whether to get the files. @xref{Revision Control}. + +@item --help +Output a summary of usage and then exit. + +@item -i @var{patchfile} +@itemx --input=@var{patchfile} +Read the patch from @var{patchfile} rather than from standard input. +@xref{patch Options}. + +@item -l +@itemx --ignore-white-space +Let any sequence of blanks (spaces or tabs) in the patch file match +any sequence of blanks in the input file. @xref{Changed White Space}. + +@item -n +@itemx --normal +Interpret the patch file as a normal diff. @xref{patch Input}. + +@item -N +@itemx --forward +Ignore patches that @command{patch} thinks are reversed or already applied. +See also @option{-R}. @xref{Reversed Patches}. + +@item --no-backup-if-mismatch +Do not back up the original contents of files. This is the default +behavior when conforming to @sc{posix}. @xref{Backups}. + +@item -o @var{file} +@itemx --output=@var{file} +Use @var{file} as the output file name. @xref{patch Options}. + +@item -p@var{number} +@itemx --strip=@var{number} +Set the file name strip count to @var{number}. @xref{patch Directories}. + +@item --posix +Conform to @sc{posix}, as if the @env{POSIXLY_CORRECT} environment +variable had been set. @xref{patch and POSIX}. + +@item --quoting-style=@var{word} +Use style @var{word} to quote names in diagnostics, as if the +@env{QUOTING_STYLE} environment variable had been set to @var{word}. +@xref{patch Quoting Style}. + +@item -r @var{reject-file} +@itemx --reject-file=@var{reject-file} +Use @var{reject-file} as the reject file name. @xref{Reject Names}. + +@item -R +@itemx --reverse +Assume that this patch was created with the old and new files swapped. +@xref{Reversed Patches}. + +@item -s +@itemx --quiet +@itemx --silent +Work silently unless an error occurs. @xref{patch Messages}. + +@item -t +@itemx --batch +Do not ask any questions. @xref{patch Messages}. + +@item -T +@itemx --set-time +Set the modification and access times of patched files from time +stamps given in context diff headers, assuming that the context diff +headers use local time. @xref{Patching Time Stamps}. + +@item -u +@itemx --unified +Interpret the patch file as a unified diff. @xref{patch Input}. + +@item -v +@itemx --version +Output version information and then exit. + +@item -V @var{backup-style} +@itemx --version=control=@var{backup-style} +Select the naming convention for backup file names. @xref{Backup Names}. + +@item --verbose +Print more diagnostics than usual. @xref{patch Messages}. + +@item -x @var{number} +@itemx --debug=@var{number} +Set internal debugging flags. Of interest only to @command{patch} +patchers. + +@item -Y @var{prefix} +@itemx --basename-prefix=@var{prefix} +Prepend @var{prefix} to base names of backup files. @xref{Backup Names}. + +@item -z @var{suffix} +@itemx --suffix=@var{suffix} +Use @var{suffix} as the backup extension instead of @samp{.orig} or +@samp{~}. @xref{Backup Names}. + +@item -Z +@itemx --set-utc +Set the modification and access times of patched files from time +stamps given in context diff headers, assuming that the context diff +headers use @sc{utc}. @xref{Patching Time Stamps}. + +@end table + +@node Invoking sdiff +@chapter Invoking @command{sdiff} +@cindex invoking @command{sdiff} +@cindex @command{sdiff} invocation + +The @command{sdiff} command merges two files and interactively outputs the +results. Its arguments are as follows: + +@example +sdiff -o @var{outfile} @var{options}@dots{} @var{from-file} @var{to-file} +@end example + +This merges @var{from-file} with @var{to-file}, with output to @var{outfile}. +If @var{from-file} is a directory and @var{to-file} is not, @command{sdiff} +compares the file in @var{from-file} whose file name is that of @var{to-file}, +and vice versa. @var{from-file} and @var{to-file} may not both be +directories. + +@command{sdiff} options begin with @samp{-}, so normally @var{from-file} +and @var{to-file} may not begin with @samp{-}. However, @option{--} as an +argument by itself treats the remaining arguments as file names even if +they begin with @samp{-}. You may not use @file{-} as an input file. + +@command{sdiff} without @option{-o} (or @option{--output}) produces a +side-by-side difference. This usage is obsolete; use the @option{-y} +or @option{--side-by-side} option of @command{diff} instead. + +An exit status of 0 means no differences were found, 1 means some +differences were found, and 2 means trouble. + +@menu +* sdiff Options:: Summary of options to @command{diff}. +@end menu + +@node sdiff Options +@section Options to @command{sdiff} +@cindex @command{sdiff} options +@cindex options for @command{sdiff} + +Below is a summary of all of the options that @sc{gnu} @command{sdiff} accepts. +Each option has two equivalent names, one of which is a single +letter preceded by @samp{-}, and the other of which is a long name +preceded by @samp{--}. Multiple single letter options (unless they take +an argument) can be combined into a single command line argument. Long +named options can be abbreviated to any unique prefix of their name. + +@table @option +@item -a +@itemx --text +Treat all files as text and compare them line-by-line, even if they +do not appear to be text. @xref{Binary}. + +@item -b +@itemx --ignore-space-change +Ignore changes in amount of white space. @xref{White Space}. + +@item -B +@itemx --ignore-blank-lines +Ignore changes that just insert or delete blank lines. @xref{Blank +Lines}. + +@item -d +@itemx --minimal +Change the algorithm to perhaps find a smaller set of changes. This +makes @command{sdiff} slower (sometimes much slower). @xref{diff +Performance}. + +@item --diff-program=@var{program} +Use the compatible comparison program @var{program} to compare files +instead of @command{diff}. + +@item -E +@itemx --ignore-tab-expansion +Ignore changes due to tab expansion. +@xref{White Space}. + +@item --help +Output a summary of usage and then exit. + +@item -i +@itemx --ignore-case +Ignore changes in case; consider upper- and lower-case to be the same. +@xref{Case Folding}. + +@item -I @var{regexp} +@itemx --ignore-matching-lines=@var{regexp} +Ignore changes that just insert or delete lines that match @var{regexp}. +@xref{Specified Folding}. + +@item -l +@itemx --left-column +Print only the left column of two common lines. +@xref{Side by Side Format}. + +@item -o @var{file} +@itemx --output=@var{file} +Put merged output into @var{file}. This option is required for merging. + +@item -s +@itemx --suppress-common-lines +Do not print common lines. @xref{Side by Side Format}. + +@item --speed-large-files +Use heuristics to speed handling of large files that have numerous +scattered small changes. @xref{diff Performance}. + +@item --strip-trailing-cr +Strip any trailing carriage return at the end of an input line. +@xref{Binary}. + +@item -t +@itemx --expand-tabs +Expand tabs to spaces in the output, to preserve the alignment of tabs +in the input files. @xref{Tabs}. + +@item -v +@itemx --version +Output version information and then exit. + +@item -w @var{columns} +@itemx --width=@var{columns} +Output at most @var{columns} (default 130) print columns per line. +@xref{Side by Side Format}. Note that for historical reasons, this +option is @option{-W} in @command{diff}, @option{-w} in @command{sdiff}. + +@item -W +@itemx --ignore-all-space +Ignore white space when comparing lines. @xref{White Space}. +Note that for historical reasons, this option is @option{-w} in @command{diff}, +@option{-W} in @command{sdiff}. +@end table + +@node Standards conformance +@chapter Standards conformance +@cindex @sc{posix} + +@vindex POSIXLY_CORRECT +In a few cases, the @sc{gnu} utilities' default behavior is +incompatible with the @sc{posix} standard. To suppress these +incompatibilities, define the @env{POSIXLY_CORRECT} environment +variable. Unless you are checking for @sc{posix} conformance, you +probably do not need to define @env{POSIXLY_CORRECT}. + +Normally options and operands can appear in any order, and programs act +as if all the options appear before any operands. For example, +@samp{diff lao tzu -C 2} acts like @samp{diff -C 2 lao tzu}, since +@samp{2} is an option-argument of @option{-C}. However, if the +@env{POSIXLY_CORRECT} environment variable is set, options must appear +before operands, unless otherwise specified for a particular command. + +Newer versions of @sc{posix} are occasionally incompatible with older +versions. For example, older versions of @sc{posix} allowed the +command @samp{diff -c -10} to have the same meaning as @samp{diff -C +10}, but @sc{posix} 1003.1-2001 @samp{diff} no longer allows +digit-string options like @option{-10}. + +@vindex _POSIX2_VERSION +The @sc{gnu} utilities normally conform to the version of @sc{posix} +that is standard for your system. To cause them to conform to a +different version of @sc{posix}, define the @env{_POSIX2_VERSION} +environment variable to a value of the form @var{yyyymm} specifying +the year and month the standard was adopted. Two values are currently +supported for @env{_POSIX2_VERSION}: @samp{199209} stands for +@sc{posix} 1003.2-1992, and @samp{200112} stands for @sc{posix} +1003.1-2001. For example, if you are running older software that +assumes an older version of @sc{posix} and uses @samp{diff -c -10}, +you can work around the compatibility problems by setting +@samp{_POSIX2_VERSION=199209} in your environment. + +@node Projects +@chapter Future Projects + +Here are some ideas for improving @sc{gnu} @command{diff} and +@command{patch}. The @sc{gnu} project has identified some +improvements as potential programming projects for volunteers. You +can also help by reporting any bugs that you find. + +If you are a programmer and would like to contribute something to the +@sc{gnu} project, please consider volunteering for one of these +projects. If you are seriously contemplating work, please write to +@email{gnu@@gnu.org} to coordinate with other volunteers. + +@menu +* Shortcomings:: Suggested projects for improvements. +* Bugs:: Reporting bugs. +@end menu + +@node Shortcomings +@section Suggested Projects for Improving @sc{gnu} @command{diff} and @command{patch} +@cindex projects for directories + +One should be able to use @sc{gnu} @command{diff} to generate a patch from any +pair of directory trees, and given the patch and a copy of one such +tree, use @command{patch} to generate a faithful copy of the other. +Unfortunately, some changes to directory trees cannot be expressed using +current patch formats; also, @command{patch} does not handle some of the +existing formats. These shortcomings motivate the following suggested +projects. + +@menu +* Internationalization:: Handling multibyte and varying-width characters. +* Changing Structure:: Handling changes to the directory structure. +* Special Files:: Handling symbolic links, device special files, etc. +* Unusual File Names:: Handling file names that contain unusual characters. +* Time Stamp Order:: Outputting diffs in time stamp order. +* Ignoring Changes:: Ignoring certain changes while showing others. +* Speedups:: Improving performance. +@end menu + +@node Internationalization +@subsection Handling Multibyte and Varying-Width Characters +@cindex multibyte characters +@cindex varying-width characters + +@command{diff}, @command{diff3} and @command{sdiff} treat each line of +input as a string of unibyte characters. This can mishandle multibyte +characters in some cases. For example, when asked to ignore spaces, +@command{diff} does not properly ignore a multibyte space character. + +Also, @command{diff} currently assumes that each byte is one column +wide, and this assumption is incorrect in some locales, e.g., locales +that use UTF-8 encoding. This causes problems with the @option{-y} or +@option{--side-by-side} option of @command{diff}. + +These problems need to be fixed without unduly affecting the +performance of the utilities in unibyte environments. + +The IBM GNU/Linux Technology Center Internationalization Team has +proposed some patches to support internationalized @command{diff} +@uref{http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz}. +Unfortunately, these patches are incomplete and are to an older +version of @command{diff}, so more work needs to be done in this area. + +@node Changing Structure +@subsection Handling Changes to the Directory Structure +@cindex directory structure changes + +@command{diff} and @command{patch} do not handle some changes to directory +structure. For example, suppose one directory tree contains a directory +named @samp{D} with some subsidiary files, and another contains a file +with the same name @samp{D}. @samp{diff -r} does not output enough +information for @command{patch} to transform the directory subtree into +the file. + +There should be a way to specify that a file has been removed without +having to include its entire contents in the patch file. There should +also be a way to tell @command{patch} that a file was renamed, even if +there is no way for @command{diff} to generate such information. +There should be a way to tell @command{patch} that a file's time stamp +has changed, even if its contents have not changed. + +These problems can be fixed by extending the @command{diff} output format +to represent changes in directory structure, and extending @command{patch} +to understand these extensions. + +@node Special Files +@subsection Files that are Neither Directories Nor Regular Files +@cindex special files + +Some files are neither directories nor regular files: they are unusual +files like symbolic links, device special files, named pipes, and +sockets. Currently, @command{diff} treats symbolic links like regular files; +it treats other special files like regular files if they are specified +at the top level, but simply reports their presence when comparing +directories. This means that @command{patch} cannot represent changes +to such files. For example, if you change which file a symbolic link +points to, @command{diff} outputs the difference between the two files, +instead of the change to the symbolic link. + +@c This might not be a good idea; is it wise for root to install devices +@c this way? +@command{diff} should optionally report changes to special files specially, +and @command{patch} should be extended to understand these extensions. + +@node Unusual File Names +@subsection File Names that Contain Unusual Characters +@cindex file names with unusual characters + +When a file name contains an unusual character like a newline or +white space, @samp{diff -r} generates a patch that @command{patch} cannot +parse. The problem is with format of @command{diff} output, not just with +@command{patch}, because with odd enough file names one can cause +@command{diff} to generate a patch that is syntactically correct but +patches the wrong files. The format of @command{diff} output should be +extended to handle all possible file names. + +@node Time Stamp Order +@subsection Outputting Diffs in Time Stamp Order + +Applying @command{patch} to a multiple-file diff can result in files +whose time stamps are out of order. @sc{gnu} @command{patch} has +options to restore the time stamps of the updated files +(@pxref{Patching Time Stamps}), but sometimes it is useful to generate +a patch that works even if the recipient does not have @sc{gnu} patch, +or does not use these options. One way to do this would be to +implement a @command{diff} option to output diffs in time stamp order. + +@node Ignoring Changes +@subsection Ignoring Certain Changes + +It would be nice to have a feature for specifying two strings, one in +@var{from-file} and one in @var{to-file}, which should be considered to +match. Thus, if the two strings are @samp{foo} and @samp{bar}, then if +two lines differ only in that @samp{foo} in file 1 corresponds to +@samp{bar} in file 2, the lines are treated as identical. + +It is not clear how general this feature can or should be, or +what syntax should be used for it. + +A partial substitute is to filter one or both files before comparing, +e.g.: + +@example +sed 's/foo/bar/g' file1 | diff - file2 +@end example + +However, this outputs the filtered text, not the original. + +@node Speedups +@subsection Improving Performance + +When comparing two large directory structures, one of which was +originally copied from the other with time stamps preserved (e.g., +with @samp{cp -pR}), it would greatly improve performance if an option +told @command{diff} to assume that two files with the same size and +time stamps have the same content. @xref{diff Performance}. + +@node Bugs +@section Reporting Bugs +@cindex bug reports +@cindex reporting bugs + +If you think you have found a bug in @sc{gnu} @command{cmp}, +@command{diff}, @command{diff3}, or @command{sdiff}, please report it +by electronic mail to the +@uref{http://mail.gnu.org/mailman/listinfo/bug-gnu-utils,GNU utilities +bug report mailing list} @email{bug-gnu-utils@@gnu.org}. Please send +bug reports for @sc{gnu} @command{patch} to +@email{bug-patch@@gnu.org}. Send as precise a description of the +problem as you can, including the output of the @option{--version} +option and sample input files that produce the bug, if applicable. If +you have a nontrivial fix for the bug, please send it as well. If you +have a patch, please send it too. It may simplify the maintainer's +job if the patch is relative to a recent test release, which you can +find in the directory @uref{ftp://alpha.gnu.org/gnu/diffutils/}. + +@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 +@appendix Index + +@printindex cp + +@bye diff --git a/gnu/dist/diffutils/doc/fdl.texi b/gnu/dist/diffutils/doc/fdl.texi new file mode 100644 index 00000000000..d61c8e3c421 --- /dev/null +++ b/gnu/dist/diffutils/doc/fdl.texi @@ -0,0 +1,404 @@ + +@c $NetBSD: fdl.texi,v 1.1.1.1 2003/01/26 00:43:12 wiz Exp $ +@node GNU Free Documentation License +@appendixsec GNU Free Documentation License + +@cindex FDL, GNU Free Documentation License +@center Version 1.1, March 2000 + +@display +Copyright @copyright{} 2000 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +written 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 that contains a +notice placed by the copyright holder saying it can be distributed +under the terms of this License. The ``Document'', below, refers to any +such manual or work. Any member of the public is a licensee, and is +addressed as ``you''. + +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. (For example, 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. + +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 ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, whose contents can be viewed and edited directly and +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 has been designed to thwart or discourage +subsequent modification by readers is not Transparent. 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} designed +for human modification. Opaque formats include PostScript, +@acronym{PDF}, 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} 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. + +@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 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 publicly-accessible computer-network location containing a complete +Transparent copy of the Document, free of added material, which the +general network-using public has access to download anonymously at no +charge using public-standard network protocols. 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 less than five). + +@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'', and 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 +In any section entitled ``Acknowledgments'' or ``Dedications'', +preserve the section's title, and preserve in the section all the +substance and tone of each of the contributor acknowledgments +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 as ``Endorsements'' +or to conflict in title with any Invariant Section. +@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. + +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 ``Acknowledgments'', +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, does not as a whole count as a Modified Version +of the Document, provided no compilation copyright is claimed for the +compilation. Such a compilation is called an ``aggregate'', and this +License does not apply to the other self-contained works thus compiled +with the Document, on account of their being thus compiled, if they +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 quarter +of the entire aggregate, the Document's Cover Texts may be placed on +covers that surround only the Document within the aggregate. +Otherwise they must appear on covers around 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 provided that you also include the +original English version of this License. In case of a disagreement +between the translation and the original English version of this +License, the original English version will prevail. + +@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.1 + or any later version published by the Free Software Foundation; + 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}. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have no Invariant Sections, write ``with no Invariant Sections'' +instead of saying which ones are invariant. If you have no +Front-Cover Texts, write ``no Front-Cover Texts'' instead of +``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. + +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/gnu/dist/diffutils/doc/stamp-vti b/gnu/dist/diffutils/doc/stamp-vti new file mode 100644 index 00000000000..5e7a10cf720 --- /dev/null +++ b/gnu/dist/diffutils/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 5 April 2002 +@set UPDATED-MONTH April 2002 +@set EDITION 2.8.1 +@set VERSION 2.8.1 diff --git a/gnu/dist/diffutils/doc/version.texi b/gnu/dist/diffutils/doc/version.texi new file mode 100644 index 00000000000..932d050a976 --- /dev/null +++ b/gnu/dist/diffutils/doc/version.texi @@ -0,0 +1,5 @@ +@set UPDATED 5 April 2002 +@c $NetBSD: version.texi,v 1.1.1.1 2003/01/26 00:43:12 wiz Exp $ +@set UPDATED-MONTH April 2002 +@set EDITION 2.8.1 +@set VERSION 2.8.1 diff --git a/gnu/dist/diffutils/exgettext b/gnu/dist/diffutils/exgettext new file mode 100755 index 00000000000..c2a83466fe1 --- /dev/null +++ b/gnu/dist/diffutils/exgettext @@ -0,0 +1,123 @@ +#! /bin/sh +# Wrapper around gettext for programs using the msgid convention. + +# Copyright (C) 1998, 2001 Free Software Foundation, Inc. + +# Written by Paul Eggert <eggert@twinsun.com>. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU CC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# Always operate in the C locale. +LANG=C +LANGUAGE=C +LC_ALL=C +export LANG LANGUAGE LC_ALL + +# Set AWK if environment has not already set it. +AWK=${AWK-awk} + +# The argument to this wrapper is the xgettext command to be executed. +# Extract the xgettext program name from the rest of the command. +xgettext=${1?} +shift + +# Save work if we're just wrapping a no-op. +case $xgettext in +:) exit;; +esac + +# Find the files to be scanned, and the directory to scan them from. +directory=. +files= +for i +do + case $i in + --directory=*) + directory=`expr " $i" : ' --directory=\(.*\)'`;; + --files-from=*) + files_from=`expr " $i" : ' --files-from=\(.*\)'` + files=`$AWK '/^[^#]/ { print }' $files_from`;; + esac +done + +# Generate keyword options for xgettext, +# by scanning for declarations of functions +# whose parameter names end in "msgid". +generate_keyword_options=' + /^[A-Z_a-z].*\(.*msgid[,)]/ { + + paren_index = index($0, "(") + + name = substr($0, 1, paren_index - 1) + sub(/[^0-9A-Z_a-z]*$/, "", name) + sub(/[ ]+PARAMS/, "", name) + sub(/[ ]+VPARAMS/, "", name) + sub(/.*[^0-9A-Z_a-z]/, "", name) + + args = substr($0, paren_index) + sub(/msgid[,)].*/, "", args) + for (n = 1; sub(/^[^,]*,/, "", args); n++) { + continue; + } + + if (n == 1) { + keyword = name + } else { + keyword = name ":" n + } + + if (! keyword_seen[keyword]++) { + print "--keyword=" keyword + } + } +' +keyword_options=`( + cd $directory && + $AWK "$generate_keyword_options" $files < /dev/null +)` || exit + +# Generate temporary file reflecting the %e strings in the scanned files. +tmp=tmp-emsgids.c + +generate_emsgids=' + /%e.*}/ { + line = $0 + while ((percent_index = index(line, "%e")) != 0) { + line = substr(line, percent_index + 2) + bracket_index = index(line, "}") + if (bracket_index == 0) { + continue + } + msgid = substr(line, 1, bracket_index - 1) + if (index(msgid, "%") != 0) { + continue + } + printf "#line %d \"%s\"\n", FNR, FILENAME + printf "_(\"%s\")\n", msgid + line = substr(line, bracket_index + 1) + } + } +' +(cd $directory && + $AWK "$generate_emsgids" $files < /dev/null +) > $directory/$tmp || exit + +# Run the xgettext command, with temporary added as a file to scan. +"$xgettext" $keyword_options ${1+"$@"} $tmp || exit + +# Clean up. +# If we don't get here, `make clean' will remove this file later. +rm -f $directory/$tmp diff --git a/gnu/dist/diffutils/lib/Makefile.am b/gnu/dist/diffutils/lib/Makefile.am new file mode 100644 index 00000000000..dd3ae13dfff --- /dev/null +++ b/gnu/dist/diffutils/lib/Makefile.am @@ -0,0 +1,42 @@ +# Automakefile for GNU Diffutils library. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +noinst_LIBRARIES = libdiffutils.a + +EXTRA_DIST = alloca.c fnmatch.c inttostr.c malloc.c memchr.c mkstemp.c \ + realloc.c regex.c strcasecmp.c strtoimax.c strtol.c tempname.c waitpid.c \ + xstrtol.c +SUBDIRS = posix + +noinst_HEADERS = \ + c-stack.h cmpbuf.h dirname.h error.h exclude.h exitfail.h \ + fnmatch.hin freesoft.h getopt.h \ + gettext.h hard-locale.h inttostr.h prepargs.h posixver.h quotesys.h \ + regex.hin setmode.h unlocked-io.h xalloc.h xstrtol.h + +libdiffutils_a_SOURCES = \ + basename.c c-stack.c cmpbuf.c error.c exclude.c exitfail.c \ + freesoft.c getopt.c getopt1.c \ + hard-locale.c imaxtostr.c offtostr.c prepargs.c posixver.c quotesys.c \ + setmode.c strftime.c umaxtostr.c xmalloc.c xstrtoumax.c + +libdiffutils_a_LIBADD = @ALLOCA@ @LIBOBJS@ +libdiffutils_a_DEPENDENCIES = $(libdiffutils_a_LIBADD) + +DISTCLEANFILES = fnmatch.h fnmatch.hno regex.h regex.hno diff --git a/gnu/dist/diffutils/lib/Makefile.in b/gnu/dist/diffutils/lib/Makefile.in new file mode 100644 index 00000000000..d0fbd2ff89b --- /dev/null +++ b/gnu/dist/diffutils/lib/Makefile.in @@ -0,0 +1,493 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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@ + +# Automakefile for GNU Diffutils library. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +noinst_LIBRARIES = libdiffutils.a + +EXTRA_DIST = alloca.c fnmatch.c inttostr.c malloc.c memchr.c mkstemp.c \ + realloc.c regex.c strcasecmp.c strtoimax.c strtol.c tempname.c waitpid.c \ + xstrtol.c + +SUBDIRS = posix + +noinst_HEADERS = \ + c-stack.h cmpbuf.h dirname.h error.h exclude.h exitfail.h \ + fnmatch.hin freesoft.h getopt.h \ + gettext.h hard-locale.h inttostr.h prepargs.h posixver.h quotesys.h \ + regex.hin setmode.h unlocked-io.h xalloc.h xstrtol.h + + +libdiffutils_a_SOURCES = \ + basename.c c-stack.c cmpbuf.c error.c exclude.c exitfail.c \ + freesoft.c getopt.c getopt1.c \ + hard-locale.c imaxtostr.c offtostr.c prepargs.c posixver.c quotesys.c \ + setmode.c strftime.c umaxtostr.c xmalloc.c xstrtoumax.c + + +libdiffutils_a_LIBADD = @ALLOCA@ @LIBOBJS@ +libdiffutils_a_DEPENDENCIES = $(libdiffutils_a_LIBADD) + +DISTCLEANFILES = fnmatch.h fnmatch.hno regex.h regex.hno +subdir = lib +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + +libdiffutils_a_AR = $(AR) cru +am_libdiffutils_a_OBJECTS = basename.$(OBJEXT) c-stack.$(OBJEXT) \ + cmpbuf.$(OBJEXT) error.$(OBJEXT) exclude.$(OBJEXT) \ + exitfail.$(OBJEXT) freesoft.$(OBJEXT) getopt.$(OBJEXT) \ + getopt1.$(OBJEXT) hard-locale.$(OBJEXT) imaxtostr.$(OBJEXT) \ + offtostr.$(OBJEXT) prepargs.$(OBJEXT) posixver.$(OBJEXT) \ + quotesys.$(OBJEXT) setmode.$(OBJEXT) strftime.$(OBJEXT) \ + umaxtostr.$(OBJEXT) xmalloc.$(OBJEXT) xstrtoumax.$(OBJEXT) +libdiffutils_a_OBJECTS = $(am_libdiffutils_a_OBJECTS) + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/alloca.Po $(DEPDIR)/fnmatch.Po \ +@AMDEP_TRUE@ $(DEPDIR)/malloc.Po $(DEPDIR)/memchr.Po \ +@AMDEP_TRUE@ $(DEPDIR)/mkstemp.Po $(DEPDIR)/realloc.Po \ +@AMDEP_TRUE@ $(DEPDIR)/regex.Po $(DEPDIR)/strcasecmp.Po \ +@AMDEP_TRUE@ $(DEPDIR)/strtoul.Po $(DEPDIR)/strtoull.Po \ +@AMDEP_TRUE@ $(DEPDIR)/strtoumax.Po $(DEPDIR)/tempname.Po \ +@AMDEP_TRUE@ $(DEPDIR)/waitpid.Po ./$(DEPDIR)/basename.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/c-stack.Po ./$(DEPDIR)/cmpbuf.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/error.Po ./$(DEPDIR)/exclude.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/exitfail.Po ./$(DEPDIR)/freesoft.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/getopt.Po ./$(DEPDIR)/getopt1.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/hard-locale.Po ./$(DEPDIR)/imaxtostr.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/offtostr.Po ./$(DEPDIR)/posixver.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/prepargs.Po ./$(DEPDIR)/quotesys.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/setmode.Po ./$(DEPDIR)/strftime.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/umaxtostr.Po ./$(DEPDIR)/xmalloc.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/xstrtoumax.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(libdiffutils_a_SOURCES) +HEADERS = $(noinst_HEADERS) + + +RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \ + uninstall-info-recursive all-recursive install-data-recursive \ + install-exec-recursive installdirs-recursive install-recursive \ + uninstall-recursive check-recursive installcheck-recursive +DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in alloca.c \ + fnmatch.c malloc.c memchr.c mkstemp.c realloc.c regex.c \ + strcasecmp.c strtoul.c strtoull.c strtoumax.c tempname.c \ + waitpid.c +DIST_SUBDIRS = $(SUBDIRS) +SOURCES = $(libdiffutils_a_SOURCES) + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits lib/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) + +AR = ar + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libdiffutils.a: $(libdiffutils_a_OBJECTS) $(libdiffutils_a_DEPENDENCIES) + -rm -f libdiffutils.a + $(libdiffutils_a_AR) libdiffutils.a $(libdiffutils_a_OBJECTS) $(libdiffutils_a_LIBADD) + $(RANLIB) libdiffutils.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fnmatch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/malloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memchr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/realloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/regex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.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)/waitpid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-stack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmpbuf.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)/freesoft.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)/hard-locale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imaxtostr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/offtostr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posixver.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prepargs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quotesys.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setmode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strftime.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/umaxtostr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrtoumax.Po@am__quote@ + +distclean-depend: + -rm -rf $(DEPDIR) ./$(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +# 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): + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + 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) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +ETAGS = etags +ETAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_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 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + cp -pR $$d/$$file $(distdir)$$dir \ + || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" \ + distdir=../$(distdir)/$$subdir \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LIBRARIES) $(HEADERS) +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am + +distclean: distclean-recursive + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \ + clean-generic clean-noinstLIBRARIES clean-recursive distclean \ + distclean-compile distclean-depend distclean-generic \ + distclean-recursive distclean-tags distdir dvi dvi-am \ + dvi-recursive info info-am info-recursive install install-am \ + install-data install-data-am install-data-recursive \ + install-exec install-exec-am install-exec-recursive \ + install-info install-info-am install-info-recursive install-man \ + install-recursive install-strip installcheck installcheck-am \ + installdirs installdirs-am installdirs-recursive \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-recursive tags tags-recursive \ + uninstall uninstall-am uninstall-info-am \ + uninstall-info-recursive uninstall-recursive + +# 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/gnu/dist/diffutils/lib/alloca.c b/gnu/dist/diffutils/lib/alloca.c new file mode 100644 index 00000000000..506331d27bb --- /dev/null +++ b/gnu/dist/diffutils/lib/alloca.c @@ -0,0 +1,506 @@ +/* $NetBSD: alloca.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant <jot@cray.com> contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STRING_H +# include <string.h> +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifdef emacs +# include "blockinput.h" +#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 +# 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 + +# if __STDC__ +typedef void *pointer; +# else +typedef char *pointer; +# endif + +# ifndef NULL +# define NULL 0 +# endif + +/* Different portions of Emacs need to call different versions of + malloc. The Emacs executable needs alloca to call xmalloc, because + ordinary malloc isn't protected from input signals. On the other + hand, the utilities in lib-src need alloca to call malloc; some of + them are very simple, and don't have an xmalloc routine. + + Non-Emacs programs expect this to call xmalloc. + + Callers below should use malloc. */ + +# ifndef emacs +# undef malloc +# define malloc xmalloc +# endif +extern pointer malloc (); + +/* 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 () +{ + 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. */ + +pointer +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 ((pointer) 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. */ + + { + register pointer new = malloc (sizeof (header) + size); + /* Address of header. */ + + if (new == 0) + abort(); + + ((header *) new)->h.next = last_alloca_header; + ((header *) new)->h.deep = depth; + + last_alloca_header = (header *) new; + + /* User storage begins just after header. */ + + return (pointer) ((char *) new + sizeof (header)); + } +} + +# if defined (CRAY) && defined (CRAY_STACKSEG_END) + +# ifdef DEBUG_I00AFUNC +# include <stdio.h> +# endif + +# ifndef CRAY_STACK +# define CRAY_STACK +# ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +# else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +# endif /* CRAY2 */ +# endif /* not CRAY_STACK */ + +# ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +# else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +# endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +# endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +# endif /* not CRAY2 */ +# endif /* CRAY */ + +# endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/gnu/dist/diffutils/lib/basename.c b/gnu/dist/diffutils/lib/basename.c new file mode 100644 index 00000000000..ac50b6a1bd7 --- /dev/null +++ b/gnu/dist/diffutils/lib/basename.c @@ -0,0 +1,81 @@ +/* $NetBSD: basename.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* basename.c -- return the last element in a path + Copyright (C) 1990, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if STDC_HEADERS || HAVE_STRING_H +# include <string.h> +#endif +#include "dirname.h" + +/* 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 address of the last file name component of NAME. If + NAME has no file name components because it is all slashes, return + NAME if it is empty, the address of its last slash otherwise. */ + +char * +base_name (char const *name) +{ + char const *base = name + FILESYSTEM_PREFIX_LEN (name); + char const *p; + + for (p = base; *p; p++) + { + if (ISSLASH (*p)) + { + /* Treat multiple adjacent slashes like a single slash. */ + do p++; + while (ISSLASH (*p)); + + /* If the file name ends in slash, use the trailing slash as + the basename if no non-slashes have been found. */ + if (! *p) + { + if (ISSLASH (*base)) + base = p - 1; + break; + } + + /* *P is a non-slash preceded by a slash. */ + base = p; + } + } + + return (char *) base; +} + +/* Return the length of of the basename NAME. Typically NAME is the + value returned by base_name. Act like strlen (NAME), except omit + redundant trailing slashes. */ + +size_t +base_len (char const *name) +{ + size_t len; + + for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) + continue; + + return len; +} diff --git a/gnu/dist/diffutils/lib/c-stack.c b/gnu/dist/diffutils/lib/c-stack.c new file mode 100644 index 00000000000..7826573b0c4 --- /dev/null +++ b/gnu/dist/diffutils/lib/c-stack.c @@ -0,0 +1,239 @@ +/* $NetBSD: c-stack.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Stack overflow handling. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +/* This module assumes that each stack frame is smaller than a page. + If you use alloca, dynamic arrays, or large local variables, your + program may extend the stack by more than a page at a time. If so, + the code below may incorrectly report a program error, or worse + yet, may not detect the overflow at all. To avoid this problem, + don't use large local arrays. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +#include <errno.h> +#ifndef ENOTSUP +# define ENOTSUP EINVAL +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#else +# if HAVE_STDINT_H +# include <stdint.h> +# endif +#endif + +#include <signal.h> +#include <stdlib.h> +#include <string.h> + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifndef STDERR_FILENO +# define STDERR_FILENO 2 +#endif + +#include "c-stack.h" +#include "exitfail.h" + +extern char *program_name; + +#if HAVE_XSI_STACK_OVERFLOW_HEURISTIC + +# include <ucontext.h> + + +/* Storage for the alternate signal stack. */ +static union +{ + char buffer[SIGSTKSZ]; + + /* These other members are for proper alignment. There's no + standard way to guarantee stack alignment, but this seems enough + in practice. */ + long double ld; + uintmax_t u; + void *p; +} alternate_signal_stack; + + +/* Direction of the C runtime stack. This function is + async-signal-safe. */ + +# if STACK_DIRECTION +# define find_stack_direction(ptr) STACK_DIRECTION +# else +static int +find_stack_direction (char const *addr) +{ + char dummy; + return ! addr ? find_stack_direction (&dummy) : addr < &dummy ? 1 : -1; +} +# endif + +/* The SIGSEGV handler. */ +static void (* volatile segv_action) (int, siginfo_t *, void *); + +/* Handle a segmentation violation and exit. This function is + async-signal-safe. */ + +static void +segv_handler (int signo, siginfo_t *info, void *context) +{ + /* Clear SIGNO if it seems to have been a stack overflow. */ + if (0 < info->si_code) + { + /* If the faulting address is within the stack, or within one + page of the stack end, assume that it is a stack + overflow. */ + ucontext_t const *user_context = context; + char const *stack_min = user_context->uc_stack.ss_sp; + size_t stack_size = user_context->uc_stack.ss_size; + char const *faulting_address = info->si_addr; + size_t s = faulting_address - stack_min; + size_t page_size = sysconf (_SC_PAGESIZE); + if (find_stack_direction (0) < 0) + s += page_size; + if (s < stack_size + page_size) + signo = 0; + } + + segv_action (signo, info, context); +} + +#endif /* HAVE_XSI_STACK_OVERFLOW_HEURISTIC */ + + +/* Translated messages for program errors and stack overflow. Do not + translate them in the signal handler, since gettext is not + async-signal-safe. */ +static char const * volatile program_error_message; +static char const * volatile stack_overflow_message; + +/* Output an error message, then exit with status EXIT_FAILURE if it + appears to have been a stack overflow, or with a core dump + otherwise. This function is async-signal-safe. */ + +void +c_stack_die (int signo, siginfo_t *info, void *context) +{ + char const *message = + signo ? program_error_message : stack_overflow_message; + write (STDERR_FILENO, program_name, strlen (program_name)); + write (STDERR_FILENO, ": ", 2); + write (STDERR_FILENO, message, strlen (message)); + write (STDERR_FILENO, "\n", 1); + if (! signo) + _exit (exit_failure); +#if HAVE_SIGINFO_T + if (context && info && 0 <= info->si_code) + { + /* Re-raise the exception at the same address. */ + char *addr = info->si_addr; + *addr = 0; + } +#endif + kill (getpid (), signo); +} + + +/* Set up ACTION so that it is invoked on C stack overflow. Return -1 + (setting errno) if this cannot be done. + + ACTION must invoke only async-signal-safe functions. ACTION + together with its callees must not require more than SIGSTKSZ bytes + of stack space. */ + +int +c_stack_action (void (*action) (int, siginfo_t *, void *)) +{ +#if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC + errno = ENOTSUP; + return -1; +#else + struct sigaction act; + stack_t st; + int r; + + st.ss_flags = 0; + st.ss_sp = alternate_signal_stack.buffer; + st.ss_size = sizeof alternate_signal_stack.buffer; + r = sigaltstack (&st, 0); + if (r != 0) + return r; + + program_error_message = _("program error"); + stack_overflow_message = _("stack overflow"); + segv_action = action; + + sigemptyset (&act.sa_mask); + + /* POSIX 1003.1-2001 says SA_RESETHAND implies SA_NODEFER, but this + is not true on Solaris 8 at least. It doesn't hurt to use + SA_NODEFER here, so leave it in. */ + act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; + + act.sa_sigaction = segv_handler; + return sigaction (SIGSEGV, &act, 0); +#endif +} + +#if DEBUG + +#include <stdio.h> + +int volatile exit_failure; + +static long +recurse (char *p) +{ + char array[500]; + array[0] = 1; + return *p + recurse (array); +} + +char *program_name; + +int +main (int argc, char **argv) +{ + program_name = argv[0]; + c_stack_action (c_stack_die); + return recurse ("\1"); +} + +#endif /* DEBUG */ + +/* +Local Variables: +compile-command: "gcc -D_GNU_SOURCE -DDEBUG \ + -DHAVE_INTTYPES_H -DHAVE_SIGINFO_T \ + -DHAVE_XSI_STACK_OVERFLOW_HEURISTIC -DHAVE_UNISTD_H \ + -Wall -W -g c-stack.c -o c-stack" +End: +*/ diff --git a/gnu/dist/diffutils/lib/c-stack.h b/gnu/dist/diffutils/lib/c-stack.h new file mode 100644 index 00000000000..7ca81b48fb0 --- /dev/null +++ b/gnu/dist/diffutils/lib/c-stack.h @@ -0,0 +1,26 @@ +/* $NetBSD: c-stack.h,v 1.1.1.1 2003/01/26 00:43:13 wiz Exp $ */ + +/* Stack overflow handling. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if ! HAVE_SIGINFO_T +# define siginfo_t void +#endif + +int c_stack_action (void (*) (int, siginfo_t *, void *)); +void c_stack_die (int, siginfo_t *, void *); diff --git a/gnu/dist/diffutils/lib/cmpbuf.c b/gnu/dist/diffutils/lib/cmpbuf.c new file mode 100644 index 00000000000..95c21b8cef5 --- /dev/null +++ b/gnu/dist/diffutils/lib/cmpbuf.c @@ -0,0 +1,149 @@ +/* $NetBSD: cmpbuf.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Buffer primitives for comparison operations. + + Copyright (C) 1993, 1995, 1998, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <errno.h> +#include <limits.h> + +#include <signal.h> +#ifndef SA_RESTART +# ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ +# define SA_RESTART SA_INTERRUPT +# else +# define SA_RESTART 0 +# endif +#endif + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#include <sys/types.h> +#include "cmpbuf.h" + +/* Determine whether an integer type is signed, and its bounds. + This code assumes two's (or one's!) complement with no holes. */ + +/* The extra casts work around common compiler bugs, + e.g. Cray C 5.0.3.0 when t == time_t. */ +#ifndef TYPE_SIGNED +# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +#endif +#ifndef TYPE_MINIMUM +# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ + : (t) 0)) +#endif +#ifndef TYPE_MAXIMUM +# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) +#endif + +#ifndef PTRDIFF_MAX +# define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) +#endif +#ifndef SIZE_MAX +# define SIZE_MAX TYPE_MAXIMUM (size_t) +#endif +#ifndef SSIZE_MAX +# define SSIZE_MAX TYPE_MAXIMUM (ssize_t) +#endif + +#undef MIN +#define MIN(a, b) ((a) <= (b) ? (a) : (b)) + +/* Read NBYTES bytes from descriptor FD into BUF. + NBYTES must not be SIZE_MAX. + Return the number of characters successfully read. + On error, return SIZE_MAX, setting errno. + The number returned is always NBYTES unless end-of-file or error. */ + +size_t +block_read (int fd, char *buf, size_t nbytes) +{ + char *bp = buf; + char const *buflim = buf + nbytes; + size_t readlim = SSIZE_MAX; + + do + { + size_t bytes_to_read = MIN (buflim - bp, readlim); + ssize_t nread = read (fd, bp, bytes_to_read); + if (nread <= 0) + { + if (nread == 0) + break; + + /* Accommodate Tru64 5.1, which can't read more than INT_MAX + bytes at a time. They call that a 64-bit OS? */ + if (errno == EINVAL && INT_MAX < bytes_to_read) + { + readlim = INT_MAX; + continue; + } + + /* This is needed for programs that have signal handlers on + older hosts without SA_RESTART. It also accommodates + ancient AIX hosts that set errno to EINTR after uncaught + SIGCONT. See <news:1r77ojINN85n@ftp.UU.NET> + (1993-04-22). */ + if (! SA_RESTART && errno == EINTR) + continue; + + return SIZE_MAX; + } + bp += nread; + } + while (bp < buflim); + + return bp - buf; +} + +/* Least common multiple of two buffer sizes A and B. However, if + either A or B is zero, or if the multiple is greater than LCM_MAX, + return a reasonable buffer size. */ + +size_t +buffer_lcm (size_t a, size_t b, size_t lcm_max) +{ + size_t lcm, m, n, q, r; + + /* Yield reasonable values if buffer sizes are zero. */ + if (!a) + return b ? b : 8 * 1024; + if (!b) + return a; + + /* n = gcd (a, b) */ + for (m = a, n = b; (r = m % n) != 0; m = n, n = r) + continue; + + /* Yield a if there is an overflow. */ + q = a / n; + lcm = q * b; + return lcm <= lcm_max && lcm / b == q ? lcm : a; +} diff --git a/gnu/dist/diffutils/lib/cmpbuf.h b/gnu/dist/diffutils/lib/cmpbuf.h new file mode 100644 index 00000000000..49229804a44 --- /dev/null +++ b/gnu/dist/diffutils/lib/cmpbuf.h @@ -0,0 +1,23 @@ +/* $NetBSD: cmpbuf.h,v 1.1.1.1 2003/01/26 00:43:13 wiz Exp $ */ + +/* Buffer primitives for comparison operations. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +size_t block_read (int, char *, size_t); +size_t buffer_lcm (size_t, size_t, size_t); diff --git a/gnu/dist/diffutils/lib/dirname.h b/gnu/dist/diffutils/lib/dirname.h new file mode 100644 index 00000000000..4791e44df22 --- /dev/null +++ b/gnu/dist/diffutils/lib/dirname.h @@ -0,0 +1,49 @@ +/* $NetBSD: dirname.h,v 1.1.1.1 2003/01/26 00:43:13 wiz Exp $ */ + +/* Copyright (C) 1998, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +# endif + +# ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +# endif + +# ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +# endif + +# ifndef FILESYSTEM_PREFIX_LEN +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +# endif + +char *base_name PARAMS ((char const *path)); +char *dir_name PARAMS ((char const *path)); +size_t base_len PARAMS ((char const *path)); +size_t dir_len PARAMS ((char const *path)); + +int strip_trailing_slashes PARAMS ((char *path)); + +#endif /* not DIRNAME_H_ */ diff --git a/gnu/dist/diffutils/lib/error.c b/gnu/dist/diffutils/lib/error.c new file mode 100644 index 00000000000..6f5f7bd2fbb --- /dev/null +++ b/gnu/dist/diffutils/lib/error.c @@ -0,0 +1,402 @@ +/* $NetBSD: error.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#if HAVE_LIBINTL_H +# include <libintl.h> +#endif +#ifdef _LIBC +# include <wchar.h> +# define mbsrtowcs __mbsrtowcs +#endif + +#if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC +# if __STDC__ +# include <stdarg.h> +# define VA_START(args, lastarg) va_start(args, lastarg) +# else +# include <varargs.h> +# define VA_START(args, lastarg) va_start(args) +# endif +#else +# define va_alist a1, a2, a3, a4, a5, a6, a7, a8 +# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; +#endif + +#if STDC_HEADERS || _LIBC +# include <stdlib.h> +# include <string.h> +#else +void exit (); +#endif + +#include "error.h" +#include "unlocked-io.h" + +#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) ( +#if __STDC__ - 0 + void +#endif + ); + +/* This variable is incremented each time `error' is called. */ +unsigned int error_message_count; + +#ifdef _LIBC +/* In the GNU C library, there is a predefined variable for this. */ + +# define program_name program_invocation_name +# include <errno.h> + +/* 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 + +# ifdef USE_IN_LIBIO +# include <libio/iolibio.h> +# define fflush(s) _IO_fflush (s) +# endif + +#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 +# else +# if HAVE_STRERROR +# ifndef HAVE_DECL_STRERROR +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRERROR +char *strerror (); +# endif +# else +static char * +private_strerror (int errnum) +{ + extern char *sys_errlist[]; + extern int sys_nerr; + + if (errnum > 0 && errnum <= sys_nerr) + return _(sys_errlist[errnum]); + return _("Unknown system error"); +} +# define strerror private_strerror +# endif /* HAVE_STRERROR */ +# 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 && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + { + __fwprintf (stderr, L": %s", s); + return; + } +#endif + + fprintf (stderr, ": %s", s); +} + +#ifdef VA_START +static void +error_tail (int status, int errnum, const char *message, va_list args) +{ +# if HAVE_VPRINTF || _LIBC +# if _LIBC && USE_IN_LIBIO + 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; + + do + { + if (len < ALLOCA_LIMIT) + wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); + else + { + if (wmessage != NULL && len / 2 < ALLOCA_LIMIT) + wmessage = NULL; + + wmessage = (wchar_t *) realloc (wmessage, + len * sizeof (wchar_t)); + + if (wmessage == NULL) + { + fputws_unlocked (L"out of memory\n", stderr); + return; + } + } + + memset (&st, '\0', sizeof (st)); + tmp =message; + } + while ((res = mbsrtowcs (wmessage, &tmp, len, &st)) == len); + + if (res == (size_t) -1) + /* The string cannot be converted. */ + wmessage = (wchar_t *) L"???"; + + __vfwprintf (stderr, wmessage, args); + } + else +# endif + vfprintf (stderr, message, args); +# else + _doprnt (message, args, stderr); +# endif + va_end (args); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); +# if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + putwc (L'\n', stderr); + else +# endif + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +} +#endif + + +/* 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. */ +/* VARARGS */ +void +#if defined VA_START && __STDC__ +error (int status, int errnum, const char *message, ...) +#else +error (status, errnum, message, va_alist) + int status; + int errnum; + char *message; + va_dcl +#endif +{ +#ifdef VA_START + va_list args; +#endif + + fflush (stdout); +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_flockfile (stderr); +# else + __flockfile (stderr); +# endif +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s: ", program_name); + } + +#ifdef VA_START + VA_START (args, message); + error_tail (status, errnum, message, args); +#else + fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +#endif + +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_funlockfile (stderr); +# else + __funlockfile (stderr); +# 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 +#if defined VA_START && __STDC__ +error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, ...) +#else +error_at_line (status, errnum, file_name, line_number, message, va_alist) + int status; + int errnum; + const char *file_name; + unsigned int line_number; + char *message; + va_dcl +#endif +{ +#ifdef VA_START + va_list args; +#endif + + 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; + } + + fflush (stdout); +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_flockfile (stderr); +# else + __flockfile (stderr); +# endif +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s:", program_name); + } + + if (file_name != NULL) + { +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s:%d: ", file_name, line_number); + else +#endif + fprintf (stderr, "%s:%d: ", file_name, line_number); + } + +#ifdef VA_START + VA_START (args, message); + error_tail (status, errnum, message, args); +#else + fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +#endif + +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_funlockfile (stderr); +# else + __funlockfile (stderr); +# 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/gnu/dist/diffutils/lib/error.h b/gnu/dist/diffutils/lib/error.h new file mode 100644 index 00000000000..bfc76781545 --- /dev/null +++ b/gnu/dist/diffutils/lib/error.h @@ -0,0 +1,80 @@ +/* $NetBSD: error.h,v 1.1.1.1 2003/01/26 00:43:13 wiz Exp $ */ + +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _ERROR_H +#define _ERROR_H 1 + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# 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 + +#if defined (__STDC__) && __STDC__ + +/* 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); + +#else +void error (); +void error_at_line (); +extern void (*error_print_progname) (); +#endif + +/* 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/gnu/dist/diffutils/lib/exclude.c b/gnu/dist/diffutils/lib/exclude.c new file mode 100644 index 00000000000..415c3f51a29 --- /dev/null +++ b/gnu/dist/diffutils/lib/exclude.c @@ -0,0 +1,270 @@ +/* $NetBSD: exclude.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* exclude.c -- exclude file names + + Copyright 1992, 1993, 1994, 1997, 1999, 2000, 2001 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com> */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STDBOOL_H +# include <stdbool.h> +#else +typedef enum {false = 0, true = 1} bool; +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif +#include <stdio.h> +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if HAVE_STRING_H +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#if HAVE_INTTYPES_H +# include <inttypes.h> +#else +# if HAVE_STDINT_H +# include <stdint.h> +# endif +#endif + +#include "exclude.h" +#include "fnmatch.h" +#include "unlocked-io.h" +#include "xalloc.h" + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +/* Verify a requirement at compile-time (unlike assert, which is runtime). */ +#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } + +verify (EXCLUDE_macros_do_not_collide_with_FNM_macros, + (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS) + & (FNM_FILE_NAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR + | FNM_CASEFOLD)) + == 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) +{ + struct exclude *ex = (struct exclude *) xmalloc (sizeof *ex); + ex->exclude_count = 0; + ex->exclude_alloc = (1 << 6); /* This must be a power of 2. */ + ex->exclude = (struct patopts *) xmalloc (ex->exclude_alloc + * sizeof ex->exclude[0]); + return ex; +} + +/* 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) + ? strcasecmp (pattern, f) + : strcmp (pattern, f)); + else + { + size_t patlen = strlen (pattern); + int r = ((options & FNM_CASEFOLD) + ? strncasecmp (pattern, f, patlen) + : strncmp (pattern, f, patlen)); + if (! r) + { + r = f[patlen]; + if (r == '/') + r = 0; + } + return r; + } +} + +/* Return true if EX excludes F. */ + +bool +excluded_filename (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)) + { + int (*matcher) PARAMS ((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); + + excluded ^= matched; + } + } + + 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_alloc <= ex->exclude_count) + { + size_t s = 2 * ex->exclude_alloc; + if (! (0 < s && s <= SIZE_MAX / sizeof ex->exclude[0])) + xalloc_die (); + ex->exclude_alloc = s; + ex->exclude = (struct patopts *) xrealloc (ex->exclude, + s * sizeof ex->exclude[0]); + } + + patopts = &ex->exclude[ex->exclude_count++]; + patopts->pattern = pattern; + patopts->options = options; +} + +/* Use ADD_FUNC to append to EX the patterns in FILENAME, each with + OPTIONS. LINE_END terminates each pattern in the file. Return -1 + on failure, 0 on success. */ + +int +add_exclude_file (void (*add_func) PARAMS ((struct exclude *, + char const *, int)), + struct exclude *ex, char const *filename, int options, + char line_end) +{ + bool use_stdin = filename[0] == '-' && !filename[1]; + FILE *in; + char *buf; + char *p; + char const *pattern; + char const *lim; + size_t buf_alloc = (1 << 10); /* This must be a power of two. */ + size_t buf_count = 0; + int c; + int e = 0; + + if (use_stdin) + in = stdin; + else if (! (in = fopen (filename, "r"))) + return -1; + + buf = xmalloc (buf_alloc); + + while ((c = getc (in)) != EOF) + { + buf[buf_count++] = c; + if (buf_count == buf_alloc) + { + buf_alloc *= 2; + if (! buf_alloc) + xalloc_die (); + buf = xrealloc (buf, buf_alloc); + } + } + + if (ferror (in)) + e = errno; + + if (!use_stdin && fclose (in) != 0) + e = errno; + + buf = xrealloc (buf, buf_count + 1); + + for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++) + if (p < lim ? *p == line_end : buf < p && p[-1]) + { + *p = '\0'; + (*add_func) (ex, pattern, options); + pattern = p + 1; + } + + errno = e; + return e ? -1 : 0; +} diff --git a/gnu/dist/diffutils/lib/exclude.h b/gnu/dist/diffutils/lib/exclude.h new file mode 100644 index 00000000000..712089ae392 --- /dev/null +++ b/gnu/dist/diffutils/lib/exclude.h @@ -0,0 +1,51 @@ +/* $NetBSD: exclude.h,v 1.1.1.1 2003/01/26 00:43:13 wiz Exp $ */ + +/* exclude.h -- declarations for excluding file names + Copyright 1992, 1993, 1994, 1997, 1999, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com> */ + +#ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* 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 << 5) + +/* Include instead of exclude. */ +#define EXCLUDE_INCLUDE (1 << 6) + +/* '?', '*', '[', and '\\' are special in patterns. Without this + option, these characters are ordinary and fnmatch is not used. */ +#define EXCLUDE_WILDCARDS (1 << 7) + +struct exclude; + +struct exclude *new_exclude PARAMS ((void)); +void free_exclude PARAMS ((struct exclude *)); +void add_exclude PARAMS ((struct exclude *, char const *, int)); +int add_exclude_file PARAMS ((void (*) (struct exclude *, char const *, int), + struct exclude *, char const *, int, char)); +bool excluded_filename PARAMS ((struct exclude const *, char const *)); diff --git a/gnu/dist/diffutils/lib/exitfail.c b/gnu/dist/diffutils/lib/exitfail.c new file mode 100644 index 00000000000..d23c0fc5e70 --- /dev/null +++ b/gnu/dist/diffutils/lib/exitfail.c @@ -0,0 +1,33 @@ +/* $NetBSD: exitfail.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Failure exit status + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +int volatile exit_failure = EXIT_FAILURE; diff --git a/gnu/dist/diffutils/lib/exitfail.h b/gnu/dist/diffutils/lib/exitfail.h new file mode 100644 index 00000000000..0436439c6b4 --- /dev/null +++ b/gnu/dist/diffutils/lib/exitfail.h @@ -0,0 +1,22 @@ +/* $NetBSD: exitfail.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Failure exit status + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +extern int volatile exit_failure; diff --git a/gnu/dist/diffutils/lib/fnmatch.c b/gnu/dist/diffutils/lib/fnmatch.c new file mode 100644 index 00000000000..6bce0fbf269 --- /dev/null +++ b/gnu/dist/diffutils/lib/fnmatch.c @@ -0,0 +1,232 @@ +/* $NetBSD: fnmatch.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Copyright 1991, 1992, 1993, 1996, 1997, 2000 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +/* Enable GNU extensions in fnmatch.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include <errno.h> +#include <fnmatch.h> +#include <ctype.h> + +#if defined STDC_HEADERS || !defined isascii +# define IN_CTYPE_DOMAIN(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) isascii (c) +#endif + +#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) + + +#ifndef errno +extern int errno; +#endif + +/* Match STRING against the filename pattern PATTERN, returning zero if + it matches, nonzero if not. */ +int +fnmatch (const char *pattern, const char *string, int flags) +{ + register const char *p = pattern, *n = string; + register char c; + +/* Note that this evaluates C many times. */ +#define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER ((unsigned char) (c)) \ + ? tolower ((unsigned char) (c)) \ + : (c)) + + while ((c = *p++) != '\0') + { + c = FOLD (c); + + switch (c) + { + case '?': + if (*n == '\0') + return FNM_NOMATCH; + else if ((flags & FNM_FILE_NAME) && *n == '/') + return FNM_NOMATCH; + else if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + break; + + case '\\': + if (!(flags & FNM_NOESCAPE)) + { + c = *p++; + if (c == '\0') + /* Trailing \ loses. */ + return FNM_NOMATCH; + c = FOLD (c); + } + if (FOLD (*n) != c) + return FNM_NOMATCH; + break; + + case '*': + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + for (c = *p++; c == '?' || c == '*'; c = *p++) + { + if (c == '?') + { + /* A ? needs to match one character. */ + if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME))) + /* There isn't another character; no match. */ + 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 == '\0') + { + if ((flags & (FNM_FILE_NAME | FNM_LEADING_DIR)) == FNM_FILE_NAME) + for (; *n != '\0'; n++) + if (*n == '/') + return FNM_NOMATCH; + return 0; + } + + { + char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; + c1 = FOLD (c1); + for (--p; *n != '\0'; ++n) + if ((c == '[' || FOLD (*n) == c1) && + fnmatch (p, n, flags & ~FNM_PERIOD) == 0) + return 0; + else if (*n == '/' && (flags & FNM_FILE_NAME)) + break; + return FNM_NOMATCH; + } + + case '[': + { + /* Nonzero if the sense of the character class is inverted. */ + register int not; + + if (*n == '\0') + return FNM_NOMATCH; + + if ((flags & FNM_PERIOD) && *n == '.' && + (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) + return FNM_NOMATCH; + + not = (*p == '!' || *p == '^'); + if (not) + ++p; + + c = *p++; + for (;;) + { + register char cstart = c, cend = c; + + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + cstart = cend = *p++; + } + + cstart = cend = FOLD (cstart); + + if (c == '\0') + /* [ (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + c = FOLD (c); + + if ((flags & FNM_FILE_NAME) && c == '/') + /* [/] can never match. */ + return FNM_NOMATCH; + + if (c == '-' && *p != ']') + { + cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + cend = FOLD (cend); + + c = *p++; + } + + if (FOLD (*n) >= cstart && FOLD (*n) <= cend) + goto matched; + + if (c == ']') + break; + } + if (!not) + return FNM_NOMATCH; + break; + + matched:; + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { + if (c == '\0') + /* [... (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; + } + } + if (not) + return FNM_NOMATCH; + } + break; + + default: + if (c != FOLD (*n)) + return FNM_NOMATCH; + } + + ++n; + } + + if (*n == '\0') + return 0; + + if ((flags & FNM_LEADING_DIR) && *n == '/') + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; + + return FNM_NOMATCH; + +#undef FOLD +} diff --git a/gnu/dist/diffutils/lib/fnmatch.hin b/gnu/dist/diffutils/lib/fnmatch.hin new file mode 100644 index 00000000000..af1dcf523bf --- /dev/null +++ b/gnu/dist/diffutils/lib/fnmatch.hin @@ -0,0 +1,69 @@ +/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _FNMATCH_H + +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) +#undef __P +#define __P(protos) protos +#else /* Not C++ or ANSI C. */ +#undef __P +#define __P(protos) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + + +/* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in <unistd.h>. */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + +/* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) +#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* Match STRING against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ +extern int fnmatch __P ((const char *__pattern, const char *__string, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/gnu/dist/diffutils/lib/freesoft.c b/gnu/dist/diffutils/lib/freesoft.c new file mode 100644 index 00000000000..7bcedc30b42 --- /dev/null +++ b/gnu/dist/diffutils/lib/freesoft.c @@ -0,0 +1,33 @@ +/* $NetBSD: freesoft.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Free software message ID. + + Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include "freesoft.h" + +#define N_(Text) Text + +char const free_software_msgid[] = N_("\ +This program comes with NO WARRANTY, to the extent permitted by law.\n\ +You may redistribute copies of this program\n\ +under the terms of the GNU General Public License.\n\ +For more information about these matters, see the file named COPYING."); diff --git a/gnu/dist/diffutils/lib/freesoft.h b/gnu/dist/diffutils/lib/freesoft.h new file mode 100644 index 00000000000..908840f0cac --- /dev/null +++ b/gnu/dist/diffutils/lib/freesoft.h @@ -0,0 +1,3 @@ +/* $NetBSD: freesoft.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +extern char const free_software_msgid[]; diff --git a/gnu/dist/diffutils/lib/getopt.c b/gnu/dist/diffutils/lib/getopt.c new file mode 100644 index 00000000000..3fc70f08067 --- /dev/null +++ b/gnu/dist/diffutils/lib/getopt.c @@ -0,0 +1,1069 @@ +/* $NetBSD: getopt.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* 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 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. 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. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include <gnu-versions.h> +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include <stdlib.h> +# include <unistd.h> +#endif /* GNU C library. */ + +#ifdef VMS +# include <unixlib.h> +# if HAVE_STRING_H - 0 +# include <string.h> +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include <libintl.h> +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' 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. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the 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.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; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_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. */ + +static char *nextchar; + +/* 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 = '?'; + +/* 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. + + 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. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include <string.h> +# define my_index strchr +#else + +# if HAVE_STRING_H +# include <string.h> +# else +# include <strings.h> +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* 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. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* 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; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +#endif + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* 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). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (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. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = 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 (nonoption_flags_len > 0 && top >= 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) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + 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. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* 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. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + 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. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_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[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *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 (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = 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 (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + 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 (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = 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 (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[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[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[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 = 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, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - 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) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + 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) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (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[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + 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 (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = 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, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - 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) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + 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) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + 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 (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + 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/gnu/dist/diffutils/lib/getopt.h b/gnu/dist/diffutils/lib/getopt.h new file mode 100644 index 00000000000..d7b8c526393 --- /dev/null +++ b/gnu/dist/diffutils/lib/getopt.h @@ -0,0 +1,181 @@ +/* $NetBSD: getopt.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include <features.h>, but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include <ctype.h>, which will pull in <features.h> for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include <ctype.h> +#endif + +#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 +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* 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 '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/gnu/dist/diffutils/lib/getopt1.c b/gnu/dist/diffutils/lib/getopt1.c new file mode 100644 index 00000000000..7d89bbe3337 --- /dev/null +++ b/gnu/dist/diffutils/lib/getopt1.c @@ -0,0 +1,189 @@ +/* $NetBSD: getopt1.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. 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. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include <gnu-versions.h> +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include <stdio.h> + +int +main (argc, argv) + 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/gnu/dist/diffutils/lib/gettext.h b/gnu/dist/diffutils/lib/gettext.h new file mode 100644 index 00000000000..9965fc62afd --- /dev/null +++ b/gnu/dist/diffutils/lib/gettext.h @@ -0,0 +1,61 @@ +/* $NetBSD: gettext.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include <libintl.h> + +#else + +/* 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) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((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 + +#endif /* _LIBGETTEXT_H */ diff --git a/gnu/dist/diffutils/lib/hard-locale.c b/gnu/dist/diffutils/lib/hard-locale.c new file mode 100644 index 00000000000..a2bfd68157f --- /dev/null +++ b/gnu/dist/diffutils/lib/hard-locale.c @@ -0,0 +1,81 @@ +/* $NetBSD: hard-locale.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* hard-locale.c -- Determine whether a locale is hard. + + Copyright (C) 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_LOCALE_H +# include <locale.h> +#endif + +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#if HAVE_STRING_H +# include <string.h> +#endif + +#include "hard-locale.h" + +/* Return nonzero if the current CATEGORY locale is hard, i.e. if you + can't get away with assuming traditional C or POSIX behavior. */ +int +hard_locale (int category) +{ +#if ! HAVE_SETLOCALE + return 0; +#else + + int hard = 1; + char const *p = setlocale (category, 0); + + if (p) + { +# if defined __GLIBC__ && 2 <= __GLIBC__ + if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0) + hard = 0; +# else + char *locale = malloc (strlen (p) + 1); + if (locale) + { + strcpy (locale, p); + + /* Temporarily set the locale to the "C" and "POSIX" locales + to find their names, so that we can determine whether one + or the other is the caller's locale. */ + if (((p = setlocale (category, "C")) + && strcmp (p, locale) == 0) + || ((p = setlocale (category, "POSIX")) + && strcmp (p, locale) == 0)) + hard = 0; + + /* Restore the caller's locale. */ + setlocale (category, locale); + free (locale); + } +# endif + } + + return hard; + +#endif +} diff --git a/gnu/dist/diffutils/lib/hard-locale.h b/gnu/dist/diffutils/lib/hard-locale.h new file mode 100644 index 00000000000..f535c45a4b2 --- /dev/null +++ b/gnu/dist/diffutils/lib/hard-locale.h @@ -0,0 +1,20 @@ +/* $NetBSD: hard-locale.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +#ifndef HARD_LOCALE_H_ +# define HARD_LOCALE_H_ 1 + +# if HAVE_CONFIG_H +# include <config.h> +# endif + +# ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +# endif + +int hard_locale PARAMS ((int)); + +#endif /* HARD_LOCALE_H_ */ diff --git a/gnu/dist/diffutils/lib/imaxtostr.c b/gnu/dist/diffutils/lib/imaxtostr.c new file mode 100644 index 00000000000..b1aa99d8e70 --- /dev/null +++ b/gnu/dist/diffutils/lib/imaxtostr.c @@ -0,0 +1,5 @@ +/* $NetBSD: imaxtostr.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +#define inttostr imaxtostr +#define inttype intmax_t +#include "inttostr.c" diff --git a/gnu/dist/diffutils/lib/inttostr.c b/gnu/dist/diffutils/lib/inttostr.c new file mode 100644 index 00000000000..35a99f88f24 --- /dev/null +++ b/gnu/dist/diffutils/lib/inttostr.c @@ -0,0 +1,51 @@ +/* $NetBSD: inttostr.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* inttostr.c -- convert integers to printable strings + + Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert */ + +#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/gnu/dist/diffutils/lib/inttostr.h b/gnu/dist/diffutils/lib/inttostr.h new file mode 100644 index 00000000000..2372cd5ee52 --- /dev/null +++ b/gnu/dist/diffutils/lib/inttostr.h @@ -0,0 +1,62 @@ +/* $NetBSD: inttostr.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* inttostr.h -- convert integers to printable strings + + Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#if HAVE_LIMITS_H +# include <limits.h> +#endif +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) + +/* Upper bound on the string length of an integer converted to string. + 302 / 1000 is ceil (log10 (2.0)). Subtract 1 for the sign bit; + add 1 for integer division truncation; add 1 more for a minus sign. */ +#define INT_STRLEN_BOUND(t) \ + ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t)) + +#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) + +#ifndef PARAMS +# if defined PROTOTYPES || defined __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +char *offtostr PARAMS ((off_t, char *)); +char *imaxtostr PARAMS ((intmax_t, char *)); +char *umaxtostr PARAMS ((uintmax_t, char *)); diff --git a/gnu/dist/diffutils/lib/malloc.c b/gnu/dist/diffutils/lib/malloc.c new file mode 100644 index 00000000000..677c9fa4017 --- /dev/null +++ b/gnu/dist/diffutils/lib/malloc.c @@ -0,0 +1,40 @@ +/* $NetBSD: malloc.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Work around bug on some systems where malloc (0) fails. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* written by Jim Meyering */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif +#undef malloc + +#include <sys/types.h> + +char *malloc (); + +/* Allocate an N-byte block of memory from the heap. + If N is zero, allocate a 1-byte block. */ + +char * +rpl_malloc (size_t n) +{ + if (n == 0) + n = 1; + return malloc (n); +} diff --git a/gnu/dist/diffutils/lib/memchr.c b/gnu/dist/diffutils/lib/memchr.c new file mode 100644 index 00000000000..9262a6f22cd --- /dev/null +++ b/gnu/dist/diffutils/lib/memchr.c @@ -0,0 +1,218 @@ +/* $NetBSD: memchr.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Copyright (C) 1991,93,96,97,99,2000 Free Software Foundation, Inc. + Based on strlen implementation by Torbjorn Granlund (tege@sics.se), + with help from Dan Sahlin (dan@sics.se) and + commentary by Jim Blandy (jimb@ai.mit.edu); + adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), + and implemented by Roland McGrath (roland@ai.mit.edu). + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#undef __ptr_t +#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) +# define __ptr_t void * +#else /* Not C++ or ANSI C. */ +# define __ptr_t char * +#endif /* C++ or ANSI C. */ + +#if defined _LIBC +# include <string.h> +# include <memcopy.h> +#else +# define reg_char char +#endif + +#if HAVE_STDLIB_H || defined _LIBC +# include <stdlib.h> +#endif + +#if HAVE_LIMITS_H || defined _LIBC +# include <limits.h> +#endif + +#define LONG_MAX_32_BITS 2147483647 + +#ifndef LONG_MAX +# define LONG_MAX LONG_MAX_32_BITS +#endif + +#include <sys/types.h> +#if HAVE_BP_SYM_H || defined _LIBC +# include <bp-sym.h> +#else +# define BP_SYM(sym) sym +#endif + +#undef memchr +#undef __memchr + +/* Search no more than N bytes of S for C. */ +__ptr_t +__memchr (s, c_in, n) + const __ptr_t 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; + + 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 && ((unsigned long int) char_ptr + & (sizeof (longword) - 1)) != 0; + --n, ++char_ptr) + if (*char_ptr == c) + return (__ptr_t) char_ptr; + + /* All these elucidatory comments refer to 4-byte longwords, + but the theory applies equally well to 8-byte longwords. */ + + longword_ptr = (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. */ + + if (sizeof (longword) != 4 && sizeof (longword) != 8) + abort (); + +#if LONG_MAX <= LONG_MAX_32_BITS + magic_bits = 0x7efefeff; +#else + magic_bits = ((unsigned long int) 0x7efefefe << 32) | 0xfefefeff; +#endif + + /* Set up a longword, each of whose bytes is C. */ + charmask = c | (c << 8); + charmask |= charmask << 16; +#if LONG_MAX > LONG_MAX_32_BITS + charmask |= charmask << 32; +#endif + + /* 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 (__ptr_t) cp; + if (cp[1] == c) + return (__ptr_t) &cp[1]; + if (cp[2] == c) + return (__ptr_t) &cp[2]; + if (cp[3] == c) + return (__ptr_t) &cp[3]; +#if LONG_MAX > 2147483647 + if (cp[4] == c) + return (__ptr_t) &cp[4]; + if (cp[5] == c) + return (__ptr_t) &cp[5]; + if (cp[6] == c) + return (__ptr_t) &cp[6]; + if (cp[7] == c) + return (__ptr_t) &cp[7]; +#endif + } + + n -= sizeof (longword); + } + + char_ptr = (const unsigned char *) longword_ptr; + + while (n-- > 0) + { + if (*char_ptr == c) + return (__ptr_t) char_ptr; + else + ++char_ptr; + } + + return 0; +} +#ifdef weak_alias +weak_alias (__memchr, BP_SYM (memchr)) +#endif diff --git a/gnu/dist/diffutils/lib/mkstemp.c b/gnu/dist/diffutils/lib/mkstemp.c new file mode 100644 index 00000000000..e4650ac748c --- /dev/null +++ b/gnu/dist/diffutils/lib/mkstemp.c @@ -0,0 +1,44 @@ +/* $NetBSD: mkstemp.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. + This file is derived from the one in the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include <config.h> + +/* Disable the definition of mkstemp to rpl_mkstemp (from config.h) in this + file. Otherwise, we'd get conflicting prototypes for rpl_mkstemp on + most systems. */ +#undef mkstemp + +#include <stdio.h> +#include <stdlib.h> + +#ifndef __GT_FILE +# define __GT_FILE 0 +#endif + +int __gen_tempname (); + +/* Generate a unique temporary file name from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the filename unique. + Then open the file and return a fd. */ +int +rpl_mkstemp (char *template) +{ + return __gen_tempname (template, __GT_FILE); +} diff --git a/gnu/dist/diffutils/lib/offtostr.c b/gnu/dist/diffutils/lib/offtostr.c new file mode 100644 index 00000000000..b267f7deb55 --- /dev/null +++ b/gnu/dist/diffutils/lib/offtostr.c @@ -0,0 +1,5 @@ +/* $NetBSD: offtostr.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +#define inttostr offtostr +#define inttype off_t +#include "inttostr.c" diff --git a/gnu/dist/diffutils/lib/posix/Makefile.am b/gnu/dist/diffutils/lib/posix/Makefile.am new file mode 100644 index 00000000000..610ef229ddf --- /dev/null +++ b/gnu/dist/diffutils/lib/posix/Makefile.am @@ -0,0 +1,4 @@ +## Process this file with automake to create Makefile.in +AUTOMAKE_OPTIONS=no-dependencies + +EXTRA_DIST = regex.h diff --git a/gnu/dist/diffutils/lib/posix/Makefile.in b/gnu/dist/diffutils/lib/posix/Makefile.in new file mode 100644 index 00000000000..47d8ee89350 --- /dev/null +++ b/gnu/dist/diffutils/lib/posix/Makefile.in @@ -0,0 +1,229 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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@ +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ +AUTOMAKE_OPTIONS = no-dependencies + +EXTRA_DIST = regex.h +subdir = lib/posix +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +depcomp = +am__depfiles_maybe = +DIST_SOURCES = +DIST_COMMON = Makefile.am Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits lib/posix/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +uninstall-info-am: +tags: TAGS +TAGS: + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = ../.. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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 + +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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 + +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic uninstall uninstall-am uninstall-info-am + +# 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/gnu/dist/diffutils/lib/posix/regex.h b/gnu/dist/diffutils/lib/posix/regex.h new file mode 100644 index 00000000000..3a4f6768ed5 --- /dev/null +++ b/gnu/dist/diffutils/lib/posix/regex.h @@ -0,0 +1,564 @@ +/* $NetBSD: regex.h,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* Definitions for data structures and routines for the regular + expression library, version 0.12. + Copyright (C) 1985,1989-1993,1995-1998, 2000 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _REGEX_H +#define _REGEX_H 1 + +/* Allow the use in C++ code. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX says that <sys/types.h> must be included (by the caller) before + <regex.h>. */ + +#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS +/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it + should be there. */ +# include <stddef.h> +#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; + +/* If this bit is not set, then \ inside a bracket expression is literal. + If set, then such a \ quotes the following character. */ +#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) + +/* If this bit is not set, then + and ? are operators, and \+ and \? are + literals. + If set, then \+ and \? are operators and + and ? are literals. */ +#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) + +/* If this bit is set, then character classes are supported. They are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */ +#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) + +/* If this bit is set, then ^ and $ are always anchors (outside bracket + expressions, of course). + If this bit is not set, then it depends: + ^ is an anchor if it is at the beginning of a regular + expression or after an open-group or an alternation operator; + $ is an anchor if it is at the end of a regular expression, or + before a close-group or an alternation operator. + + This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because + POSIX draft 11.2 says that * etc. in leading positions is undefined. + We already implemented a previous draft which made those constructs + invalid, though, so we haven't changed the code back. */ +#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) + +/* If this bit is set, then special characters are always special + regardless of where they are in the pattern. + If this bit is not set, then special characters are special only in + some contexts; otherwise they are ordinary. Specifically, + * + ? and intervals are only special when not after the beginning, + open-group, or alternation operator. */ +#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) + +/* If this bit is set, then *, +, ?, and { cannot be first in an re or + immediately after an alternation or begin-group operator. */ +#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) + +/* If this bit is set, then . matches newline. + If not set, then it doesn't. */ +#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) + +/* If this bit is set, then . doesn't match NUL. + If not set, then it does. */ +#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) + +/* If this bit is set, nonmatching lists [^...] do not match newline. + If not set, they do. */ +#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) + +/* If this bit is set, either \{...\} or {...} defines an + interval, depending on RE_NO_BK_BRACES. + If not set, \{, \}, {, and } are literals. */ +#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) + +/* If this bit is set, +, ? and | aren't recognized as operators. + If not set, they are. */ +#define RE_LIMITED_OPS (RE_INTERVALS << 1) + +/* If this bit is set, newline is an alternation operator. + If not set, newline is literal. */ +#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) + +/* If this bit is set, then `{...}' defines an interval, and \{ and \} + are literals. + If not set, then `\{...\}' defines an interval. */ +#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) + +/* If this bit is set, (...) defines a group, and \( and \) are literals. + If not set, \(...\) defines a group, and ( and ) are literals. */ +#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) + +/* If this bit is set, then \<digit> matches <digit>. + If not set, then \<digit> is a back-reference. */ +#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) + +/* If this bit is set, then | is an alternation operator, and \| is literal. + If not set, then \| is an alternation operator, and | is literal. */ +#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) + +/* If this bit is set, then an ending range point collating higher + than the starting range point, as in [z-a], is invalid. + If not set, then when ending range point collates higher than the + starting range point, the range is ignored. */ +#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) + +/* If this bit is set, then an unmatched ) is ordinary. + If not set, then an unmatched ) is invalid. */ +#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) + +/* If this bit is set, succeed as soon as we match the whole pattern, + without further backtracking. */ +#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) + +/* If this bit is set, do not process the GNU regex operators. + If not set, then the GNU regex operators are recognized. */ +#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) + +/* If this bit is set, turn on internal regex debugging. + If not set, and debugging was on, turn it off. + This only works if regex.c is compiled -DDEBUG. + We define this bit always, so that all that's needed to turn on + debugging is to recompile regex.c; the calling code can always have + this bit set, and it won't affect anything in the normal case. */ +#define RE_DEBUG (RE_NO_GNU_OPS << 1) + +/* If this bit is set, a syntactically invalid interval is treated as + a string of ordinary characters. For example, the ERE 'a{1' is + treated as 'a\{1'. */ +#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) + +/* 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; + +/* 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)) + +#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) + +/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes + RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this + isn't minimal, since other operators, such as \`, aren't disabled. */ +#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) + +#define RE_SYNTAX_POSIX_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ + | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) + +/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is + removed and RE_NO_BK_REFS is added. */ +#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) +/* [[[end syntaxes]]] */ + +/* Maximum number of duplicates an interval can allow. Some systems + (erroneously) define this in other header files, but we want our + value, so remove any previous define. */ +#ifdef RE_DUP_MAX +# undef RE_DUP_MAX +#endif +/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ +#define RE_DUP_MAX (0x7fff) + + +/* 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 (REG_EXTENDED << 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 (REG_ICASE << 1) + +/* 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 (REG_NEWLINE << 1) + + +/* 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) + + +/* If any error codes are removed, changed, or added, update the + `re_error_msg' table in regex.c. */ +typedef enum +{ +#ifdef _XOPEN_SOURCE + REG_ENOSYS = -1, /* This will never happen for this implementation. */ +#endif + + 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, /* Not implemented. */ + 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; + +/* 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. */ + +#ifndef RE_TRANSLATE_TYPE +# define RE_TRANSLATE_TYPE char * +#endif + +struct re_pattern_buffer +{ +/* [[[begin 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 *buffer; + + /* Number of bytes to which `buffer' points. */ + unsigned long int allocated; + + /* Number of bytes actually used in `buffer'. */ + unsigned long int used; + + /* Syntax setting with which the pattern was compiled. */ + reg_syntax_t 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 *fastmap; + + /* Either a translate table to apply to all characters before + comparing them, or zero for no translation. The translation + is applied to a pattern when it is compiled and to a string + when it is matched. */ + RE_TRANSLATE_TYPE 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 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. */ +#define REGS_UNALLOCATED 0 +#define REGS_REALLOCATE 1 +#define REGS_FIXED 2 + unsigned 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 fastmap_accurate : 1; + + /* If set, `re_match_2' does not return information about + subexpressions. */ + unsigned no_sub : 1; + + /* If set, a beginning-of-line anchor doesn't match at the + beginning of the string. */ + unsigned not_bol : 1; + + /* Similarly for an end-of-line anchor. */ + unsigned not_eol : 1; + + /* If true, an anchor at a newline matches. */ + unsigned newline_anchor : 1; + +/* [[[end pattern_buffer]]] */ +}; + +typedef struct re_pattern_buffer regex_t; + +/* Type for byte offsets within the string. POSIX mandates this. */ +typedef int regoff_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 +{ + unsigned num_regs; + regoff_t *start; + regoff_t *end; +}; + + +/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, + `re_match_2' returns information about at least this many registers + the first time a `regs' structure is passed. */ +#ifndef RE_NREGS +# define RE_NREGS 30 +#endif + + +/* 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. */ + +/* To avoid duplicating every routine declaration -- once with a + prototype (if we are ANSI), and once without (if we aren't) -- we + use the following macro to declare argument types. This + unfortunately clutters up the declarations a bit, but I think it's + worth it. */ + +#if __STDC__ + +# define _RE_ARGS(args) args + +#else /* not __STDC__ */ + +# define _RE_ARGS(args) () + +#endif /* not __STDC__ */ + +/* 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 _RE_ARGS ((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 + _RE_ARGS ((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 _RE_ARGS ((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 int re_search + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, int 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 int re_search_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, int stop)); + + +/* Like `re_search', but return how many characters in STRING the regexp + in BUFFER matched, starting at position START. */ +extern int re_match + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs)); + + +/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ +extern int re_match_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int 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 + _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, + unsigned 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 _RE_ARGS ((const char *)); +extern int re_exec _RE_ARGS ((const char *)); +# endif +#endif + +/* GCC 2.95 and later have "__restrict"; C99 compilers have + "restrict", and "configure" may have defined "restrict". */ +#ifndef __restrict +# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) +# if defined restrict || 199901L <= __STDC_VERSION__ +# define __restrict restrict +# else +# define __restrict +# endif +# endif +#endif +/* For now unconditionally define __restrict_arr to expand to nothing. + Ideally we would have a test for the compiler which allows defining + it to restrict. */ +#define __restrict_arr + +/* POSIX compatibility. */ +extern int regcomp _RE_ARGS ((regex_t *__restrict __preg, + const char *__restrict __pattern, + int __cflags)); + +extern int regexec _RE_ARGS ((const regex_t *__restrict __preg, + const char *__restrict __string, size_t __nmatch, + regmatch_t __pmatch[__restrict_arr], + int __eflags)); + +extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg, + char *__errbuf, size_t __errbuf_size)); + +extern void regfree _RE_ARGS ((regex_t *__preg)); + + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* regex.h */ + +/* +Local variables: +make-backup-files: t +version-control: t +trim-versions-without-asking: nil +End: +*/ diff --git a/gnu/dist/diffutils/lib/posixver.c b/gnu/dist/diffutils/lib/posixver.c new file mode 100644 index 00000000000..8449a44a547 --- /dev/null +++ b/gnu/dist/diffutils/lib/posixver.c @@ -0,0 +1,60 @@ +/* $NetBSD: posixver.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Which POSIX version to conform to, for utilities. + + 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 Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <limits.h> + +#include <stdlib.h> +#if !HAVE_DECL_GETENV && !defined getenv +char *getenv (); +#endif + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifndef _POSIX2_VERSION +# define _POSIX2_VERSION 0 +#endif + +/* The POSIX version that utilities should conform to. The default is + specified by the system. */ + +int +posix2_version (void) +{ + long int v = _POSIX2_VERSION; + char const *s = getenv ("_POSIX2_VERSION"); + + if (s && *s) + { + char *e; + long int i = strtol (s, &e, 10); + if (! *e) + v = i; + } + + return v < INT_MIN ? INT_MIN : v < INT_MAX ? v : INT_MAX; +} diff --git a/gnu/dist/diffutils/lib/posixver.h b/gnu/dist/diffutils/lib/posixver.h new file mode 100644 index 00000000000..9379a204faa --- /dev/null +++ b/gnu/dist/diffutils/lib/posixver.h @@ -0,0 +1,3 @@ +/* $NetBSD: posixver.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +int posix2_version (void); diff --git a/gnu/dist/diffutils/lib/prepargs.c b/gnu/dist/diffutils/lib/prepargs.c new file mode 100644 index 00000000000..817af35280e --- /dev/null +++ b/gnu/dist/diffutils/lib/prepargs.c @@ -0,0 +1,95 @@ +/* $NetBSD: prepargs.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Parse arguments from a string and prepend them to an argv. + + Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com>. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif +#include "prepargs.h" +#include <string.h> +#include <sys/types.h> +#include <xalloc.h> + +#include <ctype.h> + +/* IN_CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given + as an argument to <ctype.h> macros like "isspace". */ +#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 zero, 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/gnu/dist/diffutils/lib/prepargs.h b/gnu/dist/diffutils/lib/prepargs.h new file mode 100644 index 00000000000..6fa90ae439a --- /dev/null +++ b/gnu/dist/diffutils/lib/prepargs.h @@ -0,0 +1,5 @@ +/* $NetBSD: prepargs.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Parse arguments from a string and prepend them to an argv. */ + +void prepend_default_options (char const *, int *, char ***); diff --git a/gnu/dist/diffutils/lib/quotesys.c b/gnu/dist/diffutils/lib/quotesys.c new file mode 100644 index 00000000000..49d4c523944 --- /dev/null +++ b/gnu/dist/diffutils/lib/quotesys.c @@ -0,0 +1,127 @@ +/* $NetBSD: quotesys.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Shell command argument quoting. + Copyright (C) 1994, 1995, 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com> */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <quotesys.h> + +/* Place into QUOTED a quoted version of ARG suitable for `system'. + Return the length of the resulting string (which is not null-terminated). + If QUOTED is null, return the length without any side effects. */ + +size_t +quote_system_arg (quoted, arg) + char *quoted; + char const *arg; +{ + char const *a; + size_t len = 0; + + /* Scan ARG, copying it to QUOTED if QUOTED is not null, + looking for shell metacharacters. */ + + for (a = arg; ; a++) + { + char c = *a; + switch (c) + { + case 0: + /* ARG has no shell metacharacters. */ + return len; + + case '=': + if (*arg == '-') + break; + /* Fall through. */ + case '\t': case '\n': case ' ': + case '!': case '"': case '#': case '$': case '%': case '&': case '\'': + case '(': case ')': case '*': case ';': + case '<': case '>': case '?': case '[': case '\\': + case '^': case '`': case '|': case '~': + { + /* ARG has a shell metacharacter. + Start over, quoting it this time. */ + + len = 0; + c = *arg++; + + /* If ARG is an option, quote just its argument. + This is not necessary, but it looks nicer. */ + if (c == '-' && arg < a) + { + c = *arg++; + + if (quoted) + { + quoted[len] = '-'; + quoted[len + 1] = c; + } + len += 2; + + if (c == '-') + while (arg < a) + { + c = *arg++; + if (quoted) + quoted[len] = c; + len++; + if (c == '=') + break; + } + c = *arg++; + } + + if (quoted) + quoted[len] = '\''; + len++; + + for (; c; c = *arg++) + { + if (c == '\'') + { + if (quoted) + { + quoted[len] = '\''; + quoted[len + 1] = '\\'; + quoted[len + 2] = '\''; + } + len += 3; + } + if (quoted) + quoted[len] = c; + len++; + } + + if (quoted) + quoted[len] = '\''; + return len + 1; + } + } + + if (quoted) + quoted[len] = c; + len++; + } +} diff --git a/gnu/dist/diffutils/lib/quotesys.h b/gnu/dist/diffutils/lib/quotesys.h new file mode 100644 index 00000000000..207fb805251 --- /dev/null +++ b/gnu/dist/diffutils/lib/quotesys.h @@ -0,0 +1,11 @@ +/* $NetBSD: quotesys.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* quotesys.h -- declarations for quoting system arguments */ + +#if defined __STDC__ || __GNUC__ +# define __QUOTESYS_P(args) args +#else +# define __QUOTESYS_P(args) () +#endif + +size_t quote_system_arg __QUOTESYS_P ((char *, char const *)); diff --git a/gnu/dist/diffutils/lib/realloc.c b/gnu/dist/diffutils/lib/realloc.c new file mode 100644 index 00000000000..3ec2520b554 --- /dev/null +++ b/gnu/dist/diffutils/lib/realloc.c @@ -0,0 +1,46 @@ +/* $NetBSD: realloc.c,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Work around bug on some systems where realloc (NULL, 0) fails. + Copyright (C) 1997 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* written by Jim Meyering */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif +#undef realloc + +#include <sys/types.h> + +char *malloc (); +char *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. */ + +char * +rpl_realloc (p, n) + char *p; + size_t n; +{ + if (n == 0) + n = 1; + if (p == 0) + return malloc (n); + return realloc (p, n); +} diff --git a/gnu/dist/diffutils/lib/regex.c b/gnu/dist/diffutils/lib/regex.c new file mode 100644 index 00000000000..48a912ea46a --- /dev/null +++ b/gnu/dist/diffutils/lib/regex.c @@ -0,0 +1,8433 @@ +/* $NetBSD: regex.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Extended regular expression matching and search library, + version 0.12. + (Implements POSIX draft P1003.2/D11.2, except for some of the + internationalization features.) + Copyright (C) 1993-1999, 2000, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* AIX requires this to be the first thing in the file. */ +#if defined _AIX && !defined REGEX_MALLOC + #pragma alloca +#endif + +#undef _GNU_SOURCE +#define _GNU_SOURCE + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifndef PARAMS +# if defined __GNUC__ || (defined __STDC__ && __STDC__) +# define PARAMS(args) args +# else +# define PARAMS(args) () +# endif /* GCC. */ +#endif /* Not PARAMS. */ + +#ifndef INSIDE_RECURSION + +# if defined STDC_HEADERS && !defined emacs +# include <stddef.h> +# else +/* We need this for `regex.h', and perhaps for the Emacs include files. */ +# include <sys/types.h> +# endif + +# define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC) + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +# if defined _LIBC || WIDE_CHAR_SUPPORT +/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ +# include <wchar.h> +# include <wctype.h> +# 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) + +# define btowc __btowc +# define iswctype __iswctype +# define mbrtowc __mbrtowc +# define wcslen __wcslen +# define wcscoll __wcscoll +# define wcrtomb __wcrtomb + +/* We are also using some library internals. */ +# include <locale/localeinfo.h> +# include <locale/elem-hash.h> +# include <langinfo.h> +# include <locale/coll-lookup.h> +# endif + +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include <libintl.h> +# ifdef _LIBC +# undef gettext +# define gettext(msgid) __dcgettext ("libc", 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 + +/* Support for bounded pointers. */ +# if !defined _LIBC && !defined __BOUNDED_POINTERS__ +# define __bounded /* nothing */ +# define __unbounded /* nothing */ +# define __ptrvalue /* nothing */ +# endif + +/* The `emacs' switch turns on certain matching commands + that make sense only in Emacs. */ +# ifdef emacs + +# include "lisp.h" +# include "buffer.h" +# include "syntax.h" + +# else /* not emacs */ + +/* If we are not linking with Emacs proper, + we can't use the relocating allocator + even if config.h says that we can. */ +# undef REL_ALLOC + +# if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +# else +char *malloc (); +char *realloc (); +# endif + +/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. + If nothing else has been done, use the method below. */ +# ifdef INHIBIT_STRING_HEADER +# if !(defined HAVE_BZERO && defined HAVE_BCOPY) +# if !defined bzero && !defined bcopy +# undef INHIBIT_STRING_HEADER +# endif +# endif +# endif + +/* This is the normal way of making sure we have a bcopy and a bzero. + This is used in most programs--a few other programs avoid this + by defining INHIBIT_STRING_HEADER. */ +# ifndef INHIBIT_STRING_HEADER +# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC +# include <string.h> +# ifndef bzero +# ifndef _LIBC +# define bzero(s, n) (memset (s, '\0', n), (s)) +# else +# define bzero(s, n) __bzero (s, n) +# endif +# endif +# else +# include <strings.h> +# ifndef memcmp +# define memcmp(s1, s2, n) bcmp (s1, s2, n) +# endif +# ifndef memcpy +# define memcpy(d, s, n) (bcopy (s, d, n), (d)) +# endif +# endif +# endif + +/* Define the syntax stuff for \<, \>, etc. */ + +/* This must be nonzero for the wordchar and notwordchar pattern + commands in re_match_2. */ +# ifndef Sword +# define Sword 1 +# endif + +# ifdef SWITCH_ENUM_BUG +# define SWITCH_ENUM_CAST(x) ((int)(x)) +# else +# define SWITCH_ENUM_CAST(x) (x) +# endif + +# endif /* not emacs */ + +# if defined _LIBC || HAVE_LIMITS_H +# include <limits.h> +# endif + +# ifndef MB_LEN_MAX +# define MB_LEN_MAX 1 +# endif + +/* Get the interface, including the syntax bits. */ +# include <regex.h> + +/* isalpha etc. are used for the character classes. */ +# include <ctype.h> + +/* Jim Meyering writes: + + "... Some ctype macros are valid only for character codes that + isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + using /bin/cc or gcc but without giving an ansi option). So, all + ctype uses should be through macros like ISPRINT... If + STDC_HEADERS is defined, then autoconf has verified that the ctype + macros don't need to be guarded with references to isascii. ... + Defining isascii to 1 should let any compiler worth its salt + eliminate the && through constant folding." + Solaris defines some of these symbols so we must undefine them first. */ + +# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define IN_CTYPE_DOMAIN(c) 1 +# else +# define IN_CTYPE_DOMAIN(c) isascii(c) +# endif + +# ifdef isblank +# define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c)) +# else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +# endif +# ifdef isgraph +# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c)) +# else +# define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c)) +# endif + +# undef ISPRINT +# define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) +# define ISDIGIT(c) (IN_CTYPE_DOMAIN (c) && isdigit (c)) +# define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c)) +# define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c)) +# define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c)) +# define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c)) +# define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c)) +# define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) +# define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c)) +# define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c)) + +# ifdef _tolower +# define TOLOWER(c) _tolower(c) +# else +# define TOLOWER(c) tolower(c) +# endif + +# ifndef NULL +# define NULL (void *)0 +# endif + +/* We remove any previous definition of `SIGN_EXTEND_CHAR', + since ours (we hope) works properly with all combinations of + machines, compilers, `char' and `unsigned char' argument types. + (Per Bothner suggested the basic approach.) */ +# undef SIGN_EXTEND_CHAR +# if __STDC__ +# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) +# else /* not __STDC__ */ +/* As in Harbison and Steele. */ +# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) +# endif + +# ifndef emacs +/* How many characters in the character set. */ +# define CHAR_SET_SIZE 256 + +# ifdef SYNTAX_TABLE + +extern char *re_syntax_table; + +# else /* not SYNTAX_TABLE */ + +static char re_syntax_table[CHAR_SET_SIZE]; + +static void init_syntax_once PARAMS ((void)); + +static void +init_syntax_once () +{ + register int c; + static int done = 0; + + if (done) + return; + bzero (re_syntax_table, sizeof re_syntax_table); + + for (c = 0; c < CHAR_SET_SIZE; ++c) + if (ISALNUM (c)) + re_syntax_table[c] = Sword; + + re_syntax_table['_'] = Sword; + + done = 1; +} + +# endif /* not SYNTAX_TABLE */ + +# define SYNTAX(c) re_syntax_table[(unsigned char) (c)] + +# endif /* emacs */ + +/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we + use `alloca' instead of `malloc'. This is because using malloc in + re_search* or re_match* could cause memory leaks when C-g is used in + Emacs; also, malloc is slower and causes storage fragmentation. On + the other hand, malloc is more portable, and easier to debug. + + Because we sometimes use alloca, some routines have to be macros, + not functions -- `alloca'-allocated space disappears at the end of the + function it is called in. */ + +# ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE malloc +# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE free + +# else /* not REGEX_MALLOC */ + +/* Emacs already defines alloca, sometimes. */ +# ifndef alloca + +/* Make alloca work the best possible way. */ +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else /* not __GNUC__ */ +# if HAVE_ALLOCA_H +# include <alloca.h> +# endif /* HAVE_ALLOCA_H */ +# endif /* not __GNUC__ */ + +# endif /* not alloca */ + +# define REGEX_ALLOCATE alloca + +/* Assumes a `char *destination' variable. */ +# define REGEX_REALLOCATE(source, osize, nsize) \ + (destination = (char *) alloca (nsize), \ + memcpy (destination, source, osize)) + +/* No need to do anything to free, after alloca. */ +# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ + +# endif /* not REGEX_MALLOC */ + +/* Define how to allocate the failure stack. */ + +# if defined REL_ALLOC && defined REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK(size) \ + r_alloc (&failure_stack_ptr, (size)) +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + r_re_alloc (&failure_stack_ptr, (nsize)) +# define REGEX_FREE_STACK(ptr) \ + r_alloc_free (&failure_stack_ptr) + +# else /* not using relocating allocator */ + +# ifdef REGEX_MALLOC + +# define REGEX_ALLOCATE_STACK malloc +# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) +# define REGEX_FREE_STACK free + +# else /* not REGEX_MALLOC */ + +# define REGEX_ALLOCATE_STACK alloca + +# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ + REGEX_REALLOCATE (source, osize, nsize) +/* No need to explicitly free anything. */ +# define REGEX_FREE_STACK(arg) + +# endif /* not REGEX_MALLOC */ +# endif /* not using relocating allocator */ + + +/* True if `size1' is non-NULL and PTR is pointing anywhere inside + `string1' or just past its end. This works if PTR is NULL, which is + a good thing. */ +# define FIRST_STRING_P(ptr) \ + (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) + +/* (Re)Allocate N items of type T using malloc, or fail. */ +# define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) +# define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) +# define RETALLOC_IF(addr, n, t) \ + if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) +# define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) + +# define BYTEWIDTH 8 /* In bits. */ + +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +# undef MAX +# undef MIN +# define MAX(a, b) ((a) > (b) ? (a) : (b)) +# define MIN(a, b) ((a) < (b) ? (a) : (b)) + +typedef char boolean; +# define false 0 +# define true 1 + +static reg_errcode_t byte_regex_compile _RE_ARGS ((const char *pattern, size_t size, + reg_syntax_t syntax, + struct re_pattern_buffer *bufp)); + +static int byte_re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int pos, + struct re_registers *regs, + int stop)); +static int byte_re_search_2 PARAMS ((struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int startpos, int range, + struct re_registers *regs, int stop)); +static int byte_re_compile_fastmap PARAMS ((struct re_pattern_buffer *bufp)); + +#ifdef MBS_SUPPORT +static reg_errcode_t wcs_regex_compile _RE_ARGS ((const char *pattern, size_t size, + reg_syntax_t syntax, + struct re_pattern_buffer *bufp)); + + +static int wcs_re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp, + const char *cstring1, int csize1, + const char *cstring2, int csize2, + int pos, + struct re_registers *regs, + int stop, + wchar_t *string1, int size1, + wchar_t *string2, int size2, + int *mbs_offset1, int *mbs_offset2)); +static int wcs_re_search_2 PARAMS ((struct re_pattern_buffer *bufp, + const char *string1, int size1, + const char *string2, int size2, + int startpos, int range, + struct re_registers *regs, int stop)); +static int wcs_re_compile_fastmap PARAMS ((struct re_pattern_buffer *bufp)); +#endif + +/* These are the command codes that appear in compiled regular + expressions. Some opcodes are followed by argument bytes. A + command code can specify any interpretation whatsoever for its + arguments. Zero bytes may appear in the compiled regular expression. */ + +typedef enum +{ + no_op = 0, + + /* Succeed right away--no more backtracking. */ + succeed, + + /* Followed by one byte giving n, then by n literal bytes. */ + exactn, + +# ifdef MBS_SUPPORT + /* Same as exactn, but contains binary data. */ + exactn_bin, +# endif + + /* Matches any (more or less) character. */ + anychar, + + /* Matches any one char belonging to specified set. First + following byte is number of bitmap bytes. Then come bytes + for a bitmap saying which chars are in. Bits in each byte + are ordered low-bit-first. A character is in the set if its + bit is 1. A character too large to have a bit in the map is + automatically not in the set. */ + /* ifdef MBS_SUPPORT, following element is length of character + classes, length of collating symbols, length of equivalence + classes, length of character ranges, and length of characters. + Next, character class element, collating symbols elements, + equivalence class elements, range elements, and character + elements follow. + See regex_compile function. */ + charset, + + /* Same parameters as charset, but match any character that is + not one of those specified. */ + charset_not, + + /* Start remembering the text that is matched, for storing in a + register. Followed by one byte with the register number, in + the range 0 to one less than the pattern buffer's re_nsub + field. Then followed by one byte with the number of groups + inner to this one. (This last has to be part of the + start_memory only because we need it in the on_failure_jump + of re_match_2.) */ + start_memory, + + /* Stop remembering the text that is matched and store it in a + memory register. Followed by one byte with the register + number, in the range 0 to one less than `re_nsub' in the + pattern buffer, and one byte with the number of inner groups, + just like `start_memory'. (We need the number of inner + groups here because we don't have any easy way of finding the + corresponding start_memory when we're at a stop_memory.) */ + stop_memory, + + /* Match a duplicate of something remembered. Followed by one + byte containing the register number. */ + duplicate, + + /* Fail unless at beginning of line. */ + begline, + + /* Fail unless at end of line. */ + endline, + + /* Succeeds if at beginning of buffer (if emacs) or at beginning + of string to be matched (if not). */ + begbuf, + + /* Analogously, for end of buffer/string. */ + endbuf, + + /* Followed by two byte relative address to which to jump. */ + jump, + + /* Same as jump, but marks the end of an alternative. */ + jump_past_alt, + + /* Followed by two-byte relative address of place to resume at + in case of failure. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + on_failure_jump, + + /* Like on_failure_jump, but pushes a placeholder instead of the + current string position when executed. */ + on_failure_keep_string_jump, + + /* Throw away latest failure point and then jump to following + two-byte relative address. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + pop_failure_jump, + + /* Change to pop_failure_jump if know won't have to backtrack to + match; otherwise change to jump. This is used to jump + back to the beginning of a repeat. If what follows this jump + clearly won't match what the repeat does, such that we can be + sure that there is no use backtracking out of repetitions + already matched, then we change it to a pop_failure_jump. + Followed by two-byte address. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + maybe_pop_jump, + + /* Jump to following two-byte address, and push a dummy failure + point. This failure point will be thrown away if an attempt + is made to use it for a failure. A `+' construct makes this + before the first repeat. Also used as an intermediary kind + of jump when compiling an alternative. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + dummy_failure_jump, + + /* Push a dummy failure point and continue. Used at the end of + alternatives. */ + push_dummy_failure, + + /* Followed by two-byte relative address and two-byte number n. + After matching N times, jump to the address upon failure. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + succeed_n, + + /* Followed by two-byte relative address, and two-byte number n. + Jump to the address N times, then fail. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + jump_n, + + /* Set the following two-byte relative address to the + subsequent two-byte number. The address *includes* the two + bytes of number. */ + /* ifdef MBS_SUPPORT, the size of address is 1. */ + set_number_at, + + wordchar, /* Matches any word-constituent character. */ + notwordchar, /* Matches any char that is not a word-constituent. */ + + wordbeg, /* Succeeds if at word beginning. */ + wordend, /* Succeeds if at word end. */ + + wordbound, /* Succeeds if at a word boundary. */ + notwordbound /* Succeeds if not at a word boundary. */ + +# ifdef emacs + ,before_dot, /* Succeeds if before point. */ + at_dot, /* Succeeds if at point. */ + after_dot, /* Succeeds if after point. */ + + /* Matches any character whose syntax is specified. Followed by + a byte which contains a syntax code, e.g., Sword. */ + syntaxspec, + + /* Matches any character whose syntax is not that specified. */ + notsyntaxspec +# endif /* emacs */ +} re_opcode_t; +#endif /* not INSIDE_RECURSION */ + + +#ifdef BYTE +# define CHAR_T char +# define UCHAR_T unsigned char +# define COMPILED_BUFFER_VAR bufp->buffer +# define OFFSET_ADDRESS_SIZE 2 +# define PREFIX(name) byte_##name +# define ARG_PREFIX(name) name +# define PUT_CHAR(c) putchar (c) +#else +# ifdef WCHAR +# define CHAR_T wchar_t +# define UCHAR_T wchar_t +# define COMPILED_BUFFER_VAR wc_buffer +# define OFFSET_ADDRESS_SIZE 1 /* the size which STORE_NUMBER macro use */ +# define CHAR_CLASS_SIZE ((__alignof__(wctype_t)+sizeof(wctype_t))/sizeof(CHAR_T)+1) +# define PREFIX(name) wcs_##name +# define ARG_PREFIX(name) c##name +/* Should we use wide stream?? */ +# define PUT_CHAR(c) printf ("%C", c); +# define TRUE 1 +# define FALSE 0 +# else +# ifdef MBS_SUPPORT +# define WCHAR +# define INSIDE_RECURSION +# include "regex.c" +# undef INSIDE_RECURSION +# endif +# define BYTE +# define INSIDE_RECURSION +# include "regex.c" +# undef INSIDE_RECURSION +# endif +#endif +#include "unlocked-io.h" + +#ifdef INSIDE_RECURSION +/* Common operations on the compiled pattern. */ + +/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# ifdef WCHAR +# define STORE_NUMBER(destination, number) \ + do { \ + *(destination) = (UCHAR_T)(number); \ + } while (0) +# else /* BYTE */ +# define STORE_NUMBER(destination, number) \ + do { \ + (destination)[0] = (number) & 0377; \ + (destination)[1] = (number) >> 8; \ + } while (0) +# endif /* WCHAR */ + +/* Same as STORE_NUMBER, except increment DESTINATION to + the byte after where the number is stored. Therefore, DESTINATION + must be an lvalue. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# define STORE_NUMBER_AND_INCR(destination, number) \ + do { \ + STORE_NUMBER (destination, number); \ + (destination) += OFFSET_ADDRESS_SIZE; \ + } while (0) + +/* Put into DESTINATION a number stored in two contiguous bytes starting + at SOURCE. */ +/* ifdef MBS_SUPPORT, we store NUMBER in 1 element. */ + +# ifdef WCHAR +# define EXTRACT_NUMBER(destination, source) \ + do { \ + (destination) = *(source); \ + } while (0) +# else /* BYTE */ +# define EXTRACT_NUMBER(destination, source) \ + do { \ + (destination) = *(source) & 0377; \ + (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ + } while (0) +# endif + +# ifdef DEBUG +static void PREFIX(extract_number) _RE_ARGS ((int *dest, UCHAR_T *source)); +static void +PREFIX(extract_number) (dest, source) + int *dest; + UCHAR_T *source; +{ +# ifdef WCHAR + *dest = *source; +# else /* BYTE */ + int temp = SIGN_EXTEND_CHAR (*(source + 1)); + *dest = *source & 0377; + *dest += temp << 8; +# endif +} + +# ifndef EXTRACT_MACROS /* To debug the macros. */ +# undef EXTRACT_NUMBER +# define EXTRACT_NUMBER(dest, src) PREFIX(extract_number) (&dest, src) +# endif /* not EXTRACT_MACROS */ + +# endif /* DEBUG */ + +/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. + SOURCE must be an lvalue. */ + +# define EXTRACT_NUMBER_AND_INCR(destination, source) \ + do { \ + EXTRACT_NUMBER (destination, source); \ + (source) += OFFSET_ADDRESS_SIZE; \ + } while (0) + +# ifdef DEBUG +static void PREFIX(extract_number_and_incr) _RE_ARGS ((int *destination, + UCHAR_T **source)); +static void +PREFIX(extract_number_and_incr) (destination, source) + int *destination; + UCHAR_T **source; +{ + PREFIX(extract_number) (destination, *source); + *source += OFFSET_ADDRESS_SIZE; +} + +# ifndef EXTRACT_MACROS +# undef EXTRACT_NUMBER_AND_INCR +# define EXTRACT_NUMBER_AND_INCR(dest, src) \ + PREFIX(extract_number_and_incr) (&dest, &src) +# endif /* not EXTRACT_MACROS */ + +# endif /* DEBUG */ + + + +/* If DEBUG is defined, Regex prints many voluminous messages about what + it is doing (if the variable `debug' is nonzero). If linked with the + main program in `iregex.c', you can enter patterns and strings + interactively. And if linked with the main program in `main.c' and + the other test files, you can run the already-written tests. */ + +# ifdef DEBUG + +# ifndef DEFINED_ONCE + +/* We use standard I/O for debugging. */ +# include <stdio.h> + +/* It is useful to test things that ``must'' be true when debugging. */ +# include <assert.h> + +static int debug; + +# define DEBUG_STATEMENT(e) e +# define DEBUG_PRINT1(x) if (debug) printf (x) +# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) +# endif /* not DEFINED_ONCE */ + +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ + if (debug) PREFIX(print_partial_compiled_pattern) (s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ + if (debug) PREFIX(print_double_string) (w, s1, sz1, s2, sz2) + + +/* Print the fastmap in human-readable form. */ + +# ifndef DEFINED_ONCE +void +print_fastmap (fastmap) + char *fastmap; +{ + unsigned was_a_range = 0; + unsigned i = 0; + + while (i < (1 << BYTEWIDTH)) + { + if (fastmap[i++]) + { + was_a_range = 0; + putchar (i - 1); + while (i < (1 << BYTEWIDTH) && fastmap[i]) + { + was_a_range = 1; + i++; + } + if (was_a_range) + { + printf ("-"); + putchar (i - 1); + } + } + } + putchar ('\n'); +} +# endif /* not DEFINED_ONCE */ + + +/* Print a compiled pattern string in human-readable form, starting at + the START pointer into it and ending just before the pointer END. */ + +void +PREFIX(print_partial_compiled_pattern) (start, end) + UCHAR_T *start; + UCHAR_T *end; +{ + int mcnt, mcnt2; + UCHAR_T *p1; + UCHAR_T *p = start; + UCHAR_T *pend = end; + + if (start == NULL) + { + printf ("(null)\n"); + return; + } + + /* Loop over pattern commands. */ + while (p < pend) + { +# ifdef _LIBC + printf ("%td:\t", p - start); +# else + printf ("%ld:\t", (long int) (p - start)); +# endif + + switch ((re_opcode_t) *p++) + { + case no_op: + printf ("/no_op"); + break; + + case exactn: + mcnt = *p++; + printf ("/exactn/%d", mcnt); + do + { + putchar ('/'); + PUT_CHAR (*p++); + } + while (--mcnt); + break; + +# ifdef MBS_SUPPORT + case exactn_bin: + mcnt = *p++; + printf ("/exactn_bin/%d", mcnt); + do + { + printf("/%lx", (long int) *p++); + } + while (--mcnt); + break; +# endif /* MBS_SUPPORT */ + + case start_memory: + mcnt = *p++; + printf ("/start_memory/%d/%ld", mcnt, (long int) *p++); + break; + + case stop_memory: + mcnt = *p++; + printf ("/stop_memory/%d/%ld", mcnt, (long int) *p++); + break; + + case duplicate: + printf ("/duplicate/%ld", (long int) *p++); + break; + + case anychar: + printf ("/anychar"); + break; + + case charset: + case charset_not: + { +# ifdef WCHAR + int i, length; + wchar_t *workp = p; + printf ("/charset [%s", + (re_opcode_t) *(workp - 1) == charset_not ? "^" : ""); + p += 5; + length = *workp++; /* the length of char_classes */ + for (i=0 ; i<length ; i++) + printf("[:%lx:]", (long int) *p++); + length = *workp++; /* the length of collating_symbol */ + for (i=0 ; i<length ;) + { + printf("[."); + while(*p != 0) + PUT_CHAR((i++,*p++)); + i++,p++; + printf(".]"); + } + length = *workp++; /* the length of equivalence_class */ + for (i=0 ; i<length ;) + { + printf("[="); + while(*p != 0) + PUT_CHAR((i++,*p++)); + i++,p++; + printf("=]"); + } + length = *workp++; /* the length of char_range */ + for (i=0 ; i<length ; i++) + { + wchar_t range_start = *p++; + wchar_t range_end = *p++; + printf("%C-%C", range_start, range_end); + } + length = *workp++; /* the length of char */ + for (i=0 ; i<length ; i++) + printf("%C", *p++); + putchar (']'); +# else + register int c, last = -100; + register int in_range = 0; + + printf ("/charset [%s", + (re_opcode_t) *(p - 1) == charset_not ? "^" : ""); + + assert (p + *p < pend); + + for (c = 0; c < 256; c++) + if (c / 8 < *p + && (p[1 + (c/8)] & (1 << (c % 8)))) + { + /* Are we starting a range? */ + if (last + 1 == c && ! in_range) + { + putchar ('-'); + in_range = 1; + } + /* Have we broken a range? */ + else if (last + 1 != c && in_range) + { + putchar (last); + in_range = 0; + } + + if (! in_range) + putchar (c); + + last = c; + } + + if (in_range) + putchar (last); + + putchar (']'); + + p += 1 + *p; +# endif /* WCHAR */ + } + break; + + case begline: + printf ("/begline"); + break; + + case endline: + printf ("/endline"); + break; + + case on_failure_jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/on_failure_jump to %td", p + mcnt - start); +# else + printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case on_failure_keep_string_jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/on_failure_keep_string_jump to %td", p + mcnt - start); +# else + printf ("/on_failure_keep_string_jump to %ld", + (long int) (p + mcnt - start)); +# endif + break; + + case dummy_failure_jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/dummy_failure_jump to %td", p + mcnt - start); +# else + printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case push_dummy_failure: + printf ("/push_dummy_failure"); + break; + + case maybe_pop_jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/maybe_pop_jump to %td", p + mcnt - start); +# else + printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case pop_failure_jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/pop_failure_jump to %td", p + mcnt - start); +# else + printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case jump_past_alt: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/jump_past_alt to %td", p + mcnt - start); +# else + printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case jump: + PREFIX(extract_number_and_incr) (&mcnt, &p); +# ifdef _LIBC + printf ("/jump to %td", p + mcnt - start); +# else + printf ("/jump to %ld", (long int) (p + mcnt - start)); +# endif + break; + + case succeed_n: + PREFIX(extract_number_and_incr) (&mcnt, &p); + p1 = p + mcnt; + PREFIX(extract_number_and_incr) (&mcnt2, &p); +# ifdef _LIBC + printf ("/succeed_n to %td, %d times", p1 - start, mcnt2); +# else + printf ("/succeed_n to %ld, %d times", + (long int) (p1 - start), mcnt2); +# endif + break; + + case jump_n: + PREFIX(extract_number_and_incr) (&mcnt, &p); + p1 = p + mcnt; + PREFIX(extract_number_and_incr) (&mcnt2, &p); + printf ("/jump_n to %d, %d times", p1 - start, mcnt2); + break; + + case set_number_at: + PREFIX(extract_number_and_incr) (&mcnt, &p); + p1 = p + mcnt; + PREFIX(extract_number_and_incr) (&mcnt2, &p); +# ifdef _LIBC + printf ("/set_number_at location %td to %d", p1 - start, mcnt2); +# else + printf ("/set_number_at location %ld to %d", + (long int) (p1 - start), mcnt2); +# endif + break; + + case wordbound: + printf ("/wordbound"); + break; + + case notwordbound: + printf ("/notwordbound"); + break; + + case wordbeg: + printf ("/wordbeg"); + break; + + case wordend: + printf ("/wordend"); + break; + +# ifdef emacs + case before_dot: + printf ("/before_dot"); + break; + + case at_dot: + printf ("/at_dot"); + break; + + case after_dot: + printf ("/after_dot"); + break; + + case syntaxspec: + printf ("/syntaxspec"); + mcnt = *p++; + printf ("/%d", mcnt); + break; + + case notsyntaxspec: + printf ("/notsyntaxspec"); + mcnt = *p++; + printf ("/%d", mcnt); + break; +# endif /* emacs */ + + case wordchar: + printf ("/wordchar"); + break; + + case notwordchar: + printf ("/notwordchar"); + break; + + case begbuf: + printf ("/begbuf"); + break; + + case endbuf: + printf ("/endbuf"); + break; + + default: + printf ("?%ld", (long int) *(p-1)); + } + + putchar ('\n'); + } + +# ifdef _LIBC + printf ("%td:\tend of pattern.\n", p - start); +# else + printf ("%ld:\tend of pattern.\n", (long int) (p - start)); +# endif +} + + +void +PREFIX(print_compiled_pattern) (bufp) + struct re_pattern_buffer *bufp; +{ + UCHAR_T *buffer = (UCHAR_T*) bufp->buffer; + + PREFIX(print_partial_compiled_pattern) (buffer, buffer + + bufp->used / sizeof(UCHAR_T)); + printf ("%ld bytes used/%ld bytes allocated.\n", + bufp->used, bufp->allocated); + + if (bufp->fastmap_accurate && bufp->fastmap) + { + printf ("fastmap: "); + print_fastmap (bufp->fastmap); + } + +# ifdef _LIBC + printf ("re_nsub: %Zd\t", bufp->re_nsub); +# else + printf ("re_nsub: %ld\t", (long int) bufp->re_nsub); +# endif + printf ("regs_alloc: %d\t", bufp->regs_allocated); + printf ("can_be_null: %d\t", bufp->can_be_null); + printf ("newline_anchor: %d\n", bufp->newline_anchor); + printf ("no_sub: %d\t", bufp->no_sub); + printf ("not_bol: %d\t", bufp->not_bol); + printf ("not_eol: %d\t", bufp->not_eol); + printf ("syntax: %lx\n", bufp->syntax); + /* Perhaps we should print the translate table? */ +} + + +void +PREFIX(print_double_string) (where, string1, size1, string2, size2) + const CHAR_T *where; + const CHAR_T *string1; + const CHAR_T *string2; + int size1; + int size2; +{ + int this_char; + + if (where == NULL) + printf ("(null)"); + else + { + int cnt; + + if (FIRST_STRING_P (where)) + { + for (this_char = where - string1; this_char < size1; this_char++) + PUT_CHAR (string1[this_char]); + + where = string2; + } + + cnt = 0; + for (this_char = where - string2; this_char < size2; this_char++) + { + PUT_CHAR (string2[this_char]); + if (++cnt > 100) + { + fputs ("...", stdout); + break; + } + } + } +} + +# ifndef DEFINED_ONCE +void +printchar (c) + int c; +{ + putc (c, stderr); +} +# endif + +# else /* not DEBUG */ + +# ifndef DEFINED_ONCE +# undef assert +# define assert(e) + +# define DEBUG_STATEMENT(e) +# define DEBUG_PRINT1(x) +# define DEBUG_PRINT2(x1, x2) +# define DEBUG_PRINT3(x1, x2, x3) +# define DEBUG_PRINT4(x1, x2, x3, x4) +# endif /* not DEFINED_ONCE */ +# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) +# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) + +# endif /* not DEBUG */ + + + +# ifdef WCHAR +/* This convert a multibyte string to a wide character string. + And write their correspondances to offset_buffer(see below) + and write whether each wchar_t is binary data to is_binary. + This assume invalid multibyte sequences as binary data. + We assume offset_buffer and is_binary is already allocated + enough space. */ + +static size_t convert_mbs_to_wcs (CHAR_T *dest, const unsigned char* src, + size_t len, int *offset_buffer, + char *is_binary); +static size_t +convert_mbs_to_wcs (dest, src, len, offset_buffer, is_binary) + CHAR_T *dest; + const unsigned char* src; + size_t len; /* the length of multibyte string. */ + + /* It hold correspondances between src(char string) and + dest(wchar_t string) for optimization. + e.g. src = "xxxyzz" + dest = {'X', 'Y', 'Z'} + (each "xxx", "y" and "zz" represent one multibyte character + corresponding to 'X', 'Y' and 'Z'.) + offset_buffer = {0, 0+3("xxx"), 0+3+1("y"), 0+3+1+2("zz")} + = {0, 3, 4, 6} + */ + int *offset_buffer; + char *is_binary; +{ + wchar_t *pdest = dest; + const unsigned char *psrc = src; + size_t wc_count = 0; + + mbstate_t mbs; + int i, consumed; + size_t mb_remain = len; + size_t mb_count = 0; + + /* Initialize the conversion state. */ + memset (&mbs, 0, sizeof (mbstate_t)); + + offset_buffer[0] = 0; + for( ; mb_remain > 0 ; ++wc_count, ++pdest, mb_remain -= consumed, + psrc += consumed) + { + consumed = mbrtowc (pdest, psrc, mb_remain, &mbs); + + if (consumed <= 0) + /* failed to convert. maybe src contains binary data. + So we consume 1 byte manualy. */ + { + *pdest = *psrc; + consumed = 1; + is_binary[wc_count] = TRUE; + } + else + is_binary[wc_count] = FALSE; + /* In sjis encoding, we use yen sign as escape character in + place of reverse solidus. So we convert 0x5c(yen sign in + sjis) to not 0xa5(yen sign in UCS2) but 0x5c(reverse + solidus in UCS2). */ + if (consumed == 1 && (int) *psrc == 0x5c && (int) *pdest == 0xa5) + *pdest = (wchar_t) *psrc; + + offset_buffer[wc_count + 1] = mb_count += consumed; + } + + /* Fill remain of the buffer with sentinel. */ + for (i = wc_count + 1 ; i <= len ; i++) + offset_buffer[i] = mb_count + 1; + + return wc_count; +} + +# endif /* WCHAR */ + +#else /* not INSIDE_RECURSION */ + +/* 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; +# ifdef DEBUG + if (syntax & RE_DEBUG) + debug = 1; + else if (debug) /* was on but now is not */ + debug = 0; +# endif /* DEBUG */ + return ret; +} +# ifdef _LIBC +weak_alias (__re_set_syntax, re_set_syntax) +# endif + +/* 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 + }; + +#endif /* INSIDE_RECURSION */ + +#ifndef DEFINED_ONCE +/* Avoiding alloca during matching, to placate r_alloc. */ + +/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the + searching and matching functions should not call alloca. On some + systems, alloca is implemented in terms of malloc, and if we're + using the relocating allocator routines, then malloc could cause a + relocation, which might (if the strings being searched are in the + ralloc heap) shift the data out from underneath the regexp + routines. + + Here's another reason to avoid allocation: Emacs + processes input from X in a signal handler; processing X input may + call malloc; if input arrives while a matching routine is calling + malloc, then we're scrod. But Emacs can't just block input while + calling matching routines; then we don't notice interrupts when + they come in. So, Emacs blocks input around all regexp calls + except the matching calls, which it leaves unprotected, in the + faith that they will not malloc. */ + +/* Normally, this is fine. */ +# define MATCH_MAY_ALLOCATE + +/* When using GNU C, we are not REALLY using the C alloca, no matter + what config.h may say. So don't take precautions for it. */ +# ifdef __GNUC__ +# undef C_ALLOCA +# endif + +/* The match routines may not allocate if (1) they would do it with malloc + and (2) it's not safe for them to use malloc. + Note that if REL_ALLOC is defined, matching would not use malloc for the + failure stack, but we would still use it for the register vectors; + so REL_ALLOC should not affect this. */ +# if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs +# undef MATCH_MAY_ALLOCATE +# endif +#endif /* not DEFINED_ONCE */ + +#ifdef INSIDE_RECURSION +/* Failure stack declarations and macros; both re_compile_fastmap and + re_match_2 use a failure stack. These have to be macros because of + REGEX_ALLOCATE_STACK. */ + + +/* Number of failure points for which to initially allocate space + when matching. If this number is exceeded, we allocate more + space, so it is not a hard limit. */ +# ifndef INIT_FAILURE_ALLOC +# define INIT_FAILURE_ALLOC 5 +# endif + +/* Roughly the maximum number of failure points on the stack. Would be + exactly that if always used MAX_FAILURE_ITEMS items each time we failed. + This is a variable only so users of regex can assign to it; we never + change it ourselves. */ + +# ifdef INT_IS_16BIT + +# ifndef DEFINED_ONCE +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +long int re_max_failures = 4000; +# else +long int re_max_failures = 2000; +# endif +# endif + +union PREFIX(fail_stack_elt) +{ + UCHAR_T *pointer; + long int integer; +}; + +typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); + +typedef struct +{ + PREFIX(fail_stack_elt_t) *stack; + unsigned long int size; + unsigned long int avail; /* Offset of next open position. */ +} PREFIX(fail_stack_type); + +# else /* not INT_IS_16BIT */ + +# ifndef DEFINED_ONCE +# if defined MATCH_MAY_ALLOCATE +/* 4400 was enough to cause a crash on Alpha OSF/1, + whose default stack limit is 2mb. */ +int re_max_failures = 4000; +# else +int re_max_failures = 2000; +# endif +# endif + +union PREFIX(fail_stack_elt) +{ + UCHAR_T *pointer; + int integer; +}; + +typedef union PREFIX(fail_stack_elt) PREFIX(fail_stack_elt_t); + +typedef struct +{ + PREFIX(fail_stack_elt_t) *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} PREFIX(fail_stack_type); + +# endif /* INT_IS_16BIT */ + +# ifndef DEFINED_ONCE +# define FAIL_STACK_EMPTY() (fail_stack.avail == 0) +# define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) +# define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) +# endif + + +/* Define macros to initialize and free the failure stack. + Do `return -2' if the alloc fails. */ + +# ifdef MATCH_MAY_ALLOCATE +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.stack = (PREFIX(fail_stack_elt_t) *) \ + REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (PREFIX(fail_stack_elt_t))); \ + \ + if (fail_stack.stack == NULL) \ + return -2; \ + \ + fail_stack.size = INIT_FAILURE_ALLOC; \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) +# else +# define INIT_FAIL_STACK() \ + do { \ + fail_stack.avail = 0; \ + } while (0) + +# define RESET_FAIL_STACK() +# endif + + +/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. + + Return 1 if succeeds, and 0 if either ran out of memory + allocating space for it or it was already too large. + + REGEX_REALLOCATE_STACK requires `destination' be declared. */ + +# define DOUBLE_FAIL_STACK(fail_stack) \ + ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ + ? 0 \ + : ((fail_stack).stack = (PREFIX(fail_stack_elt_t) *) \ + REGEX_REALLOCATE_STACK ((fail_stack).stack, \ + (fail_stack).size * sizeof (PREFIX(fail_stack_elt_t)), \ + ((fail_stack).size << 1) * sizeof (PREFIX(fail_stack_elt_t))),\ + \ + (fail_stack).stack == NULL \ + ? 0 \ + : ((fail_stack).size <<= 1, \ + 1))) + + +/* Push pointer POINTER on FAIL_STACK. + Return 1 if was able to do so and 0 if ran out of memory allocating + space to do so. */ +# define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ + ((FAIL_STACK_FULL () \ + && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ + ? 0 \ + : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ + 1)) + +/* Push a pointer value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_POINTER(item) \ + fail_stack.stack[fail_stack.avail++].pointer = (UCHAR_T *) (item) + +/* This pushes an integer-valued item onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_INT(item) \ + fail_stack.stack[fail_stack.avail++].integer = (item) + +/* Push a fail_stack_elt_t value onto the failure stack. + Assumes the variable `fail_stack'. Probably should only + be called from within `PUSH_FAILURE_POINT'. */ +# define PUSH_FAILURE_ELT(item) \ + fail_stack.stack[fail_stack.avail++] = (item) + +/* These three POP... operations complement the three PUSH... operations. + All assume that `fail_stack' is nonempty. */ +# define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer +# define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer +# define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] + +/* Used to omit pushing failure point id's when we're not debugging. */ +# ifdef DEBUG +# define DEBUG_PUSH PUSH_FAILURE_INT +# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () +# else +# define DEBUG_PUSH(item) +# define DEBUG_POP(item_addr) +# endif + + +/* Push the information about the state we will need + if we ever fail back to it. + + Requires variables fail_stack, regstart, regend, reg_info, and + num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' + be declared. + + Does `return FAILURE_CODE' if runs out of memory. */ + +# define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ + do { \ + char *destination; \ + /* Must be int, so when we don't save any registers, the arithmetic \ + of 0 + -1 isn't done as unsigned. */ \ + /* Can't be int, since there is not a shred of a guarantee that int \ + is wide enough to hold a value of something to which pointer can \ + be assigned */ \ + active_reg_t this_reg; \ + \ + DEBUG_STATEMENT (failure_id++); \ + DEBUG_STATEMENT (nfailure_points_pushed++); \ + DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ + DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ + DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ + \ + DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ + DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ + \ + /* Ensure we have enough space allocated for what we will push. */ \ + while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ + { \ + if (!DOUBLE_FAIL_STACK (fail_stack)) \ + return failure_code; \ + \ + DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ + (fail_stack).size); \ + DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ + } \ + \ + /* Push the info, starting with the registers. */ \ + DEBUG_PRINT1 ("\n"); \ + \ + if (1) \ + for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ + this_reg++) \ + { \ + DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ + DEBUG_STATEMENT (num_regs_pushed++); \ + \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + PUSH_FAILURE_POINTER (regstart[this_reg]); \ + \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + PUSH_FAILURE_POINTER (regend[this_reg]); \ + \ + DEBUG_PRINT2 (" info: %p\n ", \ + reg_info[this_reg].word.pointer); \ + DEBUG_PRINT2 (" match_null=%d", \ + REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ + DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ + DEBUG_PRINT2 (" matched_something=%d", \ + MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT2 (" ever_matched=%d", \ + EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ + DEBUG_PRINT1 ("\n"); \ + PUSH_FAILURE_ELT (reg_info[this_reg].word); \ + } \ + \ + DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ + PUSH_FAILURE_INT (lowest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ + PUSH_FAILURE_INT (highest_active_reg); \ + \ + DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ + PUSH_FAILURE_POINTER (pattern_place); \ + \ + DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ + DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ + size2); \ + DEBUG_PRINT1 ("'\n"); \ + PUSH_FAILURE_POINTER (string_place); \ + \ + DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ + DEBUG_PUSH (failure_id); \ + } while (0) + +# ifndef DEFINED_ONCE +/* This is the number of items that are pushed and popped on the stack + for each register. */ +# define NUM_REG_ITEMS 3 + +/* Individual items aside from the registers. */ +# ifdef DEBUG +# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ +# else +# define NUM_NONREG_ITEMS 4 +# endif + +/* We push at most this many items on the stack. */ +/* We used to use (num_regs - 1), which is the number of registers + this regexp will save; but that was changed to 5 + to avoid stack overflow for a regexp with lots of parens. */ +# define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) + +/* We actually push this many items. */ +# define NUM_FAILURE_ITEMS \ + (((0 \ + ? 0 : highest_active_reg - lowest_active_reg + 1) \ + * NUM_REG_ITEMS) \ + + NUM_NONREG_ITEMS) + +/* How many items can still be added to the stack without overflowing it. */ +# define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) +# endif /* not DEFINED_ONCE */ + + +/* Pops what PUSH_FAIL_STACK pushes. + + We restore into the parameters, all of which should be lvalues: + STR -- the saved data position. + PAT -- the saved pattern position. + LOW_REG, HIGH_REG -- the highest and lowest active registers. + REGSTART, REGEND -- arrays of string positions. + REG_INFO -- array of information about each subexpression. + + Also assumes the variables `fail_stack' and (if debugging), `bufp', + `pend', `string1', `size1', `string2', and `size2'. */ +# define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ +{ \ + DEBUG_STATEMENT (unsigned failure_id;) \ + active_reg_t this_reg; \ + const UCHAR_T *string_temp; \ + \ + assert (!FAIL_STACK_EMPTY ()); \ + \ + /* Remove failure points and point to how many regs pushed. */ \ + DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ + DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ + DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ + \ + assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ + \ + DEBUG_POP (&failure_id); \ + DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ + \ + /* If the saved string location is NULL, it came from an \ + on_failure_keep_string_jump opcode, and we want to throw away the \ + saved NULL, thus retaining our current position in the string. */ \ + string_temp = POP_FAILURE_POINTER (); \ + if (string_temp != NULL) \ + str = (const CHAR_T *) string_temp; \ + \ + DEBUG_PRINT2 (" Popping string %p: `", str); \ + DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ + DEBUG_PRINT1 ("'\n"); \ + \ + pat = (UCHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ + DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ + \ + /* Restore register info. */ \ + high_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ + \ + low_reg = (active_reg_t) POP_FAILURE_INT (); \ + DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ + \ + if (1) \ + for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ + { \ + DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ + \ + reg_info[this_reg].word = POP_FAILURE_ELT (); \ + DEBUG_PRINT2 (" info: %p\n", \ + reg_info[this_reg].word.pointer); \ + \ + regend[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ + \ + regstart[this_reg] = (const CHAR_T *) POP_FAILURE_POINTER (); \ + DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ + } \ + else \ + { \ + for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ + { \ + reg_info[this_reg].word.integer = 0; \ + regend[this_reg] = 0; \ + regstart[this_reg] = 0; \ + } \ + highest_active_reg = high_reg; \ + } \ + \ + set_regs_matched_done = 0; \ + DEBUG_STATEMENT (nfailure_points_popped++); \ +} /* POP_FAILURE_POINT */ + +/* Structure for per-register (a.k.a. per-group) information. + Other register information, such as the + starting and ending positions (which are addresses), and the list of + inner groups (which is a bits list) are maintained in separate + variables. + + We are making a (strictly speaking) nonportable assumption here: that + the compiler will pack our bit fields into something that fits into + the type of `word', i.e., is something that fits into one item on the + failure stack. */ + + +/* Declarations and macros for re_match_2. */ + +typedef union +{ + PREFIX(fail_stack_elt_t) word; + struct + { + /* This field is one if this group can match the empty string, + zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ +# define MATCH_NULL_UNSET_VALUE 3 + unsigned match_null_string_p : 2; + unsigned is_active : 1; + unsigned matched_something : 1; + unsigned ever_matched_something : 1; + } bits; +} PREFIX(register_info_type); + +# ifndef DEFINED_ONCE +# define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) +# define IS_ACTIVE(R) ((R).bits.is_active) +# define MATCHED_SOMETHING(R) ((R).bits.matched_something) +# define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) + + +/* Call this when have matched a real character; it sets `matched' flags + for the subexpressions which we are currently inside. Also records + that those subexprs have matched. */ +# define SET_REGS_MATCHED() \ + do \ + { \ + if (!set_regs_matched_done) \ + { \ + active_reg_t r; \ + set_regs_matched_done = 1; \ + for (r = lowest_active_reg; r <= highest_active_reg; r++) \ + { \ + MATCHED_SOMETHING (reg_info[r]) \ + = EVER_MATCHED_SOMETHING (reg_info[r]) \ + = 1; \ + } \ + } \ + } \ + while (0) +# endif /* not DEFINED_ONCE */ + +/* Registers are set to a sentinel when they haven't yet matched. */ +static CHAR_T PREFIX(reg_unset_dummy); +# define REG_UNSET_VALUE (&PREFIX(reg_unset_dummy)) +# define REG_UNSET(e) ((e) == REG_UNSET_VALUE) + +/* Subroutine declarations and macros for regex_compile. */ +static void PREFIX(store_op1) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc, int arg)); +static void PREFIX(store_op2) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc, + int arg1, int arg2)); +static void PREFIX(insert_op1) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc, + int arg, UCHAR_T *end)); +static void PREFIX(insert_op2) _RE_ARGS ((re_opcode_t op, UCHAR_T *loc, + int arg1, int arg2, UCHAR_T *end)); +static boolean PREFIX(at_begline_loc_p) _RE_ARGS ((const CHAR_T *pattern, + const CHAR_T *p, + reg_syntax_t syntax)); +static boolean PREFIX(at_endline_loc_p) _RE_ARGS ((const CHAR_T *p, + const CHAR_T *pend, + reg_syntax_t syntax)); +# ifdef WCHAR +static reg_errcode_t wcs_compile_range _RE_ARGS ((CHAR_T range_start, + const CHAR_T **p_ptr, + const CHAR_T *pend, + char *translate, + reg_syntax_t syntax, + UCHAR_T *b, + CHAR_T *char_set)); +static void insert_space _RE_ARGS ((int num, CHAR_T *loc, CHAR_T *end)); +# else /* BYTE */ +static reg_errcode_t byte_compile_range _RE_ARGS ((unsigned int range_start, + const char **p_ptr, + const char *pend, + char *translate, + reg_syntax_t syntax, + unsigned char *b)); +# endif /* WCHAR */ + +/* Fetch the next character in the uncompiled pattern---translating it + if necessary. Also cast from a signed character in the constant + string passed to us by the user to an unsigned char that we can use + as an array index (in, e.g., `translate'). */ +/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, + because it is impossible to allocate 4GB array for some encodings + which have 4 byte character_set like UCS4. */ +# ifndef PATFETCH +# ifdef WCHAR +# define PATFETCH(c) \ + do {if (p == pend) return REG_EEND; \ + c = (UCHAR_T) *p++; \ + if (translate && (c <= 0xff)) c = (UCHAR_T) translate[c]; \ + } while (0) +# else /* BYTE */ +# define PATFETCH(c) \ + do {if (p == pend) return REG_EEND; \ + c = (unsigned char) *p++; \ + if (translate) c = (unsigned char) translate[c]; \ + } while (0) +# endif /* WCHAR */ +# endif + +/* Fetch the next character in the uncompiled pattern, with no + translation. */ +# define PATFETCH_RAW(c) \ + do {if (p == pend) return REG_EEND; \ + c = (UCHAR_T) *p++; \ + } while (0) + +/* Go backwards one character in the pattern. */ +# define PATUNFETCH p-- + + +/* If `translate' is non-null, return translate[D], else just D. We + cast the subscript to translate because some data is declared as + `char *', to avoid warnings when a string constant is passed. But + when we use a character as a subscript we must make it unsigned. */ +/* ifdef MBS_SUPPORT, we translate only if character <= 0xff, + because it is impossible to allocate 4GB array for some encodings + which have 4 byte character_set like UCS4. */ + +# ifndef TRANSLATE +# ifdef WCHAR +# define TRANSLATE(d) \ + ((translate && ((UCHAR_T) (d)) <= 0xff) \ + ? (char) translate[(unsigned char) (d)] : (d)) +# else /* BYTE */ +# define TRANSLATE(d) \ + (translate ? (char) translate[(unsigned char) (d)] : (d)) +# endif /* WCHAR */ +# endif + + +/* Macros for outputting the compiled pattern into `buffer'. */ + +/* If the buffer isn't allocated when it comes in, use this. */ +# define INIT_BUF_SIZE (32 * sizeof(UCHAR_T)) + +/* Make sure we have at least N more bytes of space in buffer. */ +# ifdef WCHAR +# define GET_BUFFER_SPACE(n) \ + while (((unsigned long)b - (unsigned long)COMPILED_BUFFER_VAR \ + + (n)*sizeof(CHAR_T)) > bufp->allocated) \ + EXTEND_BUFFER () +# else /* BYTE */ +# define GET_BUFFER_SPACE(n) \ + while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ + EXTEND_BUFFER () +# endif /* WCHAR */ + +/* Make sure we have one more byte of buffer space and then add C to it. */ +# define BUF_PUSH(c) \ + do { \ + GET_BUFFER_SPACE (1); \ + *b++ = (UCHAR_T) (c); \ + } while (0) + + +/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ +# define BUF_PUSH_2(c1, c2) \ + do { \ + GET_BUFFER_SPACE (2); \ + *b++ = (UCHAR_T) (c1); \ + *b++ = (UCHAR_T) (c2); \ + } while (0) + + +/* As with BUF_PUSH_2, except for three bytes. */ +# define BUF_PUSH_3(c1, c2, c3) \ + do { \ + GET_BUFFER_SPACE (3); \ + *b++ = (UCHAR_T) (c1); \ + *b++ = (UCHAR_T) (c2); \ + *b++ = (UCHAR_T) (c3); \ + } while (0) + +/* Store a jump with opcode OP at LOC to location TO. We store a + relative address offset by the three bytes the jump itself occupies. */ +# define STORE_JUMP(op, loc, to) \ + PREFIX(store_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE))) + +/* Likewise, for a two-argument jump. */ +# define STORE_JUMP2(op, loc, to, arg) \ + PREFIX(store_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), arg) + +/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ +# define INSERT_JUMP(op, loc, to) \ + PREFIX(insert_op1) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)), b) + +/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ +# define INSERT_JUMP2(op, loc, to, arg) \ + PREFIX(insert_op2) (op, loc, (int) ((to) - (loc) - (1 + OFFSET_ADDRESS_SIZE)),\ + arg, b) + +/* This is not an arbitrary limit: the arguments which represent offsets + into the pattern are two bytes long. So if 2^16 bytes turns out to + be too small, many things would have to change. */ +/* Any other compiler which, like MSC, has allocation limit below 2^16 + bytes will have to use approach similar to what was done below for + MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up + reallocating to 0 bytes. Such thing is not going to work too well. + You have been warned!! */ +# ifndef DEFINED_ONCE +# if defined _MSC_VER && !defined WIN32 +/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. + The REALLOC define eliminates a flurry of conversion warnings, + but is not required. */ +# define MAX_BUF_SIZE 65500L +# define REALLOC(p,s) realloc ((p), (size_t) (s)) +# else +# define MAX_BUF_SIZE (1L << 16) +# define REALLOC(p,s) realloc ((p), (s)) +# endif + +/* Extend the buffer by twice its current size via realloc and + reset the pointers that pointed into the old block to point to the + correct places in the new one. If extending the buffer results in it + being larger than MAX_BUF_SIZE, then flag memory exhausted. */ +# if __BOUNDED_POINTERS__ +# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated) +# define MOVE_BUFFER_POINTER(P) \ + (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr) +# define ELSE_EXTEND_BUFFER_HIGH_BOUND \ + else \ + { \ + SET_HIGH_BOUND (b); \ + SET_HIGH_BOUND (begalt); \ + if (fixup_alt_jump) \ + SET_HIGH_BOUND (fixup_alt_jump); \ + if (laststart) \ + SET_HIGH_BOUND (laststart); \ + if (pending_exact) \ + SET_HIGH_BOUND (pending_exact); \ + } +# else +# define MOVE_BUFFER_POINTER(P) (P) += incr +# define ELSE_EXTEND_BUFFER_HIGH_BOUND +# endif +# endif /* not DEFINED_ONCE */ + +# ifdef WCHAR +# define EXTEND_BUFFER() \ + do { \ + UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ + int wchar_count; \ + if (bufp->allocated + sizeof(UCHAR_T) > MAX_BUF_SIZE) \ + return REG_ESIZE; \ + bufp->allocated <<= 1; \ + if (bufp->allocated > MAX_BUF_SIZE) \ + bufp->allocated = MAX_BUF_SIZE; \ + /* How many characters the new buffer can have? */ \ + wchar_count = bufp->allocated / sizeof(UCHAR_T); \ + if (wchar_count == 0) wchar_count = 1; \ + /* Truncate the buffer to CHAR_T align. */ \ + bufp->allocated = wchar_count * sizeof(UCHAR_T); \ + RETALLOC (COMPILED_BUFFER_VAR, wchar_count, UCHAR_T); \ + bufp->buffer = (char*)COMPILED_BUFFER_VAR; \ + if (COMPILED_BUFFER_VAR == NULL) \ + return REG_ESPACE; \ + /* If the buffer moved, move all the pointers into it. */ \ + if (old_buffer != COMPILED_BUFFER_VAR) \ + { \ + int incr = COMPILED_BUFFER_VAR - old_buffer; \ + MOVE_BUFFER_POINTER (b); \ + MOVE_BUFFER_POINTER (begalt); \ + if (fixup_alt_jump) \ + MOVE_BUFFER_POINTER (fixup_alt_jump); \ + if (laststart) \ + MOVE_BUFFER_POINTER (laststart); \ + if (pending_exact) \ + MOVE_BUFFER_POINTER (pending_exact); \ + } \ + ELSE_EXTEND_BUFFER_HIGH_BOUND \ + } while (0) +# else /* BYTE */ +# define EXTEND_BUFFER() \ + do { \ + UCHAR_T *old_buffer = COMPILED_BUFFER_VAR; \ + if (bufp->allocated == MAX_BUF_SIZE) \ + return REG_ESIZE; \ + bufp->allocated <<= 1; \ + if (bufp->allocated > MAX_BUF_SIZE) \ + bufp->allocated = MAX_BUF_SIZE; \ + bufp->buffer = (UCHAR_T *) REALLOC (COMPILED_BUFFER_VAR, \ + bufp->allocated); \ + if (COMPILED_BUFFER_VAR == NULL) \ + return REG_ESPACE; \ + /* If the buffer moved, move all the pointers into it. */ \ + if (old_buffer != COMPILED_BUFFER_VAR) \ + { \ + int incr = COMPILED_BUFFER_VAR - old_buffer; \ + MOVE_BUFFER_POINTER (b); \ + MOVE_BUFFER_POINTER (begalt); \ + if (fixup_alt_jump) \ + MOVE_BUFFER_POINTER (fixup_alt_jump); \ + if (laststart) \ + MOVE_BUFFER_POINTER (laststart); \ + if (pending_exact) \ + MOVE_BUFFER_POINTER (pending_exact); \ + } \ + ELSE_EXTEND_BUFFER_HIGH_BOUND \ + } while (0) +# endif /* WCHAR */ + +# ifndef DEFINED_ONCE +/* Since we have one byte reserved for the register number argument to + {start,stop}_memory, the maximum number of groups we can report + things about is what fits in that byte. */ +# define MAX_REGNUM 255 + +/* But patterns can have more than `MAX_REGNUM' registers. We just + ignore the excess. */ +typedef unsigned regnum_t; + + +/* Macros for the compile stack. */ + +/* Since offsets can go either forwards or backwards, this type needs to + be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ +/* int may be not enough when sizeof(int) == 2. */ +typedef long pattern_offset_t; + +typedef struct +{ + pattern_offset_t begalt_offset; + pattern_offset_t fixup_alt_jump; + pattern_offset_t inner_group_offset; + pattern_offset_t laststart_offset; + regnum_t regnum; +} compile_stack_elt_t; + + +typedef struct +{ + compile_stack_elt_t *stack; + unsigned size; + unsigned avail; /* Offset of next open position. */ +} compile_stack_type; + + +# define INIT_COMPILE_STACK_SIZE 32 + +# define COMPILE_STACK_EMPTY (compile_stack.avail == 0) +# define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) + +/* The next available element. */ +# define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) + +# endif /* not DEFINED_ONCE */ + +/* Set the bit for character C in a list. */ +# ifndef DEFINED_ONCE +# define SET_LIST_BIT(c) \ + (b[((unsigned char) (c)) / BYTEWIDTH] \ + |= 1 << (((unsigned char) c) % BYTEWIDTH)) +# endif /* DEFINED_ONCE */ + +/* Get the next unsigned number in the uncompiled pattern. */ +# define GET_UNSIGNED_NUMBER(num) \ + { \ + while (p != pend) \ + { \ + PATFETCH (c); \ + if (c < '0' || c > '9') \ + break; \ + if (num <= RE_DUP_MAX) \ + { \ + if (num < 0) \ + num = 0; \ + num = num * 10 + c - '0'; \ + } \ + } \ + } + +# ifndef DEFINED_ONCE +# 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 +# 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 +# endif /* DEFINED_ONCE */ + +# ifndef MATCH_MAY_ALLOCATE + +/* If we cannot allocate large objects within re_match_2_internal, + we make the fail stack and register vectors global. + The fail stack, we grow to the maximum size when a regexp + is compiled. + The register vectors, we adjust in size each time we + compile a regexp, according to the number of registers it needs. */ + +static PREFIX(fail_stack_type) fail_stack; + +/* Size with which the following vectors are currently allocated. + That is so we can make them bigger as needed, + but never make them smaller. */ +# ifdef DEFINED_ONCE +static int regs_allocated_size; + +static const char ** regstart, ** regend; +static const char ** old_regstart, ** old_regend; +static const char **best_regstart, **best_regend; +static const char **reg_dummy; +# endif /* DEFINED_ONCE */ + +static PREFIX(register_info_type) *PREFIX(reg_info); +static PREFIX(register_info_type) *PREFIX(reg_info_dummy); + +/* Make the register vectors big enough for NUM_REGS registers, + but don't make them smaller. */ + +static void +PREFIX(regex_grow_registers) (num_regs) + int num_regs; +{ + if (num_regs > regs_allocated_size) + { + RETALLOC_IF (regstart, num_regs, const char *); + RETALLOC_IF (regend, num_regs, const char *); + RETALLOC_IF (old_regstart, num_regs, const char *); + RETALLOC_IF (old_regend, num_regs, const char *); + RETALLOC_IF (best_regstart, num_regs, const char *); + RETALLOC_IF (best_regend, num_regs, const char *); + RETALLOC_IF (PREFIX(reg_info), num_regs, PREFIX(register_info_type)); + RETALLOC_IF (reg_dummy, num_regs, const char *); + RETALLOC_IF (PREFIX(reg_info_dummy), num_regs, PREFIX(register_info_type)); + + regs_allocated_size = num_regs; + } +} + +# endif /* not MATCH_MAY_ALLOCATE */ + +# ifndef DEFINED_ONCE +static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type + compile_stack, + regnum_t regnum)); +# endif /* not DEFINED_ONCE */ + +/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. + Returns one of error codes defined in `regex.h', or zero for success. + + Assumes the `allocated' (and perhaps `buffer') and `translate' + fields are set in BUFP on entry. + + If it succeeds, results are put in BUFP (if it returns an error, the + contents of BUFP are undefined): + `buffer' is the compiled pattern; + `syntax' is set to SYNTAX; + `used' is set to the length of the compiled pattern; + `fastmap_accurate' is zero; + `re_nsub' is the number of subexpressions in PATTERN; + `not_bol' and `not_eol' are zero; + + The `fastmap' and `newline_anchor' fields are neither + examined nor set. */ + +/* Return, freeing storage we allocated. */ +# ifdef WCHAR +# define FREE_STACK_RETURN(value) \ + return (free(pattern), free(mbs_offset), free(is_binary), free (compile_stack.stack), value) +# else +# define FREE_STACK_RETURN(value) \ + return (free (compile_stack.stack), value) +# endif /* WCHAR */ + +static reg_errcode_t +PREFIX(regex_compile) (ARG_PREFIX(pattern), ARG_PREFIX(size), syntax, bufp) + const char *ARG_PREFIX(pattern); + size_t ARG_PREFIX(size); + reg_syntax_t syntax; + struct re_pattern_buffer *bufp; +{ + /* We fetch characters from PATTERN here. Even though PATTERN is + `char *' (i.e., signed), we declare these variables as unsigned, so + they can be reliably used as array indices. */ + register UCHAR_T c, c1; + +#ifdef WCHAR + /* A temporary space to keep wchar_t pattern and compiled pattern. */ + CHAR_T *pattern, *COMPILED_BUFFER_VAR; + size_t size; + /* offset buffer for optimization. See convert_mbs_to_wc. */ + int *mbs_offset = NULL; + /* It hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; + /* A flag whether exactn is handling binary data or not. */ + char is_exactn_bin = FALSE; +#endif /* WCHAR */ + + /* A random temporary spot in PATTERN. */ + const CHAR_T *p1; + + /* Points to the end of the buffer, where we should append. */ + register UCHAR_T *b; + + /* Keeps track of unclosed groups. */ + compile_stack_type compile_stack; + + /* Points to the current (ending) position in the pattern. */ +#ifdef WCHAR + const CHAR_T *p; + const CHAR_T *pend; +#else /* BYTE */ + const CHAR_T *p = pattern; + const CHAR_T *pend = pattern + size; +#endif /* WCHAR */ + + /* How to translate the characters in the pattern. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Address of the count-byte of the most recently inserted `exactn' + command. This makes it possible to tell if a new exact-match + character can be added to that command or if the character requires + a new `exactn' command. */ + UCHAR_T *pending_exact = 0; + + /* Address of start of the most recently finished expression. + This tells, e.g., postfix * where to find the start of its + operand. Reset at the beginning of groups and alternatives. */ + UCHAR_T *laststart = 0; + + /* Address of beginning of regexp, or inside of last group. */ + UCHAR_T *begalt; + + /* Address of the place where a forward jump should go to the end of + the containing expression. Each alternative of an `or' -- except the + last -- ends with a forward jump of this sort. */ + UCHAR_T *fixup_alt_jump = 0; + + /* Counts open-groups as they are encountered. Remembered for the + matching close-group on the compile stack, so the same register + number is put in the stop_memory as the start_memory. */ + regnum_t regnum = 0; + +#ifdef WCHAR + /* Initialize the wchar_t PATTERN and offset_buffer. */ + p = pend = pattern = TALLOC(csize + 1, CHAR_T); + mbs_offset = TALLOC(csize + 1, int); + is_binary = TALLOC(csize + 1, char); + if (pattern == NULL || mbs_offset == NULL || is_binary == NULL) + { + free(pattern); + free(mbs_offset); + free(is_binary); + return REG_ESPACE; + } + pattern[csize] = L'\0'; /* sentinel */ + size = convert_mbs_to_wcs(pattern, cpattern, csize, mbs_offset, is_binary); + pend = p + size; + if (size < 0) + { + free(pattern); + free(mbs_offset); + free(is_binary); + return REG_BADPAT; + } +#endif + +#ifdef DEBUG + DEBUG_PRINT1 ("\nCompiling pattern: "); + if (debug) + { + unsigned debug_count; + + for (debug_count = 0; debug_count < size; debug_count++) + PUT_CHAR (pattern[debug_count]); + putchar ('\n'); + } +#endif /* DEBUG */ + + /* Initialize the compile stack. */ + compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); + if (compile_stack.stack == NULL) + { +#ifdef WCHAR + free(pattern); + free(mbs_offset); + free(is_binary); +#endif + return REG_ESPACE; + } + + compile_stack.size = INIT_COMPILE_STACK_SIZE; + compile_stack.avail = 0; + + /* Initialize the pattern buffer. */ + bufp->syntax = syntax; + bufp->fastmap_accurate = 0; + bufp->not_bol = bufp->not_eol = 0; + + /* Set `used' to zero, so that if we return an error, the pattern + printer (for debugging) will think there's no pattern. We reset it + at the end. */ + bufp->used = 0; + + /* Always count groups, whether or not bufp->no_sub is set. */ + bufp->re_nsub = 0; + +#if !defined emacs && !defined SYNTAX_TABLE + /* Initialize the syntax table. */ + init_syntax_once (); +#endif + + if (bufp->allocated == 0) + { + if (bufp->buffer) + { /* 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. */ +#ifdef WCHAR + /* Free bufp->buffer and allocate an array for wchar_t pattern + buffer. */ + free(bufp->buffer); + COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE/sizeof(UCHAR_T), + UCHAR_T); +#else + RETALLOC (COMPILED_BUFFER_VAR, INIT_BUF_SIZE, UCHAR_T); +#endif /* WCHAR */ + } + else + { /* Caller did not allocate a buffer. Do it for them. */ + COMPILED_BUFFER_VAR = TALLOC (INIT_BUF_SIZE / sizeof(UCHAR_T), + UCHAR_T); + } + + if (!COMPILED_BUFFER_VAR) FREE_STACK_RETURN (REG_ESPACE); +#ifdef WCHAR + bufp->buffer = (char*)COMPILED_BUFFER_VAR; +#endif /* WCHAR */ + bufp->allocated = INIT_BUF_SIZE; + } +#ifdef WCHAR + else + COMPILED_BUFFER_VAR = (UCHAR_T*) bufp->buffer; +#endif + + begalt = b = COMPILED_BUFFER_VAR; + + /* Loop through the uncompiled pattern until we're at the end. */ + while (p != pend) + { + PATFETCH (c); + + switch (c) + { + case '^': + { + if ( /* If at start of pattern, it's an operator. */ + p == pattern + 1 + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's come before. */ + || PREFIX(at_begline_loc_p) (pattern, p, syntax)) + BUF_PUSH (begline); + else + goto normal_char; + } + break; + + + case '$': + { + if ( /* If at end of pattern, it's an operator. */ + p == pend + /* If context independent, it's an operator. */ + || syntax & RE_CONTEXT_INDEP_ANCHORS + /* Otherwise, depends on what's next. */ + || PREFIX(at_endline_loc_p) (p, pend, syntax)) + BUF_PUSH (endline); + else + goto normal_char; + } + break; + + + case '+': + case '?': + if ((syntax & RE_BK_PLUS_QM) + || (syntax & RE_LIMITED_OPS)) + goto normal_char; + handle_plus: + case '*': + /* If there is no previous pattern... */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS) + FREE_STACK_RETURN (REG_BADRPT); + else if (!(syntax & RE_CONTEXT_INDEP_OPS)) + goto normal_char; + } + + { + /* Are we optimizing this jump? */ + boolean keep_string_p = false; + + /* 1 means zero (many) matches is allowed. */ + char zero_times_ok = 0, many_times_ok = 0; + + /* If there is a sequence of repetition chars, collapse it + down to just one (the right one). We can't combine + interval operators with these because of, e.g., `a{2}*', + which should only match an even number of `a's. */ + + for (;;) + { + zero_times_ok |= c != '+'; + many_times_ok |= c != '?'; + + if (p == pend) + break; + + PATFETCH (c); + + if (c == '*' + || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) + ; + + else if (syntax & RE_BK_PLUS_QM && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + if (!(c1 == '+' || c1 == '?')) + { + PATUNFETCH; + PATUNFETCH; + break; + } + + c = c1; + } + else + { + PATUNFETCH; + break; + } + + /* If we get here, we found another repeat character. */ + } + + /* Star, etc. applied to an empty pattern is equivalent + to an empty pattern. */ + if (!laststart) + break; + + /* Now we know whether or not zero matches is allowed + and also whether or not two or more matches is allowed. */ + if (many_times_ok) + { /* More than one repetition is allowed, so put in at the + end a backward relative jump from `b' to before the next + jump we're going to put in below (which jumps from + laststart to after this jump). + + But if we are at the `*' in the exact sequence `.*\n', + insert an unconditional jump backwards to the ., + instead of the beginning of the loop. This way we only + push a failure point once, instead of every time + through the loop. */ + assert (p - 1 > pattern); + + /* Allocate the space for the jump. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + + /* We know we are not at the first character of the pattern, + because laststart was nonzero. And we've already + incremented `p', by the way, to be the character after + the `*'. Do we have to do something analogous here + for null bytes, because of RE_DOT_NOT_NULL? */ + if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') + && zero_times_ok + && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') + && !(syntax & RE_DOT_NEWLINE)) + { /* We have .*\n. */ + STORE_JUMP (jump, b, laststart); + keep_string_p = true; + } + else + /* Anything else. */ + STORE_JUMP (maybe_pop_jump, b, laststart - + (1 + OFFSET_ADDRESS_SIZE)); + + /* We've added more stuff to the buffer. */ + b += 1 + OFFSET_ADDRESS_SIZE; + } + + /* On failure, jump from laststart to b + 3, which will be the + end of the buffer after this jump is inserted. */ + /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' instead of + 'b + 3'. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump + : on_failure_jump, + laststart, b + 1 + OFFSET_ADDRESS_SIZE); + pending_exact = 0; + b += 1 + OFFSET_ADDRESS_SIZE; + + if (!zero_times_ok) + { + /* At least one repetition is required, so insert a + `dummy_failure_jump' before the initial + `on_failure_jump' instruction of the loop. This + effects a skip over that instruction the first time + we hit that loop. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (dummy_failure_jump, laststart, laststart + + 2 + 2 * OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + } + } + break; + + + case '.': + laststart = b; + BUF_PUSH (anychar); + break; + + + case '[': + { + boolean had_char_class = false; +#ifdef WCHAR + CHAR_T range_start = 0xffffffff; +#else + unsigned int range_start = 0xffffffff; +#endif + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + +#ifdef WCHAR + /* We assume a charset(_not) structure as a wchar_t array. + charset[0] = (re_opcode_t) charset(_not) + charset[1] = l (= length of char_classes) + charset[2] = m (= length of collating_symbols) + charset[3] = n (= length of equivalence_classes) + charset[4] = o (= length of char_ranges) + charset[5] = p (= length of chars) + + charset[6] = char_class (wctype_t) + charset[6+CHAR_CLASS_SIZE] = char_class (wctype_t) + ... + charset[l+5] = char_class (wctype_t) + + charset[l+6] = collating_symbol (wchar_t) + ... + charset[l+m+5] = collating_symbol (wchar_t) + ifdef _LIBC we use the index if + _NL_COLLATE_SYMB_EXTRAMB instead of + wchar_t string. + + charset[l+m+6] = equivalence_classes (wchar_t) + ... + charset[l+m+n+5] = equivalence_classes (wchar_t) + ifdef _LIBC we use the index in + _NL_COLLATE_WEIGHT instead of + wchar_t string. + + charset[l+m+n+6] = range_start + charset[l+m+n+7] = range_end + ... + charset[l+m+n+2o+4] = range_start + charset[l+m+n+2o+5] = range_end + ifdef _LIBC we use the value looked up + in _NL_COLLATE_COLLSEQ instead of + wchar_t character. + + charset[l+m+n+2o+6] = char + ... + charset[l+m+n+2o+p+5] = char + + */ + + /* We need at least 6 spaces: the opcode, the length of + char_classes, the length of collating_symbols, the length of + equivalence_classes, the length of char_ranges, the length of + chars. */ + GET_BUFFER_SPACE (6); + + /* Save b as laststart. And We use laststart as the pointer + to the first element of the charset here. + In other words, laststart[i] indicates charset[i]. */ + laststart = b; + + /* We test `*p == '^' twice, instead of using an if + statement, so we only need one BUF_PUSH. */ + BUF_PUSH (*p == '^' ? charset_not : charset); + if (*p == '^') + p++; + + /* Push the length of char_classes, the length of + collating_symbols, the length of equivalence_classes, the + length of char_ranges and the length of chars. */ + BUF_PUSH_3 (0, 0, 0); + BUF_PUSH_2 (0, 0); + + /* Remember the first position in the bracket expression. */ + p1 = p; + + /* charset_not matches newline according to a syntax bit. */ + if ((re_opcode_t) b[-6] == charset_not + && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) + { + BUF_PUSH('\n'); + laststart[5]++; /* Update the length of characters */ + } + + /* Read in characters and ranges, setting map bits. */ + for (;;) + { + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + PATFETCH (c); + + /* \ might escape characters inside [...] and [^...]. */ + if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + BUF_PUSH(c1); + laststart[5]++; /* Update the length of chars */ + range_start = c1; + continue; + } + + /* Could be the end of the bracket expression. If it's + not (i.e., when the bracket expression is `[]' so + far), the ']' character bit gets set way below. */ + if (c == ']' && p != p1 + 1) + break; + + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_STACK_RETURN (REG_ERANGE); + + /* Look ahead to see if it's a range when the last thing + was a character: if this is a hyphen not at the + beginning or the end of a list, then it's the range + operator. */ + if (c == '-' + && !(p - 2 >= pattern && p[-2] == '[') + && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') + && *p != ']') + { + reg_errcode_t ret; + /* Allocate the space for range_start and range_end. */ + GET_BUFFER_SPACE (2); + /* Update the pointer to indicate end of buffer. */ + b += 2; + ret = wcs_compile_range (range_start, &p, pend, translate, + syntax, b, laststart); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + else if (p[0] == '-' && p[1] != ']') + { /* This handles ranges made up of characters only. */ + reg_errcode_t ret; + + /* Move past the `-'. */ + PATFETCH (c1); + /* Allocate the space for range_start and range_end. */ + GET_BUFFER_SPACE (2); + /* Update the pointer to indicate end of buffer. */ + b += 2; + ret = wcs_compile_range (c, &p, pend, translate, syntax, b, + laststart); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + /* See if we're at the beginning of a possible character + class. */ + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') + { /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == ':' && *p == ']') || p == pend) + break; + if (c1 < CHAR_CLASS_MAX_LENGTH) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and leave + the leading `:' and `[' (but store them as character). */ + if (c == ':' && *p == ']') + { + wctype_t wt; + uintptr_t alignedp; + + /* Query the character class as wctype_t. */ + wt = IS_CHAR_CLASS (str); + if (wt == 0) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + /* Allocate the space for character class. */ + GET_BUFFER_SPACE(CHAR_CLASS_SIZE); + /* Update the pointer to indicate end of buffer. */ + b += CHAR_CLASS_SIZE; + /* Move data which follow character classes + not to violate the data. */ + insert_space(CHAR_CLASS_SIZE, + laststart + 6 + laststart[1], + b - 1); + alignedp = ((uintptr_t)(laststart + 6 + laststart[1]) + + __alignof__(wctype_t) - 1) + & ~(uintptr_t)(__alignof__(wctype_t) - 1); + /* Store the character class. */ + *((wctype_t*)alignedp) = wt; + /* Update length of char_classes */ + laststart[1] += CHAR_CLASS_SIZE; + + had_char_class = true; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + BUF_PUSH ('['); + BUF_PUSH (':'); + laststart[5] += 2; /* Update the length of characters */ + range_start = ':'; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && (*p == '=' + || *p == '.')) + { + CHAR_T str[128]; /* Should be large enough. */ + CHAR_T delim = *p; /* '=' or '.' */ +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[=' or '[[.'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == delim && *p == ']') || p == pend) + break; + if (c1 < sizeof (str) - 1) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == delim && *p == ']' && str[0] != '\0') + { + unsigned int i, offset; + /* If we have no collation data we use the default + collation in which each character is in a class + by itself. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ + + /* If not defined _LIBC, we push the name and + `\0' for the sake of matching performance. */ + int datasize = c1 + 1; + +# ifdef _LIBC + int32_t idx = 0; + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + } +# ifdef _LIBC + else + { + const int32_t *table; + const int32_t *weights; + const int32_t *extra; + const int32_t *indirect; + wint_t *cp; + + /* This #include defines a local function! */ +# include <locale/weightwc.h> + + if(delim == '=') + { + /* We push the index for equivalence class. */ + cp = (wint_t*)str; + + 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); + + idx = findidx ((const wint_t**)&cp); + if (idx == 0 || cp < (wint_t*) str + c1) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + str[0] = (wchar_t)idx; + } + else /* delim == '.' */ + { + /* We push collation sequence value + for collating symbol. */ + int32_t table_size; + const int32_t *symb_table; + const unsigned char *extra; + int32_t idx; + int32_t elem; + int32_t second; + int32_t hash; + char char_str[c1]; + + /* 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 (i = 0; i < c1; ++i) + char_str[i] = str[i]; + + 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 (char_str, c1); + + idx = 0; + elem = hash % table_size; + second = hash % (table_size - 2); + while (symb_table[2 * elem] != 0) + { + /* First compare the hashing value. */ + if (symb_table[2 * elem] == hash + && c1 == extra[symb_table[2 * elem + 1]] + && memcmp (char_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; + } + + if (symb_table[2 * elem] != 0) + { + /* Compute the index of the byte sequence + in the table. */ + idx += 1 + extra[idx]; + /* Adjust for the alignment. */ + idx = (idx + 3) & ~3; + + str[0] = (wchar_t) idx + 4; + } + else if (symb_table[2 * elem] == 0 && c1 == 1) + { + /* No valid character. Match it as a + single byte character. */ + had_char_class = false; + BUF_PUSH(str[0]); + /* Update the length of characters */ + laststart[5]++; + range_start = str[0]; + + /* Throw away the ] at the end of the + collating symbol. */ + PATFETCH (c); + /* exit from the switch block. */ + continue; + } + else + FREE_STACK_RETURN (REG_ECOLLATE); + } + datasize = 1; + } +# endif + /* Throw away the ] at the end of the equivalence + class (or collating symbol). */ + PATFETCH (c); + + /* Allocate the space for the equivalence class + (or collating symbol) (and '\0' if needed). */ + GET_BUFFER_SPACE(datasize); + /* Update the pointer to indicate end of buffer. */ + b += datasize; + + if (delim == '=') + { /* equivalence class */ + /* Calculate the offset of char_ranges, + which is next to equivalence_classes. */ + offset = laststart[1] + laststart[2] + + laststart[3] +6; + /* Insert space. */ + insert_space(datasize, laststart + offset, b - 1); + + /* Write the equivalence_class and \0. */ + for (i = 0 ; i < datasize ; i++) + laststart[offset + i] = str[i]; + + /* Update the length of equivalence_classes. */ + laststart[3] += datasize; + had_char_class = true; + } + else /* delim == '.' */ + { /* collating symbol */ + /* Calculate the offset of the equivalence_classes, + which is next to collating_symbols. */ + offset = laststart[1] + laststart[2] + 6; + /* Insert space and write the collationg_symbol + and \0. */ + insert_space(datasize, laststart + offset, b-1); + for (i = 0 ; i < datasize ; i++) + laststart[offset + i] = str[i]; + + /* In re_match_2_internal if range_start < -1, we + assume -range_start is the offset of the + collating symbol which is specified as + the character of the range start. So we assign + -(laststart[1] + laststart[2] + 6) to + range_start. */ + range_start = -(laststart[1] + laststart[2] + 6); + /* Update the length of collating_symbol. */ + laststart[2] += datasize; + had_char_class = false; + } + } + else + { + c1++; + while (c1--) + PATUNFETCH; + BUF_PUSH ('['); + BUF_PUSH (delim); + laststart[5] += 2; /* Update the length of characters */ + range_start = delim; + had_char_class = false; + } + } + else + { + had_char_class = false; + BUF_PUSH(c); + laststart[5]++; /* Update the length of characters */ + range_start = c; + } + } + +#else /* BYTE */ + /* Ensure that we have enough space to push a charset: the + opcode, the length count, and the bitset; 34 bytes in all. */ + GET_BUFFER_SPACE (34); + + laststart = b; + + /* We test `*p == '^' twice, instead of using an if + statement, so we only need one BUF_PUSH. */ + BUF_PUSH (*p == '^' ? charset_not : charset); + if (*p == '^') + p++; + + /* Remember the first position in the bracket expression. */ + p1 = p; + + /* Push the number of bytes in the bitmap. */ + BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); + + /* Clear the whole map. */ + bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); + + /* charset_not matches newline according to a syntax bit. */ + if ((re_opcode_t) b[-2] == charset_not + && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) + SET_LIST_BIT ('\n'); + + /* Read in characters and ranges, setting map bits. */ + for (;;) + { + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + PATFETCH (c); + + /* \ might escape characters inside [...] and [^...]. */ + if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') + { + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + PATFETCH (c1); + SET_LIST_BIT (c1); + range_start = c1; + continue; + } + + /* Could be the end of the bracket expression. If it's + not (i.e., when the bracket expression is `[]' so + far), the ']' character bit gets set way below. */ + if (c == ']' && p != p1 + 1) + break; + + /* Look ahead to see if it's a range when the last thing + was a character class. */ + if (had_char_class && c == '-' && *p != ']') + FREE_STACK_RETURN (REG_ERANGE); + + /* Look ahead to see if it's a range when the last thing + was a character: if this is a hyphen not at the + beginning or the end of a list, then it's the range + operator. */ + if (c == '-' + && !(p - 2 >= pattern && p[-2] == '[') + && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') + && *p != ']') + { + reg_errcode_t ret + = byte_compile_range (range_start, &p, pend, translate, + syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + else if (p[0] == '-' && p[1] != ']') + { /* This handles ranges made up of characters only. */ + reg_errcode_t ret; + + /* Move past the `-'. */ + PATFETCH (c1); + + ret = byte_compile_range (c, &p, pend, translate, syntax, b); + if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); + range_start = 0xffffffff; + } + + /* See if we're at the beginning of a possible character + class. */ + + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') + { /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[:'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == ':' && *p == ']') || p == pend) + break; + if (c1 < CHAR_CLASS_MAX_LENGTH) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and leave + the leading `:' and `[' (but set bits for them). */ + if (c == ':' && *p == ']') + { +# if defined _LIBC || WIDE_CHAR_SUPPORT + boolean is_lower = STREQ (str, "lower"); + boolean is_upper = STREQ (str, "upper"); + wctype_t wt; + int ch; + + wt = IS_CHAR_CLASS (str); + if (wt == 0) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) + { + if (iswctype (btowc (ch), wt)) + SET_LIST_BIT (ch); + + if (translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + + had_char_class = true; +# else + int ch; + boolean is_alnum = STREQ (str, "alnum"); + boolean is_alpha = STREQ (str, "alpha"); + boolean is_blank = STREQ (str, "blank"); + boolean is_cntrl = STREQ (str, "cntrl"); + boolean is_digit = STREQ (str, "digit"); + boolean is_graph = STREQ (str, "graph"); + boolean is_lower = STREQ (str, "lower"); + boolean is_print = STREQ (str, "print"); + boolean is_punct = STREQ (str, "punct"); + boolean is_space = STREQ (str, "space"); + boolean is_upper = STREQ (str, "upper"); + boolean is_xdigit = STREQ (str, "xdigit"); + + if (!IS_CHAR_CLASS (str)) + FREE_STACK_RETURN (REG_ECTYPE); + + /* Throw away the ] at the end of the character + class. */ + PATFETCH (c); + + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (ch = 0; ch < 1 << BYTEWIDTH; ch++) + { + /* This was split into 3 if's to + avoid an arbitrary limit in some compiler. */ + if ( (is_alnum && ISALNUM (ch)) + || (is_alpha && ISALPHA (ch)) + || (is_blank && ISBLANK (ch)) + || (is_cntrl && ISCNTRL (ch))) + SET_LIST_BIT (ch); + if ( (is_digit && ISDIGIT (ch)) + || (is_graph && ISGRAPH (ch)) + || (is_lower && ISLOWER (ch)) + || (is_print && ISPRINT (ch))) + SET_LIST_BIT (ch); + if ( (is_punct && ISPUNCT (ch)) + || (is_space && ISSPACE (ch)) + || (is_upper && ISUPPER (ch)) + || (is_xdigit && ISXDIGIT (ch))) + SET_LIST_BIT (ch); + if ( translate && (is_upper || is_lower) + && (ISUPPER (ch) || ISLOWER (ch))) + SET_LIST_BIT (ch); + } + had_char_class = true; +# endif /* libc || wctype.h */ + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT (':'); + range_start = ':'; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=') + { + unsigned char str[MB_LEN_MAX + 1]; +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[='. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '=' && *p == ']') || p == pend) + break; + if (c1 < MB_LEN_MAX) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '=' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is in a class + by itself. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +# ifdef _LIBC + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + } +# ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + const int32_t *table; + const unsigned char *weights; + const unsigned char *extra; + const int32_t *indirect; + int32_t idx; + const unsigned char *cp = str; + int ch; + + /* This #include defines a local function! */ +# include <locale/weight.h> + + 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 || cp < str + c1) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now we have to go throught the whole table + and find all characters which have the same + first level weight. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. */ + for (ch = 1; ch < 256; ++ch) + /* XXX This test would have to be changed if we + would allow matching multibyte sequences. */ + if (table[ch] > 0) + { + int32_t idx2 = table[ch]; + size_t len = weights[idx2]; + + /* Test whether the lenghts match. */ + if (weights[idx] == len) + { + /* They do. New compare the bytes of + the weight. */ + size_t cnt = 0; + + while (cnt < len + && (weights[idx + 1 + cnt] + == weights[idx2 + 1 + cnt])) + ++cnt; + + if (cnt == len) + /* They match. Mark the character as + acceptable. */ + SET_LIST_BIT (ch); + } + } + } +# endif + had_char_class = true; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('='); + range_start = '='; + had_char_class = false; + } + } + else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.') + { + unsigned char str[128]; /* Should be large enough. */ +# ifdef _LIBC + uint32_t nrules = + _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif + + PATFETCH (c); + c1 = 0; + + /* If pattern is `[[.'. */ + if (p == pend) FREE_STACK_RETURN (REG_EBRACK); + + for (;;) + { + PATFETCH (c); + if ((c == '.' && *p == ']') || p == pend) + break; + if (c1 < sizeof (str)) + str[c1++] = c; + else + /* This is in any case an invalid class name. */ + str[0] = '\0'; + } + str[c1] = '\0'; + + if (c == '.' && *p == ']' && str[0] != '\0') + { + /* If we have no collation data we use the default + collation in which each character is the name + for its own class which contains only the one + character. It also means that ASCII is the + character set and therefore we cannot have character + with more than one byte in the multibyte + representation. */ +# ifdef _LIBC + if (nrules == 0) +# endif + { + if (c1 != 1) + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Set the bit for the character. */ + SET_LIST_BIT (str[0]); + range_start = ((const unsigned char *) str)[0]; + } +# ifdef _LIBC + else + { + /* Try to match the byte sequence in `str' against + those known to the collate implementation. + First find out whether the bytes in `str' are + actually from exactly one character. */ + int32_t table_size; + const int32_t *symb_table; + const unsigned char *extra; + int32_t idx; + int32_t elem; + int32_t second; + int32_t hash; + + 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; + second = hash % (table_size - 2); + while (symb_table[2 * elem] != 0) + { + /* 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; + } + + if (symb_table[2 * elem] == 0) + /* This is no valid character. */ + FREE_STACK_RETURN (REG_ECOLLATE); + + /* Throw away the ] at the end of the equivalence + class. */ + PATFETCH (c); + + /* Now add the multibyte character(s) we found + to the accept list. + + XXX Note that this is not entirely correct. + we would have to match multibyte sequences + but this is not possible with the current + implementation. Also, we have to match + collating symbols, which expand to more than + one file, as a whole and not allow the + individual bytes. */ + c1 = extra[idx++]; + if (c1 == 1) + range_start = extra[idx]; + while (c1-- > 0) + { + SET_LIST_BIT (extra[idx]); + ++idx; + } + } +# endif + had_char_class = false; + } + else + { + c1++; + while (c1--) + PATUNFETCH; + SET_LIST_BIT ('['); + SET_LIST_BIT ('.'); + range_start = '.'; + had_char_class = false; + } + } + else + { + had_char_class = false; + SET_LIST_BIT (c); + range_start = c; + } + } + + /* Discard any (non)matching list bytes that are all 0 at the + end of the map. Decrease the map-length byte too. */ + while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) + b[-1]--; + b += b[-1]; +#endif /* WCHAR */ + } + break; + + + case '(': + if (syntax & RE_NO_BK_PARENS) + goto handle_open; + else + goto normal_char; + + + case ')': + if (syntax & RE_NO_BK_PARENS) + goto handle_close; + else + goto normal_char; + + + case '\n': + if (syntax & RE_NEWLINE_ALT) + goto handle_alt; + else + goto normal_char; + + + case '|': + if (syntax & RE_NO_BK_VBAR) + goto handle_alt; + else + goto normal_char; + + + case '{': + if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) + goto handle_interval; + else + goto normal_char; + + + case '\\': + if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); + + /* Do not translate the character after the \, so that we can + distinguish, e.g., \B from \b, even if we normally would + translate, e.g., B to b. */ + PATFETCH_RAW (c); + + switch (c) + { + case '(': + if (syntax & RE_NO_BK_PARENS) + goto normal_backslash; + + handle_open: + bufp->re_nsub++; + regnum++; + + if (COMPILE_STACK_FULL) + { + RETALLOC (compile_stack.stack, compile_stack.size << 1, + compile_stack_elt_t); + if (compile_stack.stack == NULL) return REG_ESPACE; + + compile_stack.size <<= 1; + } + + /* These are the values to restore when we hit end of this + group. They are all relative offsets, so that if the + whole pattern moves because of realloc, they will still + be valid. */ + COMPILE_STACK_TOP.begalt_offset = begalt - COMPILED_BUFFER_VAR; + COMPILE_STACK_TOP.fixup_alt_jump + = fixup_alt_jump ? fixup_alt_jump - COMPILED_BUFFER_VAR + 1 : 0; + COMPILE_STACK_TOP.laststart_offset = b - COMPILED_BUFFER_VAR; + COMPILE_STACK_TOP.regnum = regnum; + + /* We will eventually replace the 0 with the number of + groups inner to this one. But do not push a + start_memory for groups beyond the last one we can + represent in the compiled pattern. */ + if (regnum <= MAX_REGNUM) + { + COMPILE_STACK_TOP.inner_group_offset = b + - COMPILED_BUFFER_VAR + 2; + BUF_PUSH_3 (start_memory, regnum, 0); + } + + compile_stack.avail++; + + fixup_alt_jump = 0; + laststart = 0; + begalt = b; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + break; + + + case ')': + if (syntax & RE_NO_BK_PARENS) goto normal_backslash; + + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_backslash; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + handle_close: + if (fixup_alt_jump) + { /* Push a dummy failure point at the end of the + alternative for a possible future + `pop_failure_jump' to pop. See comments at + `push_dummy_failure' in `re_match_2'. */ + BUF_PUSH (push_dummy_failure); + + /* We allocated space for this jump when we assigned + to `fixup_alt_jump', in the `handle_alt' case below. */ + STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); + } + + /* See similar code for backslashed left paren above. */ + if (COMPILE_STACK_EMPTY) + { + if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) + goto normal_char; + else + FREE_STACK_RETURN (REG_ERPAREN); + } + + /* Since we just checked for an empty stack above, this + ``can't happen''. */ + assert (compile_stack.avail != 0); + { + /* We don't just want to restore into `regnum', because + later groups should continue to be numbered higher, + as in `(ab)c(de)' -- the second group is #2. */ + regnum_t this_group_regnum; + + compile_stack.avail--; + begalt = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.begalt_offset; + fixup_alt_jump + = COMPILE_STACK_TOP.fixup_alt_jump + ? COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.fixup_alt_jump - 1 + : 0; + laststart = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.laststart_offset; + this_group_regnum = COMPILE_STACK_TOP.regnum; + /* If we've reached MAX_REGNUM groups, then this open + won't actually generate any code, so we'll have to + clear pending_exact explicitly. */ + pending_exact = 0; + + /* We're at the end of the group, so now we know how many + groups were inside this one. */ + if (this_group_regnum <= MAX_REGNUM) + { + UCHAR_T *inner_group_loc + = COMPILED_BUFFER_VAR + COMPILE_STACK_TOP.inner_group_offset; + + *inner_group_loc = regnum - this_group_regnum; + BUF_PUSH_3 (stop_memory, this_group_regnum, + regnum - this_group_regnum); + } + } + break; + + + case '|': /* `\|'. */ + if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) + goto normal_backslash; + handle_alt: + if (syntax & RE_LIMITED_OPS) + goto normal_char; + + /* Insert before the previous alternative a jump which + jumps to this alternative if the former fails. */ + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (on_failure_jump, begalt, + b + 2 + 2 * OFFSET_ADDRESS_SIZE); + pending_exact = 0; + b += 1 + OFFSET_ADDRESS_SIZE; + + /* The alternative before this one has a jump after it + which gets executed if it gets matched. Adjust that + jump so it will jump to this alternative's analogous + jump (put in below, which in turn will jump to the next + (if any) alternative's such jump, etc.). The last such + jump jumps to the correct final destination. A picture: + _____ _____ + | | | | + | v | v + a | b | c + + If we are at `b', then fixup_alt_jump right now points to a + three-byte space after `a'. We'll put in the jump, set + fixup_alt_jump to right after `b', and leave behind three + bytes which we'll fill in when we get to after `c'. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + /* Mark and leave space for a jump after this alternative, + to be filled in later either by next alternative or + when know we're at the end of a series of alternatives. */ + fixup_alt_jump = b; + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + + laststart = 0; + begalt = b; + break; + + + case '{': + /* If \{ is a literal. */ + if (!(syntax & RE_INTERVALS) + /* If we're at `\{' and it's not the open-interval + operator. */ + || (syntax & RE_NO_BK_BRACES)) + goto normal_backslash; + + handle_interval: + { + /* If got here, then the syntax allows intervals. */ + + /* At least (most) this many matches must be made. */ + int lower_bound = -1, upper_bound = -1; + + /* Place in the uncompiled pattern (i.e., just after + the '{') to go back to if the interval is invalid. */ + const CHAR_T *beg_interval = p; + + if (p == pend) + goto invalid_interval; + + GET_UNSIGNED_NUMBER (lower_bound); + + if (c == ',') + { + GET_UNSIGNED_NUMBER (upper_bound); + if (upper_bound < 0) + upper_bound = RE_DUP_MAX; + } + else + /* Interval such as `{1}' => match exactly once. */ + upper_bound = lower_bound; + + if (! (0 <= lower_bound && lower_bound <= upper_bound)) + goto invalid_interval; + + if (!(syntax & RE_NO_BK_BRACES)) + { + if (c != '\\' || p == pend) + goto invalid_interval; + PATFETCH (c); + } + + if (c != '}') + goto invalid_interval; + + /* If it's invalid to have no preceding re. */ + if (!laststart) + { + if (syntax & RE_CONTEXT_INVALID_OPS + && !(syntax & RE_INVALID_INTERVAL_ORD)) + FREE_STACK_RETURN (REG_BADRPT); + else if (syntax & RE_CONTEXT_INDEP_OPS) + laststart = b; + else + goto unfetch_interval; + } + + /* We just parsed a valid interval. */ + + if (RE_DUP_MAX < upper_bound) + FREE_STACK_RETURN (REG_BADBR); + + /* If the upper bound is zero, don't want to succeed at + all; jump from `laststart' to `b + 3', which will be + the end of the buffer after we insert the jump. */ + /* ifdef WCHAR, 'b + 1 + OFFSET_ADDRESS_SIZE' + instead of 'b + 3'. */ + if (upper_bound == 0) + { + GET_BUFFER_SPACE (1 + OFFSET_ADDRESS_SIZE); + INSERT_JUMP (jump, laststart, b + 1 + + OFFSET_ADDRESS_SIZE); + b += 1 + OFFSET_ADDRESS_SIZE; + } + + /* Otherwise, we have a nontrivial interval. When + we're all done, the pattern will look like: + set_number_at <jump count> <upper bound> + set_number_at <succeed_n count> <lower bound> + succeed_n <after jump addr> <succeed_n count> + <body of loop> + jump_n <succeed_n addr> <jump count> + (The upper bound and `jump_n' are omitted if + `upper_bound' is 1, though.) */ + else + { /* If the upper bound is > 1, we need to insert + more at the end of the loop. */ + unsigned nbytes = 2 + 4 * OFFSET_ADDRESS_SIZE + + (upper_bound > 1) * (2 + 4 * OFFSET_ADDRESS_SIZE); + + GET_BUFFER_SPACE (nbytes); + + /* Initialize lower bound of the `succeed_n', even + though it will be set during matching by its + attendant `set_number_at' (inserted next), + because `re_compile_fastmap' needs to know. + Jump to the `jump_n' we might insert below. */ + INSERT_JUMP2 (succeed_n, laststart, + b + 1 + 2 * OFFSET_ADDRESS_SIZE + + (upper_bound > 1) * (1 + 2 * OFFSET_ADDRESS_SIZE) + , lower_bound); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + /* Code to initialize the lower bound. Insert + before the `succeed_n'. The `5' is the last two + bytes of this `set_number_at', plus 3 bytes of + the following `succeed_n'. */ + /* ifdef WCHAR, The '1+2*OFFSET_ADDRESS_SIZE' + is the 'set_number_at', plus '1+OFFSET_ADDRESS_SIZE' + of the following `succeed_n'. */ + PREFIX(insert_op2) (set_number_at, laststart, 1 + + 2 * OFFSET_ADDRESS_SIZE, lower_bound, b); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + if (upper_bound > 1) + { /* More than one repetition is allowed, so + append a backward jump to the `succeed_n' + that starts this interval. + + When we've reached this during matching, + we'll have matched the interval once, so + jump back only `upper_bound - 1' times. */ + STORE_JUMP2 (jump_n, b, laststart + + 2 * OFFSET_ADDRESS_SIZE + 1, + upper_bound - 1); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + + /* The location we want to set is the second + parameter of the `jump_n'; that is `b-2' as + an absolute address. `laststart' will be + the `set_number_at' we're about to insert; + `laststart+3' the number to set, the source + for the relative address. But we are + inserting into the middle of the pattern -- + so everything is getting moved up by 5. + Conclusion: (b - 2) - (laststart + 3) + 5, + i.e., b - laststart. + + We insert this at the beginning of the loop + so that if we fail during matching, we'll + reinitialize the bounds. */ + PREFIX(insert_op2) (set_number_at, laststart, + b - laststart, + upper_bound - 1, b); + b += 1 + 2 * OFFSET_ADDRESS_SIZE; + } + } + pending_exact = 0; + break; + + invalid_interval: + if (!(syntax & RE_INVALID_INTERVAL_ORD)) + FREE_STACK_RETURN (p == pend ? REG_EBRACE : REG_BADBR); + unfetch_interval: + /* Match the characters as literals. */ + p = beg_interval; + c = '{'; + if (syntax & RE_NO_BK_BRACES) + goto normal_char; + else + goto normal_backslash; + } + +#ifdef emacs + /* There is no way to specify the before_dot and after_dot + operators. rms says this is ok. --karl */ + case '=': + BUF_PUSH (at_dot); + break; + + case 's': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); + break; + + case 'S': + laststart = b; + PATFETCH (c); + BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); + break; +#endif /* emacs */ + + + case 'w': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (wordchar); + break; + + + case 'W': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + laststart = b; + BUF_PUSH (notwordchar); + break; + + + case '<': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbeg); + break; + + case '>': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordend); + break; + + case 'b': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (wordbound); + break; + + case 'B': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (notwordbound); + break; + + case '`': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (begbuf); + break; + + case '\'': + if (syntax & RE_NO_GNU_OPS) + goto normal_char; + BUF_PUSH (endbuf); + 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) + goto normal_char; + + c1 = c - '0'; + + if (c1 > regnum) + FREE_STACK_RETURN (REG_ESUBREG); + + /* Can't back reference to a subexpression if inside of it. */ + if (group_in_compile_stack (compile_stack, (regnum_t) c1)) + goto normal_char; + + laststart = b; + BUF_PUSH_2 (duplicate, c1); + break; + + + case '+': + case '?': + if (syntax & RE_BK_PLUS_QM) + goto handle_plus; + else + goto normal_backslash; + + default: + normal_backslash: + /* You might think it would be useful for \ to mean + not to translate; but if we don't translate it + it will never match anything. */ + c = TRANSLATE (c); + goto normal_char; + } + break; + + + default: + /* Expects the character in `c'. */ + normal_char: + /* If no exactn currently being built. */ + if (!pending_exact +#ifdef WCHAR + /* If last exactn handle binary(or character) and + new exactn handle character(or binary). */ + || is_exactn_bin != is_binary[p - 1 - pattern] +#endif /* WCHAR */ + + /* If last exactn not at current position. */ + || pending_exact + *pending_exact + 1 != b + + /* We have only one byte following the exactn for the count. */ + || *pending_exact == (1 << BYTEWIDTH) - 1 + + /* If followed by a repetition operator. */ + || *p == '*' || *p == '^' + || ((syntax & RE_BK_PLUS_QM) + ? *p == '\\' && (p[1] == '+' || p[1] == '?') + : (*p == '+' || *p == '?')) + || ((syntax & RE_INTERVALS) + && ((syntax & RE_NO_BK_BRACES) + ? *p == '{' + : (p[0] == '\\' && p[1] == '{')))) + { + /* Start building a new exactn. */ + + laststart = b; + +#ifdef WCHAR + /* Is this exactn binary data or character? */ + is_exactn_bin = is_binary[p - 1 - pattern]; + if (is_exactn_bin) + BUF_PUSH_2 (exactn_bin, 0); + else + BUF_PUSH_2 (exactn, 0); +#else + BUF_PUSH_2 (exactn, 0); +#endif /* WCHAR */ + pending_exact = b - 1; + } + + BUF_PUSH (c); + (*pending_exact)++; + break; + } /* switch (c) */ + } /* while p != pend */ + + + /* Through the pattern now. */ + + if (fixup_alt_jump) + STORE_JUMP (jump_past_alt, fixup_alt_jump, b); + + if (!COMPILE_STACK_EMPTY) + FREE_STACK_RETURN (REG_EPAREN); + + /* If we don't want backtracking, force success + the first time we reach the end of the compiled pattern. */ + if (syntax & RE_NO_POSIX_BACKTRACKING) + BUF_PUSH (succeed); + +#ifdef WCHAR + free (pattern); + free (mbs_offset); + free (is_binary); +#endif + free (compile_stack.stack); + + /* We have succeeded; set the length of the buffer. */ +#ifdef WCHAR + bufp->used = (uintptr_t) b - (uintptr_t) COMPILED_BUFFER_VAR; +#else + bufp->used = b - bufp->buffer; +#endif + +#ifdef DEBUG + if (debug) + { + DEBUG_PRINT1 ("\nCompiled pattern: \n"); + PREFIX(print_compiled_pattern) (bufp); + } +#endif /* DEBUG */ + +#ifndef MATCH_MAY_ALLOCATE + /* Initialize the failure stack to the largest possible stack. This + isn't necessary unless we're trying to avoid calling alloca in + the search and match routines. */ + { + int num_regs = bufp->re_nsub + 1; + + /* Since DOUBLE_FAIL_STACK refuses to double only if the current size + is strictly greater than re_max_failures, the largest possible stack + is 2 * re_max_failures failure points. */ + if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) + { + fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); + +# ifdef emacs + if (! fail_stack.stack) + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) xmalloc (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t))); + else + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) xrealloc (fail_stack.stack, + (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t)))); +# else /* not emacs */ + if (! fail_stack.stack) + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) malloc (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t))); + else + fail_stack.stack + = (PREFIX(fail_stack_elt_t) *) realloc (fail_stack.stack, + (fail_stack.size + * sizeof (PREFIX(fail_stack_elt_t)))); +# endif /* not emacs */ + } + + PREFIX(regex_grow_registers) (num_regs); + } +#endif /* not MATCH_MAY_ALLOCATE */ + + return REG_NOERROR; +} /* regex_compile */ + +/* Subroutines for `regex_compile'. */ + +/* Store OP at LOC followed by two-byte integer parameter ARG. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(store_op1) (op, loc, arg) + re_opcode_t op; + UCHAR_T *loc; + int arg; +{ + *loc = (UCHAR_T) op; + STORE_NUMBER (loc + 1, arg); +} + + +/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(store_op2) (op, loc, arg1, arg2) + re_opcode_t op; + UCHAR_T *loc; + int arg1, arg2; +{ + *loc = (UCHAR_T) op; + STORE_NUMBER (loc + 1, arg1); + STORE_NUMBER (loc + 1 + OFFSET_ADDRESS_SIZE, arg2); +} + + +/* Copy the bytes from LOC to END to open up three bytes of space at LOC + for OP followed by two-byte integer parameter ARG. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(insert_op1) (op, loc, arg, end) + re_opcode_t op; + UCHAR_T *loc; + int arg; + UCHAR_T *end; +{ + register UCHAR_T *pfrom = end; + register UCHAR_T *pto = end + 1 + OFFSET_ADDRESS_SIZE; + + while (pfrom != loc) + *--pto = *--pfrom; + + PREFIX(store_op1) (op, loc, arg); +} + + +/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ +/* ifdef WCHAR, integer parameter is 1 wchar_t. */ + +static void +PREFIX(insert_op2) (op, loc, arg1, arg2, end) + re_opcode_t op; + UCHAR_T *loc; + int arg1, arg2; + UCHAR_T *end; +{ + register UCHAR_T *pfrom = end; + register UCHAR_T *pto = end + 1 + 2 * OFFSET_ADDRESS_SIZE; + + while (pfrom != loc) + *--pto = *--pfrom; + + PREFIX(store_op2) (op, loc, arg1, arg2); +} + + +/* P points to just after a ^ in PATTERN. Return true if that ^ comes + after an alternative or a begin-subexpression. We assume there is at + least one character before the ^. */ + +static boolean +PREFIX(at_begline_loc_p) (pattern, p, syntax) + const CHAR_T *pattern, *p; + reg_syntax_t syntax; +{ + const CHAR_T *prev = p - 2; + boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; + + return + /* After a subexpression? */ + (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) + /* After an alternative? */ + || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); +} + + +/* The dual of at_begline_loc_p. This one is for $. We assume there is + at least one character after the $, i.e., `P < PEND'. */ + +static boolean +PREFIX(at_endline_loc_p) (p, pend, syntax) + const CHAR_T *p, *pend; + reg_syntax_t syntax; +{ + const CHAR_T *next = p; + boolean next_backslash = *next == '\\'; + const CHAR_T *next_next = p + 1 < pend ? p + 1 : 0; + + return + /* Before a subexpression? */ + (syntax & RE_NO_BK_PARENS ? *next == ')' + : next_backslash && next_next && *next_next == ')') + /* Before an alternative? */ + || (syntax & RE_NO_BK_VBAR ? *next == '|' + : next_backslash && next_next && *next_next == '|'); +} + +#else /* not INSIDE_RECURSION */ + +/* Returns true if REGNUM is in one of COMPILE_STACK's elements and + false if it's not. */ + +static boolean +group_in_compile_stack (compile_stack, regnum) + compile_stack_type compile_stack; + regnum_t regnum; +{ + int this_element; + + for (this_element = compile_stack.avail - 1; + this_element >= 0; + this_element--) + if (compile_stack.stack[this_element].regnum == regnum) + return true; + + return false; +} +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef WCHAR +/* This insert space, which size is "num", into the pattern at "loc". + "end" must point the end of the allocated buffer. */ +static void +insert_space (num, loc, end) + int num; + CHAR_T *loc; + CHAR_T *end; +{ + register CHAR_T *pto = end; + register CHAR_T *pfrom = end - num; + + while (pfrom >= loc) + *pto-- = *pfrom--; +} +#endif /* WCHAR */ + +#ifdef WCHAR +static reg_errcode_t +wcs_compile_range (range_start_char, p_ptr, pend, translate, syntax, b, + char_set) + CHAR_T range_start_char; + const CHAR_T **p_ptr, *pend; + CHAR_T *char_set, *b; + RE_TRANSLATE_TYPE translate; + reg_syntax_t syntax; +{ + const CHAR_T *p = *p_ptr; + CHAR_T range_start, range_end; + reg_errcode_t ret; +# ifdef _LIBC + uint32_t nrules; + uint32_t start_val, end_val; +# endif + if (p == pend) + return REG_ERANGE; + +# ifdef _LIBC + nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); + if (nrules != 0) + { + const char *collseq = (const char *) _NL_CURRENT(LC_COLLATE, + _NL_COLLATE_COLLSEQWC); + const unsigned char *extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); + + if (range_start_char < -1) + { + /* range_start is a collating symbol. */ + int32_t *wextra; + /* Retreive the index and get collation sequence value. */ + wextra = (int32_t*)(extra + char_set[-range_start_char]); + start_val = wextra[1 + *wextra]; + } + else + start_val = collseq_table_lookup(collseq, TRANSLATE(range_start_char)); + + end_val = collseq_table_lookup (collseq, TRANSLATE (p[0])); + + /* Report an error if the range is empty and the syntax prohibits + this. */ + ret = ((syntax & RE_NO_EMPTY_RANGES) + && (start_val > end_val))? REG_ERANGE : REG_NOERROR; + + /* Insert space to the end of the char_ranges. */ + insert_space(2, b - char_set[5] - 2, b - 1); + *(b - char_set[5] - 2) = (wchar_t)start_val; + *(b - char_set[5] - 1) = (wchar_t)end_val; + char_set[4]++; /* ranges_index */ + } + else +# endif + { + range_start = (range_start_char >= 0)? TRANSLATE (range_start_char): + range_start_char; + range_end = TRANSLATE (p[0]); + /* Report an error if the range is empty and the syntax prohibits + this. */ + ret = ((syntax & RE_NO_EMPTY_RANGES) + && (range_start > range_end))? REG_ERANGE : REG_NOERROR; + + /* Insert space to the end of the char_ranges. */ + insert_space(2, b - char_set[5] - 2, b - 1); + *(b - char_set[5] - 2) = range_start; + *(b - char_set[5] - 1) = range_end; + char_set[4]++; /* ranges_index */ + } + /* Have to increment the pointer into the pattern string, so the + caller isn't still at the ending character. */ + (*p_ptr)++; + + return ret; +} +#else /* BYTE */ +/* Read the ending character of a range (in a bracket expression) from the + uncompiled pattern *P_PTR (which ends at PEND). We assume the + starting character is in `P[-2]'. (`P[-1]' is the character `-'.) + Then we set the translation of all bits between the starting and + ending characters (inclusive) in the compiled pattern B. + + Return an error code. + + We use these short variable names so we can use the same macros as + `regex_compile' itself. */ + +static reg_errcode_t +byte_compile_range (range_start_char, p_ptr, pend, translate, syntax, b) + unsigned int range_start_char; + const char **p_ptr, *pend; + RE_TRANSLATE_TYPE translate; + reg_syntax_t syntax; + unsigned char *b; +{ + unsigned this_char; + const char *p = *p_ptr; + reg_errcode_t ret; +# if _LIBC + const unsigned char *collseq; + unsigned int start_colseq; + unsigned int end_colseq; +# else + unsigned end_char; +# endif + + if (p == pend) + return REG_ERANGE; + + /* Have to increment the pointer into the pattern string, so the + caller isn't still at the ending character. */ + (*p_ptr)++; + + /* Report an error if the range is empty and the syntax prohibits this. */ + ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; + +# if _LIBC + collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE, + _NL_COLLATE_COLLSEQMB); + + start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)]; + end_colseq = collseq[(unsigned char) TRANSLATE (p[0])]; + for (this_char = 0; this_char <= (unsigned char) -1; ++this_char) + { + unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)]; + + if (start_colseq <= this_colseq && this_colseq <= end_colseq) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } + } +# else + /* Here we see why `this_char' has to be larger than an `unsigned + char' -- we would otherwise go into an infinite loop, since all + characters <= 0xff. */ + range_start_char = TRANSLATE (range_start_char); + /* TRANSLATE(p[0]) is casted to char (not unsigned char) in TRANSLATE, + and some compilers cast it to int implicitly, so following for_loop + may fall to (almost) infinite loop. + e.g. If translate[p[0]] = 0xff, end_char may equals to 0xffffffff. + To avoid this, we cast p[0] to unsigned int and truncate it. */ + end_char = ((unsigned)TRANSLATE(p[0]) & ((1 << BYTEWIDTH) - 1)); + + for (this_char = range_start_char; this_char <= end_char; ++this_char) + { + SET_LIST_BIT (TRANSLATE (this_char)); + ret = REG_NOERROR; + } +# endif + + return ret; +} +#endif /* WCHAR */ + +/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in + BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible + characters can start a string that matches the pattern. This fastmap + is used by re_search to skip quickly over impossible starting points. + + The caller must supply the address of a (1 << BYTEWIDTH)-byte data + area as BUFP->fastmap. + + We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in + the pattern buffer. + + Returns 0 if we succeed, -2 if an internal error. */ + +#ifdef WCHAR +/* local function for re_compile_fastmap. + truncate wchar_t character to char. */ +static unsigned char truncate_wchar (CHAR_T c); + +static unsigned char +truncate_wchar (c) + CHAR_T c; +{ + unsigned char buf[MB_CUR_MAX]; + mbstate_t state; + int retval; + memset (&state, '\0', sizeof (state)); + retval = wcrtomb (buf, c, &state); + return retval > 0 ? buf[0] : (unsigned char) c; +} +#endif /* WCHAR */ + +static int +PREFIX(re_compile_fastmap) (bufp) + struct re_pattern_buffer *bufp; +{ + int j, k; +#ifdef MATCH_MAY_ALLOCATE + PREFIX(fail_stack_type) fail_stack; +#endif +#ifndef REGEX_MALLOC + char *destination; +#endif + + register char *fastmap = bufp->fastmap; + +#ifdef WCHAR + /* We need to cast pattern to (wchar_t*), because we casted this compiled + pattern to (char*) in regex_compile. */ + UCHAR_T *pattern = (UCHAR_T*)bufp->buffer; + register UCHAR_T *pend = (UCHAR_T*) (bufp->buffer + bufp->used); +#else /* BYTE */ + UCHAR_T *pattern = bufp->buffer; + register UCHAR_T *pend = pattern + bufp->used; +#endif /* WCHAR */ + UCHAR_T *p = pattern; + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* Assume that each path through the pattern can be null until + proven otherwise. We set this false at the bottom of switch + statement, to which we get only if a particular path doesn't + match the empty string. */ + boolean path_can_be_null = true; + + /* We aren't doing a `succeed_n' to begin with. */ + boolean succeed_n_p = false; + + assert (fastmap != NULL && p != NULL); + + INIT_FAIL_STACK (); + bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ + bufp->fastmap_accurate = 1; /* It will be when we're done. */ + bufp->can_be_null = 0; + + while (1) + { + if (p == pend || *p == succeed) + { + /* We have reached the (effective) end of pattern. */ + if (!FAIL_STACK_EMPTY ()) + { + bufp->can_be_null |= path_can_be_null; + + /* Reset for next path. */ + path_can_be_null = true; + + p = fail_stack.stack[--fail_stack.avail].pointer; + + continue; + } + else + break; + } + + /* We should never be about to go beyond the end of the pattern. */ + assert (p < pend); + + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { + + /* I guess the idea here is to simply not bother with a fastmap + if a backreference is used, since it's too hard to figure out + the fastmap for the corresponding group. Setting + `can_be_null' stops `re_search_2' from using the fastmap, so + that is all we do. */ + case duplicate: + bufp->can_be_null = 1; + goto done; + + + /* Following are the cases which match a character. These end + with `break'. */ + +#ifdef WCHAR + case exactn: + fastmap[truncate_wchar(p[1])] = 1; + break; +#else /* BYTE */ + case exactn: + fastmap[p[1]] = 1; + break; +#endif /* WCHAR */ +#ifdef MBS_SUPPORT + case exactn_bin: + fastmap[p[1]] = 1; + break; +#endif + +#ifdef WCHAR + /* It is hard to distinguish fastmap from (multi byte) characters + which depends on current locale. */ + case charset: + case charset_not: + case wordchar: + case notwordchar: + bufp->can_be_null = 1; + goto done; +#else /* BYTE */ + case charset: + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) + fastmap[j] = 1; + break; + + + case charset_not: + /* Chars beyond end of map must be allowed. */ + for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) + if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) + fastmap[j] = 1; + break; + + + case wordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == Sword) + fastmap[j] = 1; + break; + + + case notwordchar: + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != Sword) + fastmap[j] = 1; + break; +#endif /* WCHAR */ + + case anychar: + { + int fastmap_newline = fastmap['\n']; + + /* `.' matches anything ... */ + for (j = 0; j < (1 << BYTEWIDTH); j++) + fastmap[j] = 1; + + /* ... except perhaps newline. */ + if (!(bufp->syntax & RE_DOT_NEWLINE)) + fastmap['\n'] = fastmap_newline; + + /* Return if we have already set `can_be_null'; if we have, + then the fastmap is irrelevant. Something's wrong here. */ + else if (bufp->can_be_null) + goto done; + + /* Otherwise, have to check alternative paths. */ + break; + } + +#ifdef emacs + case syntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) == (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + case notsyntaxspec: + k = *p++; + for (j = 0; j < (1 << BYTEWIDTH); j++) + if (SYNTAX (j) != (enum syntaxcode) k) + fastmap[j] = 1; + break; + + + /* All cases after this match the empty string. These end with + `continue'. */ + + + case before_dot: + case at_dot: + case after_dot: + continue; +#endif /* emacs */ + + + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbound: + case notwordbound: + case wordbeg: + case wordend: + case push_dummy_failure: + continue; + + + case jump_n: + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case jump_past_alt: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + if (j > 0) + continue; + + /* Jump backward implies we just went through the body of a + loop and matched nothing. Opcode jumped to should be + `on_failure_jump' or `succeed_n'. Just treat it like an + ordinary jump. For a * loop, it has pushed its failure + point already; if so, discard that as redundant. */ + if ((re_opcode_t) *p != on_failure_jump + && (re_opcode_t) *p != succeed_n) + continue; + + p++; + EXTRACT_NUMBER_AND_INCR (j, p); + p += j; + + /* If what's on the stack is where we are now, pop it. */ + if (!FAIL_STACK_EMPTY () + && fail_stack.stack[fail_stack.avail - 1].pointer == p) + fail_stack.avail--; + + continue; + + + case on_failure_jump: + case on_failure_keep_string_jump: + handle_on_failure_jump: + EXTRACT_NUMBER_AND_INCR (j, p); + + /* For some patterns, e.g., `(a?)?', `p+j' here points to the + end of the pattern. We don't want to push such a point, + since when we restore it above, entering the switch will + increment `p' past the end of the pattern. We don't need + to push such a point since we obviously won't find any more + fastmap entries beyond `pend'. Such a pattern can match + the null string, though. */ + if (p + j < pend) + { + if (!PUSH_PATTERN_OP (p + j, fail_stack)) + { + RESET_FAIL_STACK (); + return -2; + } + } + else + bufp->can_be_null = 1; + + if (succeed_n_p) + { + EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ + succeed_n_p = false; + } + + continue; + + + case succeed_n: + /* Get to the number of times to succeed. */ + p += OFFSET_ADDRESS_SIZE; + + /* Increment p past the n for when k != 0. */ + EXTRACT_NUMBER_AND_INCR (k, p); + if (k == 0) + { + p -= 2 * OFFSET_ADDRESS_SIZE; + succeed_n_p = true; /* Spaghetti code alert. */ + goto handle_on_failure_jump; + } + continue; + + + case set_number_at: + p += 2 * OFFSET_ADDRESS_SIZE; + continue; + + + case start_memory: + case stop_memory: + p += 2; + continue; + + + default: + abort (); /* We have listed all the cases. */ + } /* switch *p++ */ + + /* Getting here means we have found the possible starting + characters for one path of the pattern -- and that the empty + string does not match. We need not follow this path further. + Instead, look at the next alternative (remembered on the + stack), or quit if no more. The test at the top of the loop + does these things. */ + path_can_be_null = false; + p = pend; + } /* while p */ + + /* Set `can_be_null' for the last path (also the first path, if the + pattern is empty). */ + bufp->can_be_null |= path_can_be_null; + + done: + RESET_FAIL_STACK (); + return 0; +} + +#else /* not INSIDE_RECURSION */ + +int +re_compile_fastmap (bufp) + struct re_pattern_buffer *bufp; +{ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + return wcs_re_compile_fastmap(bufp); + else +# endif + return byte_re_compile_fastmap(bufp); +} /* re_compile_fastmap */ +#ifdef _LIBC +weak_alias (__re_compile_fastmap, re_compile_fastmap) +#endif + + +/* 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; + unsigned 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 = (regoff_t *) 0; + } +} +#ifdef _LIBC +weak_alias (__re_set_registers, re_set_registers) +#endif + +/* Searching routines. */ + +/* Like re_search_2, below, but only one string is specified, and + doesn't let you say where to stop matching. */ + +int +re_search (bufp, string, size, startpos, range, regs) + struct re_pattern_buffer *bufp; + const char *string; + int size, startpos, range; + struct re_registers *regs; +{ + return re_search_2 (bufp, NULL, 0, string, size, startpos, range, + regs, size); +} +#ifdef _LIBC +weak_alias (__re_search, re_search) +#endif + + +/* Using the compiled pattern in BUFP->buffer, first tries to match the + virtual concatenation of STRING1 and STRING2, starting first at index + STARTPOS, then at STARTPOS + 1, and so on. + + STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. + + RANGE is how far to scan while trying to match. RANGE = 0 means try + only at STARTPOS; in general, the last start tried is STARTPOS + + RANGE. + + In REGS, return the indices of the virtual concatenation of STRING1 + and STRING2 that matched the entire BUFP->buffer and its contained + subexpressions. + + Do not consider matching one past the index STOP in the virtual + concatenation of STRING1 and STRING2. + + We return either the position in the strings at which the match was + found, -1 if no match, or -2 if error (such as failure + stack overflow). */ + +int +re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int startpos; + int range; + struct re_registers *regs; + int stop; +{ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + return wcs_re_search_2 (bufp, string1, size1, string2, size2, startpos, + range, regs, stop); + else +# endif + return byte_re_search_2 (bufp, string1, size1, string2, size2, startpos, + range, regs, stop); +} /* re_search_2 */ +#ifdef _LIBC +weak_alias (__re_search_2, re_search_2) +#endif + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef MATCH_MAY_ALLOCATE +# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL +#else +# define FREE_VAR(var) if (var) free (var); var = NULL +#endif + +#ifdef WCHAR +# define MAX_ALLOCA_SIZE 2000 + +# define FREE_WCS_BUFFERS() \ + do { \ + if (size1 > MAX_ALLOCA_SIZE) \ + { \ + free (wcs_string1); \ + free (mbs_offset1); \ + } \ + else \ + { \ + FREE_VAR (wcs_string1); \ + FREE_VAR (mbs_offset1); \ + } \ + if (size2 > MAX_ALLOCA_SIZE) \ + { \ + free (wcs_string2); \ + free (mbs_offset2); \ + } \ + else \ + { \ + FREE_VAR (wcs_string2); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) + +#endif + + +static int +PREFIX(re_search_2) (bufp, string1, size1, string2, size2, startpos, range, + regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int startpos; + int range; + struct re_registers *regs; + int stop; +{ + int val; + register char *fastmap = bufp->fastmap; + register RE_TRANSLATE_TYPE translate = bufp->translate; + int total_size = size1 + size2; + int endpos = startpos + range; +#ifdef WCHAR + /* We need wchar_t* buffers correspond to cstring1, cstring2. */ + wchar_t *wcs_string1 = NULL, *wcs_string2 = NULL; + /* We need the size of wchar_t buffers correspond to csize1, csize2. */ + int wcs_size1 = 0, wcs_size2 = 0; + /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ + int *mbs_offset1 = NULL, *mbs_offset2 = NULL; + /* They hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; +#endif /* WCHAR */ + + /* Check for out-of-range STARTPOS. */ + if (startpos < 0 || startpos > total_size) + return -1; + + /* Fix up RANGE if it might eventually take us outside + the virtual concatenation of STRING1 and STRING2. + Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ + if (endpos < 0) + range = 0 - startpos; + else if (endpos > total_size) + range = total_size - startpos; + + /* If the search isn't to be a backwards one, don't waste time in a + search for a pattern that must be anchored. */ + if (bufp->used > 0 && range > 0 + && ((re_opcode_t) bufp->buffer[0] == begbuf + /* `begline' is like `begbuf' if it cannot match at newlines. */ + || ((re_opcode_t) bufp->buffer[0] == begline + && !bufp->newline_anchor))) + { + if (startpos > 0) + return -1; + else + range = 1; + } + +#ifdef emacs + /* In a forward search for something that starts with \=. + don't keep searching past point. */ + if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) + { + range = PT - startpos; + if (range <= 0) + return -1; + } +#endif /* emacs */ + + /* Update the fastmap now if not correct already. */ + if (fastmap && !bufp->fastmap_accurate) + if (re_compile_fastmap (bufp) == -2) + return -2; + +#ifdef WCHAR + /* Allocate wchar_t array for wcs_string1 and wcs_string2 and + fill them with converted string. */ + if (size1 != 0) + { + if (size1 > MAX_ALLOCA_SIZE) + { + wcs_string1 = TALLOC (size1 + 1, CHAR_T); + mbs_offset1 = TALLOC (size1 + 1, int); + is_binary = TALLOC (size1 + 1, char); + } + else + { + wcs_string1 = REGEX_TALLOC (size1 + 1, CHAR_T); + mbs_offset1 = REGEX_TALLOC (size1 + 1, int); + is_binary = REGEX_TALLOC (size1 + 1, char); + } + if (!wcs_string1 || !mbs_offset1 || !is_binary) + { + if (size1 > MAX_ALLOCA_SIZE) + { + free (wcs_string1); + free (mbs_offset1); + free (is_binary); + } + else + { + FREE_VAR (wcs_string1); + FREE_VAR (mbs_offset1); + FREE_VAR (is_binary); + } + return -2; + } + wcs_size1 = convert_mbs_to_wcs(wcs_string1, string1, size1, + mbs_offset1, is_binary); + wcs_string1[wcs_size1] = L'\0'; /* for a sentinel */ + if (size1 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + } + if (size2 != 0) + { + if (size2 > MAX_ALLOCA_SIZE) + { + wcs_string2 = TALLOC (size2 + 1, CHAR_T); + mbs_offset2 = TALLOC (size2 + 1, int); + is_binary = TALLOC (size2 + 1, char); + } + else + { + wcs_string2 = REGEX_TALLOC (size2 + 1, CHAR_T); + mbs_offset2 = REGEX_TALLOC (size2 + 1, int); + is_binary = REGEX_TALLOC (size2 + 1, char); + } + if (!wcs_string2 || !mbs_offset2 || !is_binary) + { + FREE_WCS_BUFFERS (); + if (size2 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + return -2; + } + wcs_size2 = convert_mbs_to_wcs(wcs_string2, string2, size2, + mbs_offset2, is_binary); + wcs_string2[wcs_size2] = L'\0'; /* for a sentinel */ + if (size2 > MAX_ALLOCA_SIZE) + free (is_binary); + else + FREE_VAR (is_binary); + } +#endif /* WCHAR */ + + + /* Loop through the string, looking for a place to start matching. */ + for (;;) + { + /* If a fastmap is supplied, skip quickly over characters that + cannot be the start of a match. If the pattern can match the + null string, however, we don't need to skip characters; we want + the first null string. */ + if (fastmap && startpos < total_size && !bufp->can_be_null) + { + if (range > 0) /* Searching forwards. */ + { + register const char *d; + register int lim = 0; + int irange = range; + + if (startpos < size1 && startpos + range >= size1) + lim = range - (size1 - startpos); + + d = (startpos >= size1 ? string2 - size1 : string1) + startpos; + + /* Written out as an if-else to avoid testing `translate' + inside the loop. */ + if (translate) + while (range > lim + && !fastmap[(unsigned char) + translate[(unsigned char) *d++]]) + range--; + else + while (range > lim && !fastmap[(unsigned char) *d++]) + range--; + + startpos += irange - range; + } + else /* Searching backwards. */ + { + register CHAR_T c = (size1 == 0 || startpos >= size1 + ? string2[startpos - size1] + : string1[startpos]); + + if (!fastmap[(unsigned char) TRANSLATE (c)]) + goto advance; + } + } + + /* If can't match the null string, and that's all we have left, fail. */ + if (range >= 0 && startpos == total_size && fastmap + && !bufp->can_be_null) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -1; + } + +#ifdef WCHAR + val = wcs_re_match_2_internal (bufp, string1, size1, string2, + size2, startpos, regs, stop, + wcs_string1, wcs_size1, + wcs_string2, wcs_size2, + mbs_offset1, mbs_offset2); +#else /* BYTE */ + val = byte_re_match_2_internal (bufp, string1, size1, string2, + size2, startpos, regs, stop); +#endif /* BYTE */ + +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + + if (val >= 0) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return startpos; + } + + if (val == -2) + { +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -2; + } + + advance: + if (!range) + break; + else if (range > 0) + { + range--; + startpos++; + } + else + { + range++; + startpos--; + } + } +#ifdef WCHAR + FREE_WCS_BUFFERS (); +#endif + return -1; +} + +#ifdef WCHAR +/* This converts PTR, a pointer into one of the search wchar_t strings + `string1' and `string2' into an multibyte string offset from the + beginning of that string. We use mbs_offset to optimize. + See convert_mbs_to_wcs. */ +# define POINTER_TO_OFFSET(ptr) \ + (FIRST_STRING_P (ptr) \ + ? ((regoff_t)(mbs_offset1 != NULL? mbs_offset1[(ptr)-string1] : 0)) \ + : ((regoff_t)((mbs_offset2 != NULL? mbs_offset2[(ptr)-string2] : 0) \ + + csize1))) +#else /* BYTE */ +/* This converts PTR, a pointer into one of the search strings `string1' + and `string2' into an offset from the beginning of that string. */ +# define POINTER_TO_OFFSET(ptr) \ + (FIRST_STRING_P (ptr) \ + ? ((regoff_t) ((ptr) - string1)) \ + : ((regoff_t) ((ptr) - string2 + size1))) +#endif /* WCHAR */ + +/* Macros for dealing with the split strings in re_match_2. */ + +#define MATCHING_IN_FIRST_STRING (dend == end_match_1) + +/* Call before fetching a character with *d. This switches over to + string2 if necessary. */ +#define PREFETCH() \ + while (d == dend) \ + { \ + /* End of string2 => fail. */ \ + if (dend == end_match_2) \ + goto fail; \ + /* End of string1 => advance to string2. */ \ + d = string2; \ + dend = end_match_2; \ + } + +/* Test if at very beginning or at very end of the virtual concatenation + of `string1' and `string2'. If only one string, it's `string2'. */ +#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) +#define AT_STRINGS_END(d) ((d) == end2) + + +/* Test if D points to a character which is word-constituent. We have + two special cases to check for: if past the end of string1, look at + the first character in string2; and if before the beginning of + string2, look at the last character in string1. */ +#ifdef WCHAR +/* Use internationalized API instead of SYNTAX. */ +# define WORDCHAR_P(d) \ + (iswalnum ((wint_t)((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d))) != 0 \ + || ((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d)) == L'_') +#else /* BYTE */ +# define WORDCHAR_P(d) \ + (SYNTAX ((d) == end1 ? *string2 \ + : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ + == Sword) +#endif /* WCHAR */ + +/* Disabled due to a compiler bug -- see comment at case wordbound */ +#if 0 +/* Test if the character before D and the one at D differ with respect + to being word-constituent. */ +#define AT_WORD_BOUNDARY(d) \ + (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ + || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) +#endif + +/* Free everything we malloc. */ +#ifdef MATCH_MAY_ALLOCATE +# ifdef WCHAR +# define FREE_VARIABLES() \ + do { \ + REGEX_FREE_STACK (fail_stack.stack); \ + FREE_VAR (regstart); \ + FREE_VAR (regend); \ + FREE_VAR (old_regstart); \ + FREE_VAR (old_regend); \ + FREE_VAR (best_regstart); \ + FREE_VAR (best_regend); \ + FREE_VAR (reg_info); \ + FREE_VAR (reg_dummy); \ + FREE_VAR (reg_info_dummy); \ + if (!cant_free_wcs_buf) \ + { \ + FREE_VAR (string1); \ + FREE_VAR (string2); \ + FREE_VAR (mbs_offset1); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) +# else /* BYTE */ +# define FREE_VARIABLES() \ + do { \ + REGEX_FREE_STACK (fail_stack.stack); \ + FREE_VAR (regstart); \ + FREE_VAR (regend); \ + FREE_VAR (old_regstart); \ + FREE_VAR (old_regend); \ + FREE_VAR (best_regstart); \ + FREE_VAR (best_regend); \ + FREE_VAR (reg_info); \ + FREE_VAR (reg_dummy); \ + FREE_VAR (reg_info_dummy); \ + } while (0) +# endif /* WCHAR */ +#else +# ifdef WCHAR +# define FREE_VARIABLES() \ + do { \ + if (!cant_free_wcs_buf) \ + { \ + FREE_VAR (string1); \ + FREE_VAR (string2); \ + FREE_VAR (mbs_offset1); \ + FREE_VAR (mbs_offset2); \ + } \ + } while (0) +# else /* BYTE */ +# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ +# endif /* WCHAR */ +#endif /* not MATCH_MAY_ALLOCATE */ + +/* These values must meet several constraints. They must not be valid + register values; since we have a limit of 255 registers (because + we use only one byte in the pattern for the register number), we can + use numbers larger than 255. They must differ by 1, because of + NUM_FAILURE_ITEMS above. And the value for the lowest register must + be larger than the value for the highest register, so we do not try + to actually save any registers when none are active. */ +#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) +#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) + +#else /* not INSIDE_RECURSION */ +/* Matching routines. */ + +#ifndef emacs /* Emacs never uses this. */ +/* re_match is like re_match_2 except it takes only a single string. */ + +int +re_match (bufp, string, size, pos, regs) + struct re_pattern_buffer *bufp; + const char *string; + int size, pos; + struct re_registers *regs; +{ + int result; +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + result = wcs_re_match_2_internal (bufp, NULL, 0, string, size, + pos, regs, size, + NULL, 0, NULL, 0, NULL, NULL); + else +# endif + result = byte_re_match_2_internal (bufp, NULL, 0, string, size, + pos, regs, size); +# ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +# endif + return result; +} +# ifdef _LIBC +weak_alias (__re_match, re_match) +# endif +#endif /* not emacs */ + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION +static boolean PREFIX(group_match_null_string_p) _RE_ARGS ((UCHAR_T **p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info)); +static boolean PREFIX(alt_match_null_string_p) _RE_ARGS ((UCHAR_T *p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info)); +static boolean PREFIX(common_op_match_null_string_p) _RE_ARGS ((UCHAR_T **p, + UCHAR_T *end, + PREFIX(register_info_type) *reg_info)); +static int PREFIX(bcmp_translate) _RE_ARGS ((const CHAR_T *s1, const CHAR_T *s2, + int len, char *translate)); +#else /* not INSIDE_RECURSION */ + +/* re_match_2 matches the compiled pattern in BUFP against the + the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 + and SIZE2, respectively). We start matching at POS, and stop + matching at STOP. + + If REGS is non-null and the `no_sub' field of BUFP is nonzero, we + store offsets for the substring each group matched in REGS. See the + documentation for exactly how many groups we fill. + + We return -1 if no match, -2 if an internal error (such as the + failure stack overflowing). Otherwise, we return the length of the + matched substring. */ + +int +re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int pos; + struct re_registers *regs; + int stop; +{ + int result; +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + result = wcs_re_match_2_internal (bufp, string1, size1, string2, size2, + pos, regs, stop, + NULL, 0, NULL, 0, NULL, NULL); + else +# endif + result = byte_re_match_2_internal (bufp, string1, size1, string2, size2, + pos, regs, stop); + +#ifndef REGEX_MALLOC +# ifdef C_ALLOCA + alloca (0); +# endif +#endif + return result; +} +#ifdef _LIBC +weak_alias (__re_match_2, re_match_2) +#endif + +#endif /* not INSIDE_RECURSION */ + +#ifdef INSIDE_RECURSION + +#ifdef WCHAR +static int count_mbs_length PARAMS ((int *, int)); + +/* This check the substring (from 0, to length) of the multibyte string, + to which offset_buffer correspond. And count how many wchar_t_characters + the substring occupy. We use offset_buffer to optimization. + See convert_mbs_to_wcs. */ + +static int +count_mbs_length(offset_buffer, length) + int *offset_buffer; + int length; +{ + int upper, lower; + + /* Check whether the size is valid. */ + if (length < 0) + return -1; + + if (offset_buffer == NULL) + return 0; + + /* If there are no multibyte character, offset_buffer[i] == i. + Optmize for this case. */ + if (offset_buffer[length] == length) + return length; + + /* Set up upper with length. (because for all i, offset_buffer[i] >= i) */ + upper = length; + lower = 0; + + while (true) + { + int middle = (lower + upper) / 2; + if (middle == lower || middle == upper) + break; + if (offset_buffer[middle] > length) + upper = middle; + else if (offset_buffer[middle] < length) + lower = middle; + else + return middle; + } + + return -1; +} +#endif /* WCHAR */ + +/* This is a separate function so that we can force an alloca cleanup + afterwards. */ +#ifdef WCHAR +static int +wcs_re_match_2_internal (bufp, cstring1, csize1, cstring2, csize2, pos, + regs, stop, string1, size1, string2, size2, + mbs_offset1, mbs_offset2) + struct re_pattern_buffer *bufp; + const char *cstring1, *cstring2; + int csize1, csize2; + int pos; + struct re_registers *regs; + int stop; + /* string1 == string2 == NULL means string1/2, size1/2 and + mbs_offset1/2 need seting up in this function. */ + /* We need wchar_t* buffers correspond to cstring1, cstring2. */ + wchar_t *string1, *string2; + /* We need the size of wchar_t buffers correspond to csize1, csize2. */ + int size1, size2; + /* offset buffer for optimizatoin. See convert_mbs_to_wc. */ + int *mbs_offset1, *mbs_offset2; +#else /* BYTE */ +static int +byte_re_match_2_internal (bufp, string1, size1,string2, size2, pos, + regs, stop) + struct re_pattern_buffer *bufp; + const char *string1, *string2; + int size1, size2; + int pos; + struct re_registers *regs; + int stop; +#endif /* BYTE */ +{ + /* General temporaries. */ + int mcnt; + UCHAR_T *p1; +#ifdef WCHAR + /* They hold whether each wchar_t is binary data or not. */ + char *is_binary = NULL; + /* If true, we can't free string1/2, mbs_offset1/2. */ + int cant_free_wcs_buf = 1; +#endif /* WCHAR */ + + /* Just past the end of the corresponding string. */ + const CHAR_T *end1, *end2; + + /* Pointers into string1 and string2, just past the last characters in + each to consider matching. */ + const CHAR_T *end_match_1, *end_match_2; + + /* Where we are in the data, and the end of the current string. */ + const CHAR_T *d, *dend; + + /* Where we are in the pattern, and the end of the pattern. */ +#ifdef WCHAR + UCHAR_T *pattern, *p; + register UCHAR_T *pend; +#else /* BYTE */ + UCHAR_T *p = bufp->buffer; + register UCHAR_T *pend = p + bufp->used; +#endif /* WCHAR */ + + /* Mark the opcode just after a start_memory, so we can test for an + empty subpattern when we get to the stop_memory. */ + UCHAR_T *just_past_start_mem = 0; + + /* We use this to map every character in the string. */ + RE_TRANSLATE_TYPE translate = bufp->translate; + + /* Failure point stack. Each place that can handle a failure further + down the line pushes a failure point on this stack. It consists of + restart, regend, and reg_info for all registers corresponding to + the subexpressions we're currently inside, plus the number of such + registers, and, finally, two char *'s. The first char * is where + to resume scanning the pattern; the second one is where to resume + scanning the strings. If the latter is zero, the failure point is + a ``dummy''; if a failure happens and the failure point is a dummy, + it gets discarded and the next next one is tried. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + PREFIX(fail_stack_type) fail_stack; +#endif +#ifdef DEBUG + static unsigned failure_id; + unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; +#endif + +#ifdef REL_ALLOC + /* This holds the pointer to the failure stack, when + it is allocated relocatably. */ + fail_stack_elt_t *failure_stack_ptr; +#endif + + /* We fill all the registers internally, independent of what we + return, for use in backreferences. The number here includes + an element for register zero. */ + size_t num_regs = bufp->re_nsub + 1; + + /* The currently active registers. */ + active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; + active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; + + /* Information on the contents of registers. These are pointers into + the input strings; they record just what was matched (on this + attempt) by a subexpression part of the pattern, that is, the + regnum-th regstart pointer points to where in the pattern we began + matching and the regnum-th regend points to right after where we + stopped matching the regnum-th subexpression. (The zeroth register + keeps track of what the whole pattern matches.) */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **regstart, **regend; +#endif + + /* If a group that's operated upon by a repetition operator fails to + match anything, then the register for its start will need to be + restored because it will have been set to wherever in the string we + are when we last see its open-group operator. Similarly for a + register's end. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **old_regstart, **old_regend; +#endif + + /* The is_active field of reg_info helps us keep track of which (possibly + nested) subexpressions we are currently in. The matched_something + field of reg_info[reg_num] helps us tell whether or not we have + matched any of the pattern so far this time through the reg_num-th + subexpression. These two fields get reset each time through any + loop their register is in. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ + PREFIX(register_info_type) *reg_info; +#endif + + /* The following record the register info as found in the above + variables when we find a match better than any we've seen before. + This happens as we backtrack through the failure points, which in + turn happens only if we have not yet matched the entire string. */ + unsigned best_regs_set = false; +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **best_regstart, **best_regend; +#endif + + /* Logically, this is `best_regend[0]'. But we don't want to have to + allocate space for that if we're not allocating space for anything + else (see below). Also, we never need info about register 0 for + any of the other register vectors, and it seems rather a kludge to + treat `best_regend' differently than the rest. So we keep track of + the end of the best match so far in a separate variable. We + initialize this to NULL so that when we backtrack the first time + and need to test it, it's not garbage. */ + const CHAR_T *match_end = NULL; + + /* This helps SET_REGS_MATCHED avoid doing redundant work. */ + int set_regs_matched_done = 0; + + /* Used when we pop values we don't care about. */ +#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ + const CHAR_T **reg_dummy; + PREFIX(register_info_type) *reg_info_dummy; +#endif + +#ifdef DEBUG + /* Counts the total number of registers pushed. */ + unsigned num_regs_pushed = 0; +#endif + + /* Definitions for state transitions. More efficiently for gcc. */ +#ifdef __GNUC__ +# if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED +# define NEXT \ + do \ + { \ + int offset; \ + const void *__unbounded ptr; \ + offset = (p == pend \ + ? 0 : jmptable[SWITCH_ENUM_CAST ((re_opcode_t) *p++)]); \ + ptr = &&end_of_pattern + offset; \ + goto *ptr; \ + } \ + while (0) +# define REF(x) \ + &&label_##x - &&end_of_pattern +# define JUMP_TABLE_TYPE const int +# else +# define NEXT \ + do \ + { \ + const void *__unbounded ptr; \ + ptr = (p == pend ? &&end_of_pattern \ + : jmptable[SWITCH_ENUM_CAST ((re_opcode_t) *p++)]); \ + goto *ptr; \ + } \ + while (0) +# define REF(x) \ + &&label_##x +# define JUMP_TABLE_TYPE const void *const +# endif +# define CASE(x) label_##x + static JUMP_TABLE_TYPE jmptable[] = + { + REF (no_op), + REF (succeed), + REF (exactn), +# ifdef MBS_SUPPORT + REF (exactn_bin), +# endif + REF (anychar), + REF (charset), + REF (charset_not), + REF (start_memory), + REF (stop_memory), + REF (duplicate), + REF (begline), + REF (endline), + REF (begbuf), + REF (endbuf), + REF (jump), + REF (jump_past_alt), + REF (on_failure_jump), + REF (on_failure_keep_string_jump), + REF (pop_failure_jump), + REF (maybe_pop_jump), + REF (dummy_failure_jump), + REF (push_dummy_failure), + REF (succeed_n), + REF (jump_n), + REF (set_number_at), + REF (wordchar), + REF (notwordchar), + REF (wordbeg), + REF (wordend), + REF (wordbound), + REF (notwordbound) +# ifdef emacs + ,REF (before_dot), + REF (at_dot), + REF (after_dot), + REF (syntaxspec), + REF (notsyntaxspec) +# endif + }; +#else +# define NEXT \ + break +# define CASE(x) \ + case x +#endif + + DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); + + INIT_FAIL_STACK (); + +#ifdef MATCH_MAY_ALLOCATE + /* Do not bother to initialize all the register variables if there are + no groups in the pattern, as it takes a fair amount of time. If + there are groups, we include space for register 0 (the whole + pattern), even though we never use it, since it simplifies the + array indexing. We should fix this. */ + if (bufp->re_nsub) + { + regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + regend = REGEX_TALLOC (num_regs, const CHAR_T *); + old_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + old_regend = REGEX_TALLOC (num_regs, const CHAR_T *); + best_regstart = REGEX_TALLOC (num_regs, const CHAR_T *); + best_regend = REGEX_TALLOC (num_regs, const CHAR_T *); + reg_info = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); + reg_dummy = REGEX_TALLOC (num_regs, const CHAR_T *); + reg_info_dummy = REGEX_TALLOC (num_regs, PREFIX(register_info_type)); + + if (!(regstart && regend && old_regstart && old_regend && reg_info + && best_regstart && best_regend && reg_dummy && reg_info_dummy)) + { + FREE_VARIABLES (); + return -2; + } + } + else + { + /* We must initialize all our variables to NULL, so that + `FREE_VARIABLES' doesn't try to free them. */ + regstart = regend = old_regstart = old_regend = best_regstart + = best_regend = reg_dummy = NULL; + reg_info = reg_info_dummy = (PREFIX(register_info_type) *) NULL; + } +#endif /* MATCH_MAY_ALLOCATE */ + + /* The starting position is bogus. */ +#ifdef WCHAR + if (pos < 0 || pos > csize1 + csize2) +#else /* BYTE */ + if (pos < 0 || pos > size1 + size2) +#endif + { + FREE_VARIABLES (); + return -1; + } + +#ifdef WCHAR + /* Allocate wchar_t array for string1 and string2 and + fill them with converted string. */ + if (string1 == NULL && string2 == NULL) + { + /* We need seting up buffers here. */ + + /* We must free wcs buffers in this function. */ + cant_free_wcs_buf = 0; + + if (csize1 != 0) + { + string1 = REGEX_TALLOC (csize1 + 1, CHAR_T); + mbs_offset1 = REGEX_TALLOC (csize1 + 1, int); + is_binary = REGEX_TALLOC (csize1 + 1, char); + if (!string1 || !mbs_offset1 || !is_binary) + { + FREE_VAR (string1); + FREE_VAR (mbs_offset1); + FREE_VAR (is_binary); + return -2; + } + } + if (csize2 != 0) + { + string2 = REGEX_TALLOC (csize2 + 1, CHAR_T); + mbs_offset2 = REGEX_TALLOC (csize2 + 1, int); + is_binary = REGEX_TALLOC (csize2 + 1, char); + if (!string2 || !mbs_offset2 || !is_binary) + { + FREE_VAR (string1); + FREE_VAR (mbs_offset1); + FREE_VAR (string2); + FREE_VAR (mbs_offset2); + FREE_VAR (is_binary); + return -2; + } + size2 = convert_mbs_to_wcs(string2, cstring2, csize2, + mbs_offset2, is_binary); + string2[size2] = L'\0'; /* for a sentinel */ + FREE_VAR (is_binary); + } + } + + /* We need to cast pattern to (wchar_t*), because we casted this compiled + pattern to (char*) in regex_compile. */ + p = pattern = (CHAR_T*)bufp->buffer; + pend = (CHAR_T*)(bufp->buffer + bufp->used); + +#endif /* WCHAR */ + + /* Initialize subexpression text positions to -1 to mark ones that no + start_memory/stop_memory has been seen for. Also initialize the + register information struct. */ + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = regend[mcnt] + = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; + + REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; + IS_ACTIVE (reg_info[mcnt]) = 0; + MATCHED_SOMETHING (reg_info[mcnt]) = 0; + EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; + } + + /* We move `string1' into `string2' if the latter's empty -- but not if + `string1' is null. */ + if (size2 == 0 && string1 != NULL) + { + string2 = string1; + size2 = size1; + string1 = 0; + size1 = 0; +#ifdef WCHAR + mbs_offset2 = mbs_offset1; + csize2 = csize1; + mbs_offset1 = NULL; + csize1 = 0; +#endif + } + end1 = string1 + size1; + end2 = string2 + size2; + + /* Compute where to stop matching, within the two strings. */ +#ifdef WCHAR + if (stop <= csize1) + { + mcnt = count_mbs_length(mbs_offset1, stop); + end_match_1 = string1 + mcnt; + end_match_2 = string2; + } + else + { + if (stop > csize1 + csize2) + stop = csize1 + csize2; + end_match_1 = end1; + mcnt = count_mbs_length(mbs_offset2, stop-csize1); + end_match_2 = string2 + mcnt; + } + if (mcnt < 0) + { /* count_mbs_length return error. */ + FREE_VARIABLES (); + return -1; + } +#else + if (stop <= size1) + { + end_match_1 = string1 + stop; + end_match_2 = string2; + } + else + { + end_match_1 = end1; + end_match_2 = string2 + stop - size1; + } +#endif /* WCHAR */ + + /* `p' scans through the pattern as `d' scans through the data. + `dend' is the end of the input string that `d' points within. `d' + is advanced into the following input string whenever necessary, but + this happens before fetching; therefore, at the beginning of the + loop, `d' can be pointing at the end of a string, but it cannot + equal `string2'. */ +#ifdef WCHAR + if (size1 > 0 && pos <= csize1) + { + mcnt = count_mbs_length(mbs_offset1, pos); + d = string1 + mcnt; + dend = end_match_1; + } + else + { + mcnt = count_mbs_length(mbs_offset2, pos-csize1); + d = string2 + mcnt; + dend = end_match_2; + } + + if (mcnt < 0) + { /* count_mbs_length return error. */ + FREE_VARIABLES (); + return -1; + } +#else + if (size1 > 0 && pos <= size1) + { + d = string1 + pos; + dend = end_match_1; + } + else + { + d = string2 + pos - size1; + dend = end_match_2; + } +#endif /* WCHAR */ + + DEBUG_PRINT1 ("The compiled pattern is:\n"); + DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); + DEBUG_PRINT1 ("The string to match is: `"); + DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); + DEBUG_PRINT1 ("'\n"); + + /* This loops over pattern commands. It exits by returning from the + function if the match is complete, or it drops through if the match + fails at this starting point in the input data. */ + for (;;) + { +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + +#ifdef __GNUC__ + NEXT; +#else + if (p == pend) +#endif + { +#ifdef __GNUC__ + end_of_pattern: +#endif + /* End of pattern means we might have succeeded. */ + DEBUG_PRINT1 ("end of pattern ... "); + + /* If we haven't matched the entire string, and we want the + longest match, try backtracking. */ + if (d != end_match_2) + { + /* 1 if this match ends in the same string (string1 or string2) + as the best previous match. */ + boolean same_str_p = (FIRST_STRING_P (match_end) + == MATCHING_IN_FIRST_STRING); + /* 1 if this match is the best seen so far. */ + boolean best_match_p; + + /* AIX compiler got confused when this was combined + with the previous declaration. */ + if (same_str_p) + best_match_p = d > match_end; + else + best_match_p = !MATCHING_IN_FIRST_STRING; + + DEBUG_PRINT1 ("backtracking.\n"); + + if (!FAIL_STACK_EMPTY ()) + { /* More failure points to try. */ + + /* If exceeds best match so far, save it. */ + if (!best_regs_set || best_match_p) + { + best_regs_set = true; + match_end = d; + + DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + best_regstart[mcnt] = regstart[mcnt]; + best_regend[mcnt] = regend[mcnt]; + } + } + goto fail; + } + + /* If no failure points, don't restore garbage. And if + last match is real best match, don't restore second + best one. */ + else if (best_regs_set && !best_match_p) + { + restore_best_regs: + /* Restore best match. It may happen that `dend == + end_match_1' while the restored d is in string2. + For example, the pattern `x.*y.*z' against the + strings `x-' and `y-z-', if the two strings are + not consecutive in memory. */ + DEBUG_PRINT1 ("Restoring best registers.\n"); + + d = match_end; + dend = ((d >= string1 && d <= end1) + ? end_match_1 : end_match_2); + + for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) + { + regstart[mcnt] = best_regstart[mcnt]; + regend[mcnt] = best_regend[mcnt]; + } + } + } /* d != end_match_2 */ + + succeed_label: + DEBUG_PRINT1 ("Accepting match.\n"); + /* If caller wants register contents data back, do it. */ + if (regs && !bufp->no_sub) + { + /* Have the register data arrays been allocated? */ + if (bufp->regs_allocated == REGS_UNALLOCATED) + { /* No. So allocate them with malloc. We need one + extra element beyond `num_regs' for the `-1' marker + GNU code uses. */ + regs->num_regs = MAX (RE_NREGS, num_regs + 1); + regs->start = TALLOC (regs->num_regs, regoff_t); + regs->end = TALLOC (regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + bufp->regs_allocated = REGS_REALLOCATE; + } + else if (bufp->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 (regs->num_regs < num_regs + 1) + { + regs->num_regs = num_regs + 1; + RETALLOC (regs->start, regs->num_regs, regoff_t); + RETALLOC (regs->end, regs->num_regs, regoff_t); + if (regs->start == NULL || regs->end == NULL) + { + FREE_VARIABLES (); + return -2; + } + } + } + else + { + /* These braces fend off a "empty body in an else-statement" + warning under GCC when assert expands to nothing. */ + assert (bufp->regs_allocated == REGS_FIXED); + } + + /* Convert the pointer data in `regstart' and `regend' to + indices. Register zero has to be set differently, + since we haven't kept track of any info for it. */ + if (regs->num_regs > 0) + { + regs->start[0] = pos; +#ifdef WCHAR + if (MATCHING_IN_FIRST_STRING) + regs->end[0] = (mbs_offset1 != NULL ? + mbs_offset1[d-string1] : 0); + else + regs->end[0] = csize1 + (mbs_offset2 != NULL + ? mbs_offset2[d-string2] : 0); +#else + regs->end[0] = (MATCHING_IN_FIRST_STRING + ? ((regoff_t) (d - string1)) + : ((regoff_t) (d - string2 + size1))); +#endif /* WCHAR */ + } + + /* Go through the first `min (num_regs, regs->num_regs)' + registers, since that is all we initialized. */ + for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); + mcnt++) + { + if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) + regs->start[mcnt] = regs->end[mcnt] = -1; + else + { + regs->start[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); + regs->end[mcnt] + = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); + } + } + + /* If the regs structure we return has more elements than + were in the pattern, set the extra elements to -1. If + we (re)allocated the registers, this is the case, + because we always allocate enough to have at least one + -1 at the end. */ + for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) + regs->start[mcnt] = regs->end[mcnt] = -1; + } /* regs && !bufp->no_sub */ + + DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", + nfailure_points_pushed, nfailure_points_popped, + nfailure_points_pushed - nfailure_points_popped); + DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); + +#ifdef WCHAR + if (MATCHING_IN_FIRST_STRING) + mcnt = mbs_offset1 != NULL ? mbs_offset1[d-string1] : 0; + else + mcnt = (mbs_offset2 != NULL ? mbs_offset2[d-string2] : 0) + + csize1; + mcnt -= pos; +#else + mcnt = d - pos - (MATCHING_IN_FIRST_STRING + ? string1 : string2 - size1); +#endif /* WCHAR */ + + DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); + + FREE_VARIABLES (); + return mcnt; + } + +#ifndef __GNUC__ + /* Otherwise match next pattern command. */ + switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) + { +#endif + /* Ignore these. Used to ignore the n of succeed_n's which + currently have n == 0. */ + CASE (no_op): + DEBUG_PRINT1 ("EXECUTING no_op.\n"); + NEXT; + + CASE (succeed): + DEBUG_PRINT1 ("EXECUTING succeed.\n"); + goto succeed_label; + + /* Match the next n pattern characters exactly. The following + byte in the pattern defines n, and the n bytes after that + are the characters to match. */ + CASE (exactn): +#ifdef MBS_SUPPORT + CASE (exactn_bin): +#endif + mcnt = *p++; + DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); + + /* This is written out as an if-else so we don't waste time + testing `translate' inside the loop. */ + if (translate) + { + do + { + PREFETCH (); +#ifdef WCHAR + if (*d <= 0xff) + { + if ((UCHAR_T) translate[(unsigned char) *d++] + != (UCHAR_T) *p++) + goto fail; + } + else + { + if (*d++ != (CHAR_T) *p++) + goto fail; + } +#else + if ((UCHAR_T) translate[(unsigned char) *d++] + != (UCHAR_T) *p++) + goto fail; +#endif /* WCHAR */ + } + while (--mcnt); + } + else + { + do + { + PREFETCH (); + if (*d++ != (CHAR_T) *p++) goto fail; + } + while (--mcnt); + } + SET_REGS_MATCHED (); + NEXT; + + + /* Match any character except possibly a newline or a null. */ + CASE (anychar): + DEBUG_PRINT1 ("EXECUTING anychar.\n"); + + PREFETCH (); + + if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') + || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) + goto fail; + + SET_REGS_MATCHED (); + DEBUG_PRINT2 (" Matched `%ld'.\n", (long int) *d); + d++; + NEXT; + + + CASE (charset): + CASE (charset_not): + { + register UCHAR_T c; +#ifdef WCHAR + unsigned int i, char_class_length, coll_symbol_length, + equiv_class_length, ranges_length, chars_length, length; + CHAR_T *workp, *workp2, *charset_top; +#define WORK_BUFFER_SIZE 128 + CHAR_T str_buf[WORK_BUFFER_SIZE]; +# ifdef _LIBC + uint32_t nrules; +# endif /* _LIBC */ +#endif /* WCHAR */ + boolean not = (re_opcode_t) *(p - 1) == charset_not; + + DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); + PREFETCH (); + c = TRANSLATE (*d); /* The character to match. */ +#ifdef WCHAR +# ifdef _LIBC + nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); +# endif /* _LIBC */ + charset_top = p - 1; + char_class_length = *p++; + coll_symbol_length = *p++; + equiv_class_length = *p++; + ranges_length = *p++; + chars_length = *p++; + /* p points charset[6], so the address of the next instruction + (charset[l+m+n+2o+k+p']) equals p[l+m+n+2*o+p'], + where l=length of char_classes, m=length of collating_symbol, + n=equivalence_class, o=length of char_range, + p'=length of character. */ + workp = p; + /* Update p to indicate the next instruction. */ + p += char_class_length + coll_symbol_length+ equiv_class_length + + 2*ranges_length + chars_length; + + /* match with char_class? */ + for (i = 0; i < char_class_length ; i += CHAR_CLASS_SIZE) + { + wctype_t wctype; + uintptr_t alignedp = ((uintptr_t)workp + + __alignof__(wctype_t) - 1) + & ~(uintptr_t)(__alignof__(wctype_t) - 1); + wctype = *((wctype_t*)alignedp); + workp += CHAR_CLASS_SIZE; + if (iswctype((wint_t)c, wctype)) + goto char_set_matched; + } + + /* match with collating_symbol? */ +# ifdef _LIBC + if (nrules != 0) + { + const unsigned char *extra = (const unsigned char *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); + + for (workp2 = workp + coll_symbol_length ; workp < workp2 ; + workp++) + { + int32_t *wextra; + wextra = (int32_t*)(extra + *workp++); + for (i = 0; i < *wextra; ++i) + if (TRANSLATE(d[i]) != wextra[1 + i]) + break; + + if (i == *wextra) + { + /* Update d, however d will be incremented at + char_set_matched:, we decrement d here. */ + d += i - 1; + goto char_set_matched; + } + } + } + else /* (nrules == 0) */ +# endif + /* If we can't look up collation data, we use wcscoll + instead. */ + { + for (workp2 = workp + coll_symbol_length ; workp < workp2 ;) + { + const CHAR_T *backup_d = d, *backup_dend = dend; + length = wcslen (workp); + + /* If wcscoll(the collating symbol, whole string) > 0, + any substring of the string never match with the + collating symbol. */ + if (wcscoll (workp, d) > 0) + { + workp += length + 1; + continue; + } + + /* First, we compare the collating symbol with + the first character of the string. + If it don't match, we add the next character to + the compare buffer in turn. */ + for (i = 0 ; i < WORK_BUFFER_SIZE-1 ; i++, d++) + { + int match; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + + /* add next character to the compare buffer. */ + str_buf[i] = TRANSLATE(*d); + str_buf[i+1] = '\0'; + + match = wcscoll (workp, str_buf); + if (match == 0) + goto char_set_matched; + + if (match < 0) + /* (str_buf > workp) indicate (str_buf + X > workp), + because for all X (str_buf + X > str_buf). + So we don't need continue this loop. */ + break; + + /* Otherwise(str_buf < workp), + (str_buf+next_character) may equals (workp). + So we continue this loop. */ + } + /* not matched */ + d = backup_d; + dend = backup_dend; + workp += length + 1; + } + } + /* match with equivalence_class? */ +# ifdef _LIBC + if (nrules != 0) + { + const CHAR_T *backup_d = d, *backup_dend = dend; + /* Try to match the equivalence class against + those known to the collate implementation. */ + const int32_t *table; + const int32_t *weights; + const int32_t *extra; + const int32_t *indirect; + int32_t idx, idx2; + wint_t *cp; + size_t len; + + /* This #include defines a local function! */ +# include <locale/weightwc.h> + + table = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC); + weights = (const wint_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC); + extra = (const wint_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC); + indirect = (const int32_t *) + _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC); + + /* Write 1 collating element to str_buf, and + get its index. */ + idx2 = 0; + + for (i = 0 ; idx2 == 0 && i < WORK_BUFFER_SIZE - 1; i++) + { + cp = (wint_t*)str_buf; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + str_buf[i] = TRANSLATE(*(d+i)); + str_buf[i+1] = '\0'; /* sentinel */ + idx2 = findidx ((const wint_t**)&cp); + } + + /* Update d, however d will be incremented at + char_set_matched:, we decrement d here. */ + d = backup_d + ((wchar_t*)cp - (wchar_t*)str_buf - 1); + if (d >= dend) + { + if (dend == end_match_2) + d = dend; + else + { + d = string2; + dend = end_match_2; + } + } + + len = weights[idx2]; + + for (workp2 = workp + equiv_class_length ; workp < workp2 ; + workp++) + { + idx = (int32_t)*workp; + /* We already checked idx != 0 in regex_compile. */ + + if (idx2 != 0 && len == weights[idx]) + { + int cnt = 0; + while (cnt < len && (weights[idx + 1 + cnt] + == weights[idx2 + 1 + cnt])) + ++cnt; + + if (cnt == len) + goto char_set_matched; + } + } + /* not matched */ + d = backup_d; + dend = backup_dend; + } + else /* (nrules == 0) */ +# endif + /* If we can't look up collation data, we use wcscoll + instead. */ + { + for (workp2 = workp + equiv_class_length ; workp < workp2 ;) + { + const CHAR_T *backup_d = d, *backup_dend = dend; + length = wcslen (workp); + + /* If wcscoll(the collating symbol, whole string) > 0, + any substring of the string never match with the + collating symbol. */ + if (wcscoll (workp, d) > 0) + { + workp += length + 1; + break; + } + + /* First, we compare the equivalence class with + the first character of the string. + If it don't match, we add the next character to + the compare buffer in turn. */ + for (i = 0 ; i < WORK_BUFFER_SIZE - 1 ; i++, d++) + { + int match; + if (d == dend) + { + if (dend == end_match_2) + break; + d = string2; + dend = end_match_2; + } + + /* add next character to the compare buffer. */ + str_buf[i] = TRANSLATE(*d); + str_buf[i+1] = '\0'; + + match = wcscoll (workp, str_buf); + + if (match == 0) + goto char_set_matched; + + if (match < 0) + /* (str_buf > workp) indicate (str_buf + X > workp), + because for all X (str_buf + X > str_buf). + So we don't need continue this loop. */ + break; + + /* Otherwise(str_buf < workp), + (str_buf+next_character) may equals (workp). + So we continue this loop. */ + } + /* not matched */ + d = backup_d; + dend = backup_dend; + workp += length + 1; + } + } + + /* match with char_range? */ +# ifdef _LIBC + if (nrules != 0) + { + uint32_t collseqval; + const char *collseq = (const char *) + _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC); + + collseqval = collseq_table_lookup (collseq, c); + + for (; workp < p - chars_length ;) + { + uint32_t start_val, end_val; + + /* We already compute the collation sequence value + of the characters (or collating symbols). */ + start_val = (uint32_t) *workp++; /* range_start */ + end_val = (uint32_t) *workp++; /* range_end */ + + if (start_val <= collseqval && collseqval <= end_val) + goto char_set_matched; + } + } + else +# endif + { + /* We set range_start_char at str_buf[0], range_end_char + at str_buf[4], and compared char at str_buf[2]. */ + str_buf[1] = 0; + str_buf[2] = c; + str_buf[3] = 0; + str_buf[5] = 0; + for (; workp < p - chars_length ;) + { + wchar_t *range_start_char, *range_end_char; + + /* match if (range_start_char <= c <= range_end_char). */ + + /* If range_start(or end) < 0, we assume -range_start(end) + is the offset of the collating symbol which is specified + as the character of the range start(end). */ + + /* range_start */ + if (*workp < 0) + range_start_char = charset_top - (*workp++); + else + { + str_buf[0] = *workp++; + range_start_char = str_buf; + } + + /* range_end */ + if (*workp < 0) + range_end_char = charset_top - (*workp++); + else + { + str_buf[4] = *workp++; + range_end_char = str_buf + 4; + } + + if (wcscoll (range_start_char, str_buf+2) <= 0 + && wcscoll (str_buf+2, range_end_char) <= 0) + goto char_set_matched; + } + } + + /* match with char? */ + for (; workp < p ; workp++) + if (c == *workp) + goto char_set_matched; + + not = !not; + + char_set_matched: + if (not) goto fail; +#else + /* Cast to `unsigned' instead of `unsigned char' in case the + bit list is a full 32 bytes long. */ + if (c < (unsigned) (*p * BYTEWIDTH) + && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + not = !not; + + p += 1 + *p; + + if (!not) goto fail; +#undef WORK_BUFFER_SIZE +#endif /* WCHAR */ + SET_REGS_MATCHED (); + d++; + NEXT; + } + + + /* The beginning of a group is represented by start_memory. + The arguments are the register number in the next byte, and the + number of groups inner to this one in the next. The text + matched within the group is recorded (in the internal + registers data structure) under the register number. */ + CASE (start_memory): + DEBUG_PRINT3 ("EXECUTING start_memory %ld (%ld):\n", + (long int) *p, (long int) p[1]); + + /* Find out if this group can match the empty string. */ + p1 = p; /* To send to group_match_null_string_p. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[*p]) + = PREFIX(group_match_null_string_p) (&p1, pend, reg_info); + + /* Save the position in the string where we were the last time + we were at this open-group operator in case the group is + operated upon by a repetition operator, e.g., with `(a*)*b' + against `ab'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regstart[*p]) ? d : regstart[*p] + : regstart[*p]; + DEBUG_PRINT2 (" old_regstart: %d\n", + POINTER_TO_OFFSET (old_regstart[*p])); + + regstart[*p] = d; + DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); + + IS_ACTIVE (reg_info[*p]) = 1; + MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* This is the new highest active register. */ + highest_active_reg = *p; + + /* If nothing was active before, this is the new lowest active + register. */ + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *p; + + /* Move past the register number and inner group count. */ + p += 2; + just_past_start_mem = p; + + NEXT; + + + /* The stop_memory opcode represents the end of a group. Its + arguments are the same as start_memory's: the register + number, and the number of inner groups. */ + CASE (stop_memory): + DEBUG_PRINT3 ("EXECUTING stop_memory %ld (%ld):\n", + (long int) *p, (long int) p[1]); + + /* We need to save the string position the last time we were at + this close-group operator in case the group is operated + upon by a repetition operator, e.g., with `((a*)*(b*)*)*' + against `aba'; then we want to ignore where we are now in + the string in case this attempt to match fails. */ + old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) + ? REG_UNSET (regend[*p]) ? d : regend[*p] + : regend[*p]; + DEBUG_PRINT2 (" old_regend: %d\n", + POINTER_TO_OFFSET (old_regend[*p])); + + regend[*p] = d; + DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); + + /* This register isn't active anymore. */ + IS_ACTIVE (reg_info[*p]) = 0; + + /* Clear this whenever we change the register activity status. */ + set_regs_matched_done = 0; + + /* If this was the only register active, nothing is active + anymore. */ + if (lowest_active_reg == highest_active_reg) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + { /* We must scan for the new highest active register, since + it isn't necessarily one less than now: consider + (a(b)c(d(e)f)g). When group 3 ends, after the f), the + new highest active register is 1. */ + UCHAR_T r = *p - 1; + while (r > 0 && !IS_ACTIVE (reg_info[r])) + r--; + + /* If we end up at register zero, that means that we saved + the registers as the result of an `on_failure_jump', not + a `start_memory', and we jumped to past the innermost + `stop_memory'. For example, in ((.)*) we save + registers 1 and 2 as a result of the *, but when we pop + back to the second ), we are at the stop_memory 1. + Thus, nothing is active. */ + if (r == 0) + { + lowest_active_reg = NO_LOWEST_ACTIVE_REG; + highest_active_reg = NO_HIGHEST_ACTIVE_REG; + } + else + highest_active_reg = r; + } + + /* If just failed to match something this time around with a + group that's operated on by a repetition operator, try to + force exit from the ``loop'', and restore the register + information for this group that we had before trying this + last match. */ + if ((!MATCHED_SOMETHING (reg_info[*p]) + || just_past_start_mem == p - 1) + && (p + 2) < pend) + { + boolean is_a_jump_n = false; + + p1 = p + 2; + mcnt = 0; + switch ((re_opcode_t) *p1++) + { + case jump_n: + is_a_jump_n = true; + case pop_failure_jump: + case maybe_pop_jump: + case jump: + case dummy_failure_jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (is_a_jump_n) + p1 += OFFSET_ADDRESS_SIZE; + break; + + default: + /* do nothing */ ; + } + p1 += mcnt; + + /* If the next operation is a jump backwards in the pattern + to an on_failure_jump right before the start_memory + corresponding to this stop_memory, exit from the loop + by forcing a failure after pushing on the stack the + on_failure_jump's jump in the pattern, and d. */ + if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump + && (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == start_memory + && p1[2+OFFSET_ADDRESS_SIZE] == *p) + { + /* If this group ever matched anything, then restore + what its registers were before trying this last + failed match, e.g., with `(a*)*b' against `ab' for + regstart[1], and, e.g., with `((a*)*(b*)*)*' + against `aba' for regend[3]. + + Also restore the registers for inner groups for, + e.g., `((a*)(b*))*' against `aba' (register 3 would + otherwise get trashed). */ + + if (EVER_MATCHED_SOMETHING (reg_info[*p])) + { + unsigned r; + + EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; + + /* Restore this and inner groups' (if any) registers. */ + for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); + r++) + { + regstart[r] = old_regstart[r]; + + /* xx why this test? */ + if (old_regend[r] >= regstart[r]) + regend[r] = old_regend[r]; + } + } + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + PUSH_FAILURE_POINT (p1 + mcnt, d, -2); + + goto fail; + } + } + + /* Move past the register number and the inner group count. */ + p += 2; + NEXT; + + + /* \<digit> has been turned into a `duplicate' command which is + followed by the numeric value of <digit> as the register number. */ + CASE (duplicate): + { + register const CHAR_T *d2, *dend2; + int regno = *p++; /* Get which register to match against. */ + DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); + + /* Can't back reference a group which we've never matched. */ + if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) + goto fail; + + /* Where in input to try to start matching. */ + d2 = regstart[regno]; + + /* Where to stop matching; if both the place to start and + the place to stop matching are in the same string, then + set to the place to stop, otherwise, for now have to use + the end of the first string. */ + + dend2 = ((FIRST_STRING_P (regstart[regno]) + == FIRST_STRING_P (regend[regno])) + ? regend[regno] : end_match_1); + for (;;) + { + /* If necessary, advance to next segment in register + contents. */ + while (d2 == dend2) + { + if (dend2 == end_match_2) break; + if (dend2 == regend[regno]) break; + + /* End of string1 => advance to string2. */ + d2 = string2; + dend2 = regend[regno]; + } + /* At end of register contents => success */ + if (d2 == dend2) break; + + /* If necessary, advance to next segment in data. */ + PREFETCH (); + + /* How many characters left in this segment to match. */ + mcnt = dend - d; + + /* Want how many consecutive characters we can match in + one shot, so, if necessary, adjust the count. */ + if (mcnt > dend2 - d2) + mcnt = dend2 - d2; + + /* Compare that many; failure if mismatch, else move + past them. */ + if (translate + ? PREFIX(bcmp_translate) (d, d2, mcnt, translate) + : memcmp (d, d2, mcnt*sizeof(UCHAR_T))) + goto fail; + d += mcnt, d2 += mcnt; + + /* Do this because we've match some characters. */ + SET_REGS_MATCHED (); + } + } + NEXT; + + + /* begline matches the empty string at the beginning of the string + (unless `not_bol' is set in `bufp'), and, if + `newline_anchor' is set, after newlines. */ + CASE (begline): + DEBUG_PRINT1 ("EXECUTING begline.\n"); + + if (AT_STRINGS_BEG (d)) + { + if (!bufp->not_bol) + { + NEXT; + } + } + else if (d[-1] == '\n' && bufp->newline_anchor) + { + NEXT; + } + /* In all other cases, we fail. */ + goto fail; + + + /* endline is the dual of begline. */ + CASE (endline): + DEBUG_PRINT1 ("EXECUTING endline.\n"); + + if (AT_STRINGS_END (d)) + { + if (!bufp->not_eol) + { + NEXT; + } + } + + /* We have to ``prefetch'' the next character. */ + else if ((d == end1 ? *string2 : *d) == '\n' + && bufp->newline_anchor) + { + NEXT; + } + goto fail; + + + /* Match at the very beginning of the data. */ + CASE (begbuf): + DEBUG_PRINT1 ("EXECUTING begbuf.\n"); + if (AT_STRINGS_BEG (d)) + { + NEXT; + } + goto fail; + + + /* Match at the very end of the data. */ + CASE (endbuf): + DEBUG_PRINT1 ("EXECUTING endbuf.\n"); + if (AT_STRINGS_END (d)) + { + NEXT; + } + goto fail; + + + /* on_failure_keep_string_jump is used to optimize `.*\n'. It + pushes NULL as the value for the string on the stack. Then + `pop_failure_point' will keep the current value for the + string, instead of restoring it. To see why, consider + matching `foo\nbar' against `.*\n'. The .* matches the foo; + then the . fails against the \n. But the next thing we want + to do is match the \n against the \n; if we restored the + string value, we would be back at the foo. + + Because this is used only in specific cases, we don't need to + check all the things that `on_failure_jump' does, to make + sure the right things get saved on the stack. Hence we don't + share its code. The only reason to push anything on the + stack at all is that otherwise we would have to change + `anychar's code to do something besides goto fail in this + case; that seems worse than this. */ + CASE (on_failure_keep_string_jump): + DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); +#endif + + PUSH_FAILURE_POINT (p + mcnt, NULL, -2); + NEXT; + + + /* Uses of on_failure_jump: + + Each alternative starts with an on_failure_jump that points + to the beginning of the next alternative. Each alternative + except the last ends with a jump that in effect jumps past + the rest of the alternatives. (They really jump to the + ending jump of the following alternative, because tensioning + these jumps is a hassle.) + + Repeats start with an on_failure_jump that points past both + the repetition text and either the following jump or + pop_failure_jump back to this on_failure_jump. */ + CASE (on_failure_jump): + on_failure: + DEBUG_PRINT1 ("EXECUTING on_failure_jump"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); +#else + DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); +#endif + + /* If this on_failure_jump comes right before a group (i.e., + the original * applied to a group), save the information + for that group and all inner ones, so that if we fail back + to this point, the group's information will be correct. + For example, in \(a*\)*\1, we need the preceding group, + and in \(zz\(a*\)b*\)\2, we need the inner group. */ + + /* We can't use `p' to check ahead because we push + a failure point to `p + mcnt' after we do this. */ + p1 = p; + + /* We need to skip no_op's before we look for the + start_memory in case this on_failure_jump is happening as + the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 + against aba. */ + while (p1 < pend && (re_opcode_t) *p1 == no_op) + p1++; + + if (p1 < pend && (re_opcode_t) *p1 == start_memory) + { + /* We have a new highest active register now. This will + get reset at the start_memory we are about to get to, + but we will have saved all the registers relevant to + this repetition op, as described above. */ + highest_active_reg = *(p1 + 1) + *(p1 + 2); + if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) + lowest_active_reg = *(p1 + 1); + } + + DEBUG_PRINT1 (":\n"); + PUSH_FAILURE_POINT (p + mcnt, d, -2); + NEXT; + + + /* A smart repeat ends with `maybe_pop_jump'. + We change it to either `pop_failure_jump' or `jump'. */ + CASE (maybe_pop_jump): + EXTRACT_NUMBER_AND_INCR (mcnt, p); + DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); + { + register UCHAR_T *p2 = p; + + /* Compare the beginning of the repeat with what in the + pattern follows its end. If we can establish that there + is nothing that they would both match, i.e., that we + would have to backtrack because of (as in, e.g., `a*a') + then we can change to pop_failure_jump, because we'll + never have to backtrack. + + This is not true in the case of alternatives: in + `(a|ab)*' we do need to backtrack to the `ab' alternative + (e.g., if the string was `ab'). But instead of trying to + detect that here, the alternative has put on a dummy + failure point which is what we will end up popping. */ + + /* Skip over open/close-group commands. + If what follows this loop is a ...+ construct, + look at what begins its body, since we will have to + match at least one of that. */ + while (1) + { + if (p2 + 2 < pend + && ((re_opcode_t) *p2 == stop_memory + || (re_opcode_t) *p2 == start_memory)) + p2 += 3; + else if (p2 + 2 + 2 * OFFSET_ADDRESS_SIZE < pend + && (re_opcode_t) *p2 == dummy_failure_jump) + p2 += 2 + 2 * OFFSET_ADDRESS_SIZE; + else + break; + } + + p1 = p + mcnt; + /* p1[0] ... p1[2] are the `on_failure_jump' corresponding + to the `maybe_finalize_jump' of this case. Examine what + follows. */ + + /* If we're at the end of the pattern, we can change. */ + if (p2 == pend) + { + /* Consider what happens when matching ":\(.*\)" + against ":/". I don't really understand this code + yet. */ + p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) + pop_failure_jump; + DEBUG_PRINT1 + (" End of pattern: change to `pop_failure_jump'.\n"); + } + + else if ((re_opcode_t) *p2 == exactn +#ifdef MBS_SUPPORT + || (re_opcode_t) *p2 == exactn_bin +#endif + || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) + { + register UCHAR_T c + = *p2 == (UCHAR_T) endline ? '\n' : p2[2]; + + if (((re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn +#ifdef MBS_SUPPORT + || (re_opcode_t) p1[1+OFFSET_ADDRESS_SIZE] == exactn_bin +#endif + ) && p1[3+OFFSET_ADDRESS_SIZE] != c) + { + p[-(1+OFFSET_ADDRESS_SIZE)] = (UCHAR_T) + pop_failure_jump; +#ifdef WCHAR + DEBUG_PRINT3 (" %C != %C => pop_failure_jump.\n", + (wint_t) c, + (wint_t) p1[3+OFFSET_ADDRESS_SIZE]); +#else + DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", + (char) c, + (char) p1[3+OFFSET_ADDRESS_SIZE]); +#endif + } + +#ifndef WCHAR + else if ((re_opcode_t) p1[3] == charset + || (re_opcode_t) p1[3] == charset_not) + { + int not = (re_opcode_t) p1[3] == charset_not; + + if (c < (unsigned) (p1[4] * BYTEWIDTH) + && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) + not = !not; + + /* `not' is equal to 1 if c would match, which means + that we can't change to pop_failure_jump. */ + if (!not) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } +#endif /* not WCHAR */ + } +#ifndef WCHAR + else if ((re_opcode_t) *p2 == charset) + { + /* We win if the first character of the loop is not part + of the charset. */ + if ((re_opcode_t) p1[3] == exactn + && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] + && (p2[2 + p1[5] / BYTEWIDTH] + & (1 << (p1[5] % BYTEWIDTH))))) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + + else if ((re_opcode_t) p1[3] == charset_not) + { + int idx; + /* We win if the charset_not inside the loop + lists every character listed in the charset after. */ + for (idx = 0; idx < (int) p2[1]; idx++) + if (! (p2[2 + idx] == 0 + || (idx < (int) p1[4] + && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) + break; + + if (idx == p2[1]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + else if ((re_opcode_t) p1[3] == charset) + { + int idx; + /* We win if the charset inside the loop + has no overlap with the one after the loop. */ + for (idx = 0; + idx < (int) p2[1] && idx < (int) p1[4]; + idx++) + if ((p2[2 + idx] & p1[5 + idx]) != 0) + break; + + if (idx == p2[1] || idx == p1[4]) + { + p[-3] = (unsigned char) pop_failure_jump; + DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); + } + } + } +#endif /* not WCHAR */ + } + p -= OFFSET_ADDRESS_SIZE; /* Point at relative address again. */ + if ((re_opcode_t) p[-1] != pop_failure_jump) + { + p[-1] = (UCHAR_T) jump; + DEBUG_PRINT1 (" Match => jump.\n"); + goto unconditional_jump; + } + /* Note fall through. */ + + + /* The end of a simple repeat has a pop_failure_jump back to + its matching on_failure_jump, where the latter will push a + failure point. The pop_failure_jump takes off failure + points put on by this pop_failure_jump's matching + on_failure_jump; we got through the pattern to here from the + matching on_failure_jump, so didn't fail. */ + CASE (pop_failure_jump): + { + /* We need to pass separate storage for the lowest and + highest registers, even though we don't care about the + actual values. Otherwise, we will restore only one + register from the stack, since lowest will == highest in + `pop_failure_point'. */ + active_reg_t dummy_low_reg, dummy_high_reg; + UCHAR_T *pdummy = NULL; + const CHAR_T *sdummy = NULL; + + DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); + POP_FAILURE_POINT (sdummy, pdummy, + dummy_low_reg, dummy_high_reg, + reg_dummy, reg_dummy, reg_info_dummy); + } + /* Note fall through. */ + + unconditional_jump: +#ifdef _LIBC + DEBUG_PRINT2 ("\n%p: ", p); +#else + DEBUG_PRINT2 ("\n0x%x: ", p); +#endif + /* Note fall through. */ + + /* Unconditionally jump (without popping any failure points). */ + CASE (jump): + EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ + DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); + p += mcnt; /* Do the jump. */ +#ifdef _LIBC + DEBUG_PRINT2 ("(to %p).\n", p); +#else + DEBUG_PRINT2 ("(to 0x%x).\n", p); +#endif + NEXT; + + + /* We need this opcode so we can detect where alternatives end + in `group_match_null_string_p' et al. */ + CASE (jump_past_alt): + DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); + goto unconditional_jump; + + + /* Normally, the on_failure_jump pushes a failure point, which + then gets popped at pop_failure_jump. We will end up at + pop_failure_jump, also, and with a pattern of, say, `a+', we + are skipping over the on_failure_jump, so we have to push + something meaningless for pop_failure_jump to pop. */ + CASE (dummy_failure_jump): + DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); + /* It doesn't matter what we push for the string here. What + the code at `fail' tests is the value for the pattern. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + goto unconditional_jump; + + + /* At the end of an alternative, we need to push a dummy failure + point in case we are followed by a `pop_failure_jump', because + we don't want the failure point for the alternative to be + popped. For example, matching `(a|ab)*' against `aab' + requires that we match the `ab' alternative. */ + CASE (push_dummy_failure): + DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); + /* See comments just above at `dummy_failure_jump' about the + two zeroes. */ + PUSH_FAILURE_POINT (NULL, NULL, -2); + NEXT; + + /* Have to succeed matching what follows at least n times. + After that, handle like `on_failure_jump'. */ + CASE (succeed_n): + EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); + DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); + + assert (mcnt >= 0); + /* Originally, this is how many times we HAVE to succeed. */ + if (mcnt > 0) + { + mcnt--; + p += OFFSET_ADDRESS_SIZE; + STORE_NUMBER_AND_INCR (p, mcnt); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p - OFFSET_ADDRESS_SIZE + , mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - OFFSET_ADDRESS_SIZE + , mcnt); +#endif + } + else if (mcnt == 0) + { +#ifdef _LIBC + DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", + p + OFFSET_ADDRESS_SIZE); +#else + DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", + p + OFFSET_ADDRESS_SIZE); +#endif /* _LIBC */ + +#ifdef WCHAR + p[1] = (UCHAR_T) no_op; +#else + p[2] = (UCHAR_T) no_op; + p[3] = (UCHAR_T) no_op; +#endif /* WCHAR */ + goto on_failure; + } + NEXT; + + CASE (jump_n): + EXTRACT_NUMBER (mcnt, p + OFFSET_ADDRESS_SIZE); + DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); + + /* Originally, this is how many times we CAN jump. */ + if (mcnt) + { + mcnt--; + STORE_NUMBER (p + OFFSET_ADDRESS_SIZE, mcnt); + +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p + OFFSET_ADDRESS_SIZE, + mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + OFFSET_ADDRESS_SIZE, + mcnt); +#endif /* _LIBC */ + goto unconditional_jump; + } + /* If don't have to jump any more, skip over the rest of command. */ + else + p += 2 * OFFSET_ADDRESS_SIZE; + NEXT; + + CASE (set_number_at): + { + DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); + + EXTRACT_NUMBER_AND_INCR (mcnt, p); + p1 = p + mcnt; + EXTRACT_NUMBER_AND_INCR (mcnt, p); +#ifdef _LIBC + DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); +#else + DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); +#endif + STORE_NUMBER (p1, mcnt); + NEXT; + } + +#if 0 + /* The DEC Alpha C compiler 3.x generates incorrect code for the + test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of + AT_WORD_BOUNDARY, so this code is disabled. Expanding the + macro and introducing temporary variables works around the bug. */ + + CASE (wordbound): + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + { + NEXT; + } + goto fail; + + CASE (notwordbound): + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_WORD_BOUNDARY (d)) + goto fail; + NEXT; +#else + CASE (wordbound): + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING wordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + { + NEXT; + } + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + { + NEXT; + } + goto fail; + } + + CASE (notwordbound): + { + boolean prevchar, thischar; + + DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); + if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) + goto fail; + + prevchar = WORDCHAR_P (d - 1); + thischar = WORDCHAR_P (d); + if (prevchar != thischar) + goto fail; + NEXT; + } +#endif + + CASE (wordbeg): + DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); + if (!AT_STRINGS_END (d) && WORDCHAR_P (d) + && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) + { + NEXT; + } + goto fail; + + CASE (wordend): + DEBUG_PRINT1 ("EXECUTING wordend.\n"); + if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) + && (AT_STRINGS_END (d) || !WORDCHAR_P (d))) + { + NEXT; + } + goto fail; + +#ifdef emacs + CASE (before_dot): + DEBUG_PRINT1 ("EXECUTING before_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) >= point) + goto fail; + NEXT; + + CASE (at_dot): + DEBUG_PRINT1 ("EXECUTING at_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) != point) + goto fail; + NEXT; + + CASE (after_dot): + DEBUG_PRINT1 ("EXECUTING after_dot.\n"); + if (PTR_CHAR_POS ((unsigned char *) d) <= point) + goto fail; + NEXT; + + CASE (syntaxspec): + DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchsyntax; + + CASE (wordchar): + DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); + mcnt = (int) Sword; + matchsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + NEXT; + + CASE (notsyntaxspec): + DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); + mcnt = *p++; + goto matchnotsyntax; + + CASE (notwordchar): + DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); + mcnt = (int) Sword; + matchnotsyntax: + PREFETCH (); + /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ + d++; + if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) + goto fail; + SET_REGS_MATCHED (); + NEXT; + +#else /* not emacs */ + CASE (wordchar): + DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); + PREFETCH (); + if (!WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + NEXT; + + CASE (notwordchar): + DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); + PREFETCH (); + if (WORDCHAR_P (d)) + goto fail; + SET_REGS_MATCHED (); + d++; + NEXT; +#endif /* not emacs */ + +#ifndef __GNUC__ + default: + abort (); + } + continue; /* Successfully executed one pattern command; keep going. */ +#endif + + + /* We goto here if a matching operation fails. */ + fail: + if (!FAIL_STACK_EMPTY ()) + { /* A restart point is known. Restore to that state. */ + DEBUG_PRINT1 ("\nFAIL:\n"); + POP_FAILURE_POINT (d, p, + lowest_active_reg, highest_active_reg, + regstart, regend, reg_info); + + /* If this failure point is a dummy, try the next one. */ + if (!p) + goto fail; + + /* If we failed to the end of the pattern, don't examine *p. */ + assert (p <= pend); + if (p < pend) + { + boolean is_a_jump_n = false; + + /* If failed to a backwards jump that's part of a repetition + loop, need to pop this failure point and use the next one. */ + switch ((re_opcode_t) *p) + { + case jump_n: + is_a_jump_n = true; + case maybe_pop_jump: + case pop_failure_jump: + case jump: + p1 = p + 1; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + + if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) + || (!is_a_jump_n + && (re_opcode_t) *p1 == on_failure_jump)) + goto fail; + break; + default: + /* do nothing */ ; + } + } + + if (d >= string1 && d <= end1) + dend = end_match_1; + } + else + break; /* Matching at this starting point really fails. */ + } /* for (;;) */ + + if (best_regs_set) + goto restore_best_regs; + + FREE_VARIABLES (); + + return -1; /* Failure to match. */ +} /* re_match_2 */ + +/* Subroutine definitions for re_match_2. */ + + +/* We are passed P pointing to a register number after a start_memory. + + Return true if the pattern up to the corresponding stop_memory can + match the empty string, and false otherwise. + + If we find the matching stop_memory, sets P to point to one past its number. + Otherwise, sets P to an undefined byte less than or equal to END. + + We don't handle duplicates properly (yet). */ + +static boolean +PREFIX(group_match_null_string_p) (p, end, reg_info) + UCHAR_T **p, *end; + PREFIX(register_info_type) *reg_info; +{ + int mcnt; + /* Point to after the args to the start_memory. */ + UCHAR_T *p1 = *p + 2; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and return true or + false, as appropriate, when we get to one that can't, or to the + matching stop_memory. */ + + switch ((re_opcode_t) *p1) + { + /* Could be either a loop or a series of alternatives. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + /* If the next operation is not a jump backwards in the + pattern. */ + + if (mcnt >= 0) + { + /* Go through the on_failure_jumps of the alternatives, + seeing if any of the alternatives cannot match nothing. + The last alternative starts with only a jump, + whereas the rest start with on_failure_jump and end + with a jump, e.g., here is the pattern for `a|b|c': + + /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 + /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 + /exactn/1/c + + So, we have to first go through the first (n-1) + alternatives and then deal with the last one separately. */ + + + /* Deal with the first (n-1) alternatives, which start + with an on_failure_jump (see above) that jumps to right + past a jump_past_alt. */ + + while ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] == + jump_past_alt) + { + /* `mcnt' holds how many bytes long the alternative + is, including the ending `jump_past_alt' and + its number. */ + + if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt - + (1 + OFFSET_ADDRESS_SIZE), + reg_info)) + return false; + + /* Move to right after this alternative, including the + jump_past_alt. */ + p1 += mcnt; + + /* Break if it's the beginning of an n-th alternative + that doesn't begin with an on_failure_jump. */ + if ((re_opcode_t) *p1 != on_failure_jump) + break; + + /* Still have to check that it's not an n-th + alternative that starts with an on_failure_jump. */ + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if ((re_opcode_t) p1[mcnt-(1+OFFSET_ADDRESS_SIZE)] != + jump_past_alt) + { + /* Get to the beginning of the n-th alternative. */ + p1 -= 1 + OFFSET_ADDRESS_SIZE; + break; + } + } + + /* Deal with the last alternative: go back and get number + of the `jump_past_alt' just before it. `mcnt' contains + the length of the alternative. */ + EXTRACT_NUMBER (mcnt, p1 - OFFSET_ADDRESS_SIZE); + + if (!PREFIX(alt_match_null_string_p) (p1, p1 + mcnt, reg_info)) + return false; + + p1 += mcnt; /* Get past the n-th alternative. */ + } /* if mcnt > 0 */ + break; + + + case stop_memory: + assert (p1[1] == **p); + *p = p1 + 2; + return true; + + + default: + if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return false; +} /* group_match_null_string_p */ + + +/* Similar to group_match_null_string_p, but doesn't deal with alternatives: + It expects P to be the first byte of a single alternative and END one + byte past the last. The alternative can contain groups. */ + +static boolean +PREFIX(alt_match_null_string_p) (p, end, reg_info) + UCHAR_T *p, *end; + PREFIX(register_info_type) *reg_info; +{ + int mcnt; + UCHAR_T *p1 = p; + + while (p1 < end) + { + /* Skip over opcodes that can match nothing, and break when we get + to one that can't. */ + + switch ((re_opcode_t) *p1) + { + /* It's a loop. */ + case on_failure_jump: + p1++; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + break; + + default: + if (!PREFIX(common_op_match_null_string_p) (&p1, end, reg_info)) + return false; + } + } /* while p1 < end */ + + return true; +} /* alt_match_null_string_p */ + + +/* Deals with the ops common to group_match_null_string_p and + alt_match_null_string_p. + + Sets P to one after the op and its arguments, if any. */ + +static boolean +PREFIX(common_op_match_null_string_p) (p, end, reg_info) + UCHAR_T **p, *end; + PREFIX(register_info_type) *reg_info; +{ + int mcnt; + boolean ret; + int reg_no; + UCHAR_T *p1 = *p; + + switch ((re_opcode_t) *p1++) + { + case no_op: + case begline: + case endline: + case begbuf: + case endbuf: + case wordbeg: + case wordend: + case wordbound: + case notwordbound: +#ifdef emacs + case before_dot: + case at_dot: + case after_dot: +#endif + break; + + case start_memory: + reg_no = *p1; + assert (reg_no > 0 && reg_no <= MAX_REGNUM); + ret = PREFIX(group_match_null_string_p) (&p1, end, reg_info); + + /* Have to set this here in case we're checking a group which + contains a group and a back reference to it. */ + + if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) + REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; + + if (!ret) + return false; + break; + + /* If this is an optimized succeed_n for zero times, make the jump. */ + case jump: + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + if (mcnt >= 0) + p1 += mcnt; + else + return false; + break; + + case succeed_n: + /* Get to the number of times to succeed. */ + p1 += OFFSET_ADDRESS_SIZE; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + + if (mcnt == 0) + { + p1 -= 2 * OFFSET_ADDRESS_SIZE; + EXTRACT_NUMBER_AND_INCR (mcnt, p1); + p1 += mcnt; + } + else + return false; + break; + + case duplicate: + if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) + return false; + break; + + case set_number_at: + p1 += 2 * OFFSET_ADDRESS_SIZE; + + default: + /* All other opcodes mean we cannot match the empty string. */ + return false; + } + + *p = p1; + return true; +} /* common_op_match_null_string_p */ + + +/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN + bytes; nonzero otherwise. */ + +static int +PREFIX(bcmp_translate) (s1, s2, len, translate) + const CHAR_T *s1, *s2; + register int len; + RE_TRANSLATE_TYPE translate; +{ + register const UCHAR_T *p1 = (const UCHAR_T *) s1; + register const UCHAR_T *p2 = (const UCHAR_T *) s2; + while (len) + { +#ifdef WCHAR + if (((*p1<=0xff)?translate[*p1++]:*p1++) + != ((*p2<=0xff)?translate[*p2++]:*p2++)) + return 1; +#else /* BYTE */ + if (translate[*p1++] != translate[*p2++]) return 1; +#endif /* WCHAR */ + len--; + } + return 0; +} + + +#else /* not INSIDE_RECURSION */ + +/* Entry points for GNU code. */ + +/* re_compile_pattern is the GNU regular expression compiler: it + compiles PATTERN (of length SIZE) 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. + + We call regex_compile to do the actual compilation. */ + +const char * +re_compile_pattern (pattern, length, bufp) + const char *pattern; + size_t length; + struct re_pattern_buffer *bufp; +{ + reg_errcode_t ret; + + /* GNU code is written to assume at least RE_NREGS registers will be set + (and at least one extra will be -1). */ + bufp->regs_allocated = REGS_UNALLOCATED; + + /* 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. */ + bufp->no_sub = 0; + + /* Match anchors at newline. */ + bufp->newline_anchor = 1; + +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (pattern, length, re_syntax_options, bufp); + else +# endif + ret = byte_regex_compile (pattern, length, re_syntax_options, bufp); + + 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 + +/* 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 below without link errors. */ +weak_function +#endif +re_comp (s) + const char *s; +{ + reg_errcode_t ret; + + if (!s) + { + if (!re_comp_buf.buffer) + return gettext ("No previous regular expression"); + return 0; + } + + if (!re_comp_buf.buffer) + { + re_comp_buf.buffer = (unsigned char *) malloc (200); + if (re_comp_buf.buffer == NULL) + return (char *) gettext (re_error_msgid + + re_error_msgid_idx[(int) REG_ESPACE]); + re_comp_buf.allocated = 200; + + re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); + 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; + +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); + else +# endif + ret = byte_regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); + + 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]); +} + + +int +#ifdef _LIBC +weak_function +#endif +re_exec (s) + const char *s; +{ + const int len = strlen (s); + return + 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); +} + +#endif /* _REGEX_RE_COMP */ + +/* POSIX.2 functions. Don't define these for Emacs. */ + +#ifndef emacs + +/* 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 *preg; + const char *pattern; + int cflags; +{ + reg_errcode_t ret; + reg_syntax_t syntax + = (cflags & REG_EXTENDED) ? + RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; + + /* regex_compile will allocate the space for the compiled pattern. */ + preg->buffer = 0; + preg->allocated = 0; + preg->used = 0; + + /* Try to allocate space for the fastmap. */ + preg->fastmap = (char *) malloc (1 << BYTEWIDTH); + + if (cflags & REG_ICASE) + { + unsigned i; + + preg->translate + = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE + * sizeof (*(RE_TRANSLATE_TYPE)0)); + if (preg->translate == NULL) + return (int) REG_ESPACE; + + /* Map uppercase characters to corresponding lowercase ones. */ + for (i = 0; i < CHAR_SET_SIZE; i++) + preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i; + } + else + preg->translate = NULL; + + /* 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); + + /* POSIX says a null character in the pattern terminates it, so we + can use strlen here in compiling the pattern. */ +# ifdef MBS_SUPPORT + if (MB_CUR_MAX != 1) + ret = wcs_regex_compile (pattern, strlen (pattern), syntax, preg); + else +# endif + ret = byte_regex_compile (pattern, strlen (pattern), syntax, preg); + + /* 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; + + if (ret == REG_NOERROR && preg->fastmap) + { + /* Compute the fastmap now, since regexec cannot modify the pattern + buffer. */ + if (re_compile_fastmap (preg) == -2) + { + /* Some error occurred while computing the fastmap, just forget + about it. */ + free (preg->fastmap); + preg->fastmap = NULL; + } + } + + return (int) ret; +} +#ifdef _LIBC +weak_alias (__regcomp, regcomp) +#endif + + +/* 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 *preg; + const char *string; + size_t nmatch; + regmatch_t pmatch[]; + int eflags; +{ + int ret; + struct re_registers regs; + regex_t private_preg; + int len = strlen (string); + boolean want_reg_info = !preg->no_sub && nmatch > 0; + + private_preg = *preg; + + private_preg.not_bol = !!(eflags & REG_NOTBOL); + private_preg.not_eol = !!(eflags & REG_NOTEOL); + + /* The user has told us exactly how many registers to return + information about, via `nmatch'. We have to pass that on to the + matching routines. */ + private_preg.regs_allocated = REGS_FIXED; + + if (want_reg_info) + { + regs.num_regs = nmatch; + regs.start = TALLOC (nmatch * 2, regoff_t); + if (regs.start == NULL) + return (int) REG_NOMATCH; + regs.end = regs.start + nmatch; + } + + /* Perform the searching operation. */ + ret = re_search (&private_preg, string, len, + /* start: */ 0, /* range: */ len, + want_reg_info ? ®s : (struct re_registers *) 0); + + /* Copy the register information to the POSIX structure. */ + if (want_reg_info) + { + if (ret >= 0) + { + unsigned r; + + for (r = 0; r < nmatch; r++) + { + pmatch[r].rm_so = regs.start[r]; + pmatch[r].rm_eo = regs.end[r]; + } + } + + /* If we needed the temporary register info, free the space now. */ + free (regs.start); + } + + /* We want zero return to mean success, unlike `re_search'. */ + return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; +} +#ifdef _LIBC +weak_alias (__regexec, regexec) +#endif + + +/* Returns a message corresponding to an error code, ERRCODE, returned + from either regcomp or regexec. We don't use PREG here. */ + +size_t +regerror (errcode, preg, errbuf, errbuf_size) + int errcode; + const regex_t *preg; + char *errbuf; + size_t errbuf_size; +{ + const char *msg; + size_t msg_size; + + if (errcode < 0 + || errcode >= (int) (sizeof (re_error_msgid_idx) + / sizeof (re_error_msgid_idx[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 (errbuf_size != 0) + { + if (msg_size > errbuf_size) + { +#if defined HAVE_MEMPCPY || defined _LIBC + *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; +#else + memcpy (errbuf, msg, errbuf_size - 1); + errbuf[errbuf_size - 1] = 0; +#endif + } + else + memcpy (errbuf, msg, msg_size); + } + + return msg_size; +} +#ifdef _LIBC +weak_alias (__regerror, regerror) +#endif + + +/* Free dynamically allocated space used by PREG. */ + +void +regfree (preg) + regex_t *preg; +{ + if (preg->buffer != NULL) + free (preg->buffer); + preg->buffer = NULL; + + preg->allocated = 0; + preg->used = 0; + + if (preg->fastmap != NULL) + free (preg->fastmap); + preg->fastmap = NULL; + preg->fastmap_accurate = 0; + + if (preg->translate != NULL) + free (preg->translate); + preg->translate = NULL; +} +#ifdef _LIBC +weak_alias (__regfree, regfree) +#endif + +#endif /* not emacs */ + +#endif /* not INSIDE_RECURSION */ + + +#undef STORE_NUMBER +#undef STORE_NUMBER_AND_INCR +#undef EXTRACT_NUMBER +#undef EXTRACT_NUMBER_AND_INCR + +#undef DEBUG_PRINT_COMPILED_PATTERN +#undef DEBUG_PRINT_DOUBLE_STRING + +#undef INIT_FAIL_STACK +#undef RESET_FAIL_STACK +#undef DOUBLE_FAIL_STACK +#undef PUSH_PATTERN_OP +#undef PUSH_FAILURE_POINTER +#undef PUSH_FAILURE_INT +#undef PUSH_FAILURE_ELT +#undef POP_FAILURE_POINTER +#undef POP_FAILURE_INT +#undef POP_FAILURE_ELT +#undef DEBUG_PUSH +#undef DEBUG_POP +#undef PUSH_FAILURE_POINT +#undef POP_FAILURE_POINT + +#undef REG_UNSET_VALUE +#undef REG_UNSET + +#undef PATFETCH +#undef PATFETCH_RAW +#undef PATUNFETCH +#undef TRANSLATE + +#undef INIT_BUF_SIZE +#undef GET_BUFFER_SPACE +#undef BUF_PUSH +#undef BUF_PUSH_2 +#undef BUF_PUSH_3 +#undef STORE_JUMP +#undef STORE_JUMP2 +#undef INSERT_JUMP +#undef INSERT_JUMP2 +#undef EXTEND_BUFFER +#undef GET_UNSIGNED_NUMBER +#undef FREE_STACK_RETURN + +# undef POINTER_TO_OFFSET +# undef MATCHING_IN_FRST_STRING +# undef PREFETCH +# undef AT_STRINGS_BEG +# undef AT_STRINGS_END +# undef WORDCHAR_P +# undef FREE_VAR +# undef FREE_VARIABLES +# undef NO_HIGHEST_ACTIVE_REG +# undef NO_LOWEST_ACTIVE_REG + +# undef CHAR_T +# undef UCHAR_T +# undef COMPILED_BUFFER_VAR +# undef OFFSET_ADDRESS_SIZE +# undef CHAR_CLASS_SIZE +# undef PREFIX +# undef ARG_PREFIX +# undef PUT_CHAR +# undef BYTE +# undef WCHAR + +# define DEFINED_ONCE diff --git a/gnu/dist/diffutils/lib/regex.hin b/gnu/dist/diffutils/lib/regex.hin new file mode 100644 index 00000000000..81789be8978 --- /dev/null +++ b/gnu/dist/diffutils/lib/regex.hin @@ -0,0 +1,46 @@ +#ifndef _REGEX_H +#include <posix/regex.h> + +/* Document internal interfaces. */ +extern reg_syntax_t __re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); + +extern const char *__re_compile_pattern + _RE_ARGS ((const char *pattern, size_t length, + struct re_pattern_buffer *buffer)); + +extern int __re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); + +extern int __re_search + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, int range, struct re_registers *regs)); + +extern int __re_search_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, int stop)); + +extern int __re_match + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs)); + +extern int __re_match_2 + _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int stop)); + +extern void __re_set_registers + _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, + unsigned num_regs, regoff_t *starts, regoff_t *ends)); + +extern int __regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern, + int __cflags)); + +extern int __regexec _RE_ARGS ((const regex_t *__preg, + const char *__string, size_t __nmatch, + regmatch_t __pmatch[], int __eflags)); + +extern size_t __regerror _RE_ARGS ((int __errcode, const regex_t *__preg, + char *__errbuf, size_t __errbuf_size)); + +extern void __regfree _RE_ARGS ((regex_t *__preg)); +#endif diff --git a/gnu/dist/diffutils/lib/setmode.c b/gnu/dist/diffutils/lib/setmode.c new file mode 100644 index 00000000000..3fa0f365a54 --- /dev/null +++ b/gnu/dist/diffutils/lib/setmode.c @@ -0,0 +1,64 @@ +/* $NetBSD: setmode.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Set a file descriptor's mode to binary or to text. + + Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com> */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_STDBOOL_H +# include <stdbool.h> +#else +typedef enum {false = 0, true = 1} bool; +#endif + +#if HAVE_SETMODE_DOS +# include <io.h> +# if HAVE_FCNTL_H +# include <fcntl.h> +# endif +# if HAVE_UNISTD_H +# include <unistd.h> +# endif +#endif + +#include "setmode.h" +#undef set_binary_mode + + +/* Set the binary mode of FD to MODE, returning its previous mode. + MODE is 1 for binary and 0 for text. If setting the mode might + cause problems, ignore the request and return MODE. Always return + 1 on POSIX platforms, which do not distinguish between text and + binary. */ + +bool +set_binary_mode (int fd, bool mode) +{ +#if HAVE_SETMODE_DOS + if (isatty (fd)) + return mode; + return setmode (fd, mode ? O_BINARY : O_TEXT) != O_TEXT; +#else + return 1; +#endif +} diff --git a/gnu/dist/diffutils/lib/setmode.h b/gnu/dist/diffutils/lib/setmode.h new file mode 100644 index 00000000000..e6e8d194d4a --- /dev/null +++ b/gnu/dist/diffutils/lib/setmode.h @@ -0,0 +1,29 @@ +/* $NetBSD: setmode.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* Set a file descriptor's mode to binary or to text. + + Copyright (C) 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert <eggert@twinsun.com> */ + +#ifndef set_binary_mode +bool set_binary_mode (int, bool); +# if ! HAVE_SETMODE_DOS +# define set_binary_mode(fd, mode) 1 +# endif +#endif diff --git a/gnu/dist/diffutils/lib/strcasecmp.c b/gnu/dist/diffutils/lib/strcasecmp.c new file mode 100644 index 00000000000..7ef3034226a --- /dev/null +++ b/gnu/dist/diffutils/lib/strcasecmp.c @@ -0,0 +1,68 @@ +/* $NetBSD: strcasecmp.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* strcasecmp.c -- case insensitive string comparator + Copyright (C) 1998, 1999 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef LENGTH_LIMIT +# define STRXCASECMP_FUNCTION strncasecmp +# define STRXCASECMP_DECLARE_N , size_t n +# define LENGTH_LIMIT_EXPR(Expr) Expr +#else +# define STRXCASECMP_FUNCTION strcasecmp +# define STRXCASECMP_DECLARE_N /* empty */ +# define LENGTH_LIMIT_EXPR(Expr) 0 +#endif + +#include <sys/types.h> +#include <ctype.h> + +#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) + +/* Compare {{no more than N characters of }}strings S1 and S2, + ignoring case, returning less than, equal to or + greater than zero if S1 is lexicographically less + than, equal to or greater than S2. */ + +int +STRXCASECMP_FUNCTION (const char *s1, const char *s2 STRXCASECMP_DECLARE_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 || LENGTH_LIMIT_EXPR (n == 0)) + return 0; + + do + { + c1 = TOLOWER (*p1); + c2 = TOLOWER (*p2); + + if (LENGTH_LIMIT_EXPR (--n == 0) || c1 == '\0') + break; + + ++p1; + ++p2; + } + while (c1 == c2); + + return c1 - c2; +} diff --git a/gnu/dist/diffutils/lib/strftime.c b/gnu/dist/diffutils/lib/strftime.c new file mode 100644 index 00000000000..6ee1ea370e6 --- /dev/null +++ b/gnu/dist/diffutils/lib/strftime.c @@ -0,0 +1,1408 @@ +/* $NetBSD: strftime.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef _LIBC +# define HAVE_LIMITS_H 1 +# define HAVE_MBLEN 1 +# define HAVE_MBRLEN 1 +# define HAVE_STRUCT_ERA_ENTRY 1 +# define HAVE_TM_GMTOFF 1 +# define HAVE_TM_ZONE 1 +# define HAVE_TZNAME 1 +# define HAVE_TZSET 1 +# define MULTIBYTE_IS_FORMAT_SAFE 1 +# define STDC_HEADERS 1 +# include "../locale/localeinfo.h" +#endif + +#if defined emacs && !defined HAVE_BCOPY +# define HAVE_MEMCPY 1 +#endif + +#include <ctype.h> +#include <sys/types.h> /* Some systems define `time_t' here. */ + +#ifdef TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif +#if HAVE_TZNAME +extern char *tzname[]; +#endif + +/* Do multibyte processing if multibytes are supported, unless + multibyte sequences are safe in formats. Multibyte sequences are + safe if they cannot contain byte sequences that look like format + conversion specifications. The GNU C Library uses UTF8 multibyte + encoding, which is safe for formats, but strftime.c can be used + with other C libraries that use unsafe encodings. */ +#define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE) + +#if DO_MULTIBYTE +# if HAVE_MBRLEN +# include <wchar.h> +# else + /* Simulate mbrlen with mblen as best we can. */ +# define mbstate_t int +# define mbrlen(s, n, ps) mblen (s, n) +# define mbsinit(ps) (*(ps) == 0) +# endif + static const mbstate_t mbstate_zero; +#endif + +#if HAVE_LIMITS_H +# include <limits.h> +#endif + +#if STDC_HEADERS +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#ifdef COMPILE_WIDE +# include <endian.h> +# define CHAR_T wchar_t +# define UCHAR_T unsigned int +# define L_(Str) L##Str +# define NLW(Sym) _NL_W##Sym + +# define MEMCPY(d, s, n) __wmemcpy (d, s, n) +# define STRLEN(s) __wcslen (s) + +#else +# define CHAR_T char +# define UCHAR_T unsigned char +# define L_(Str) Str +# define NLW(Sym) Sym + +# if !defined STDC_HEADERS && !defined HAVE_MEMCPY +# define MEMCPY(d, s, n) bcopy ((s), (d), (n)) +# else +# define MEMCPY(d, s, n) memcpy ((d), (s), (n)) +# endif +# define STRLEN(s) strlen (s) + +# ifdef _LIBC +# define MEMPCPY(d, s, n) __mempcpy (d, s, n) +# else +# ifndef HAVE_MEMPCPY +# define MEMPCPY(d, s, n) ((void *) ((char *) memcpy (d, s, n) + (n))) +# endif +# endif +#endif + +#ifndef __P +# if defined __GNUC__ || (defined __STDC__ && __STDC__) +# define __P(args) args +# else +# define __P(args) () +# endif /* GCC. */ +#endif /* Not __P. */ + +#ifndef PTR +# ifdef __STDC__ +# define PTR void * +# else +# define PTR char * +# endif +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +#ifndef NULL +# define NULL 0 +#endif + +#define TYPE_SIGNED(t) ((t) -1 < 0) + +/* Bound on length of the string representing an integer value of type t. + Subtract one for the sign bit if t is signed; + 302 / 1000 is log10 (2) rounded up; + add one for integer division truncation; + add one more for a minus sign if t is signed. */ +#define INT_STRLEN_BOUND(t) \ + ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t)) + +#define TM_YEAR_BASE 1900 + +#ifndef __isleap +/* Nonzero if YEAR is a leap year (every 4 years, + except every 100th isn't, and every 400th is). */ +# define __isleap(year) \ + ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) +#endif + + +#ifdef _LIBC +# define my_strftime_gmtime_r __gmtime_r +# define my_strftime_localtime_r __localtime_r +# define tzname __tzname +# define tzset __tzset +#else + +/* If we're a strftime substitute in a GNU program, then prefer gmtime + to gmtime_r, since many gmtime_r implementations are buggy. + Similarly for localtime_r. */ + +# if ! HAVE_TM_GMTOFF +static struct tm *my_strftime_gmtime_r __P ((const time_t *, struct tm *)); +static struct tm * +my_strftime_gmtime_r (t, tp) + const time_t *t; + struct tm *tp; +{ + struct tm *l = gmtime (t); + if (! l) + return 0; + *tp = *l; + return tp; +} + +static struct tm *my_strftime_localtime_r __P ((const time_t *, struct tm *)); +static struct tm * +my_strftime_localtime_r (t, tp) + const time_t *t; + struct tm *tp; +{ + struct tm *l = localtime (t); + if (! l) + return 0; + *tp = *l; + return tp; +} +# endif /* ! HAVE_TM_GMTOFF */ +#endif /* ! defined _LIBC */ + + +#if !defined memset && !defined HAVE_MEMSET && !defined _LIBC +/* Some systems lack the `memset' function and we don't want to + introduce additional dependencies. */ +/* The SGI compiler reportedly barfs on the trailing null + if we use a string constant as the initializer. 28 June 1997, rms. */ +static const CHAR_T spaces[16] = /* " " */ +{ + L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '), + L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' ') +}; +static const CHAR_T zeroes[16] = /* "0000000000000000" */ +{ + L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'), + L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0') +}; + +# define memset_space(P, Len) \ + do { \ + int _len = (Len); \ + \ + do \ + { \ + int _this = _len > 16 ? 16 : _len; \ + (P) = MEMPCPY ((P), spaces, _this * sizeof (CHAR_T)); \ + _len -= _this; \ + } \ + while (_len > 0); \ + } while (0) + +# define memset_zero(P, Len) \ + do { \ + int _len = (Len); \ + \ + do \ + { \ + int _this = _len > 16 ? 16 : _len; \ + (P) = MEMPCPY ((P), zeroes, _this * sizeof (CHAR_T)); \ + _len -= _this; \ + } \ + while (_len > 0); \ + } while (0) +#else +# ifdef COMPILE_WIDE +# define memset_space(P, Len) (wmemset ((P), L' ', (Len)), (P) += (Len)) +# define memset_zero(P, Len) (wmemset ((P), L'0', (Len)), (P) += (Len)) +# else +# define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len)) +# define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len)) +# endif +#endif + +#define add(n, f) \ + do \ + { \ + int _n = (n); \ + int _delta = width - _n; \ + int _incr = _n + (_delta > 0 ? _delta : 0); \ + if (i + _incr >= maxsize) \ + return 0; \ + if (p) \ + { \ + if (_delta > 0) \ + { \ + if (pad == L_('0')) \ + memset_zero (p, _delta); \ + else \ + memset_space (p, _delta); \ + } \ + f; \ + p += _n; \ + } \ + i += _incr; \ + } while (0) + +#define cpy(n, s) \ + add ((n), \ + if (to_lowcase) \ + memcpy_lowcase (p, (s), _n); \ + else if (to_uppcase) \ + memcpy_uppcase (p, (s), _n); \ + else \ + MEMCPY ((PTR) p, (const PTR) (s), _n)) + +#ifdef COMPILE_WIDE +# define widen(os, ws, l) \ + { \ + mbstate_t __st; \ + const char *__s = os; \ + memset (&__st, '\0', sizeof (__st)); \ + l = __mbsrtowcs (NULL, &__s, 0, &__st); \ + ws = alloca ((l + 1) * sizeof (wchar_t)); \ + (void) __mbsrtowcs (ws, &__s, l, &__st); \ + } +#endif + + +#ifdef COMPILE_WIDE +# define TOUPPER(Ch) towupper (Ch) +# define TOLOWER(Ch) towlower (Ch) +#else +# ifdef _LIBC +# define TOUPPER(Ch) toupper (Ch) +# define TOLOWER(Ch) tolower (Ch) +# else +# define TOUPPER(Ch) (islower (Ch) ? toupper (Ch) : (Ch)) +# define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch)) +# endif +#endif +/* We don't use `isdigit' here since the locale dependent + interpretation is not what we want here. We only need to accept + the arabic digits in the ASCII range. One day there is perhaps a + more reliable way to accept other sets of digits. */ +#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9) + +static CHAR_T *memcpy_lowcase __P ((CHAR_T *dest, const CHAR_T *src, + size_t len)); + +static CHAR_T * +memcpy_lowcase (dest, src, len) + CHAR_T *dest; + const CHAR_T *src; + size_t len; +{ + while (len-- > 0) + dest[len] = TOLOWER ((UCHAR_T) src[len]); + return dest; +} + +static CHAR_T *memcpy_uppcase __P ((CHAR_T *dest, const CHAR_T *src, + size_t len)); + +static CHAR_T * +memcpy_uppcase (dest, src, len) + CHAR_T *dest; + const CHAR_T *src; + size_t len; +{ + while (len-- > 0) + dest[len] = TOUPPER ((UCHAR_T) src[len]); + return dest; +} + + +#if ! HAVE_TM_GMTOFF +/* Yield the difference between *A and *B, + measured in seconds, ignoring leap seconds. */ +# define tm_diff ftime_tm_diff +static int tm_diff __P ((const struct tm *, const struct tm *)); +static int +tm_diff (a, b) + const struct tm *a; + const struct tm *b; +{ + /* Compute intervening leap days correctly even if year is negative. + Take care to avoid int overflow in leap day calculations, + but it's OK to assume that A and B are close to each other. */ + int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3); + int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3); + int a100 = a4 / 25 - (a4 % 25 < 0); + int b100 = b4 / 25 - (b4 % 25 < 0); + int a400 = a100 >> 2; + int b400 = b100 >> 2; + int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400); + int years = a->tm_year - b->tm_year; + 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 */ + + + +/* The number of days from the first day of the first ISO week of this + year to the year day YDAY with week day WDAY. ISO weeks start on + Monday; the first ISO week has the year's first Thursday. YDAY may + be as small as YDAY_MINIMUM. */ +#define ISO_WEEK_START_WDAY 1 /* Monday */ +#define ISO_WEEK1_WDAY 4 /* Thursday */ +#define YDAY_MINIMUM (-366) +static int iso_week_days __P ((int, int)); +#ifdef __GNUC__ +__inline__ +#endif +static int +iso_week_days (yday, wday) + int yday; + int wday; +{ + /* Add enough to the first operand of % to make it nonnegative. */ + int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7; + return (yday + - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7 + + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY); +} + + +#if !(defined _NL_CURRENT || HAVE_STRFTIME) +static CHAR_T const weekday_name[][10] = + { + L_("Sunday"), L_("Monday"), L_("Tuesday"), L_("Wednesday"), + L_("Thursday"), L_("Friday"), L_("Saturday") + }; +static CHAR_T const month_name[][10] = + { + L_("January"), L_("February"), L_("March"), L_("April"), L_("May"), + L_("June"), L_("July"), L_("August"), L_("September"), L_("October"), + L_("November"), L_("December") + }; +#endif + + +/* When compiling this file, GNU applications can #define my_strftime + to a symbol (typically nstrftime) to get an extended strftime with + extra arguments UT and NS. Emacs is a special case for now, but + this Emacs-specific code can be removed once Emacs's config.h + defines my_strftime. */ +#if defined emacs && !defined my_strftime +# define my_strftime nstrftime +#endif + +#ifdef my_strftime +# define extra_args , ut, ns +# define extra_args_spec int ut; int ns; +# define extra_args_spec_iso , int ut, int ns +#else +# ifdef COMPILE_WIDE +# define my_strftime wcsftime +# else +# define my_strftime strftime +# endif +# define extra_args +# define extra_args_spec +# define extra_args_spec_iso +/* We don't have this information in general. */ +# define ut 0 +# define ns 0 +#endif + +#if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET + /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime. + Work around this bug by copying *tp before it might be munged. */ + size_t _strftime_copytm __P ((char *, size_t, const char *, + const struct tm * extra_args_spec_iso)); + size_t + my_strftime (s, maxsize, format, tp extra_args) + CHAR_T *s; + size_t maxsize; + const CHAR_T *format; + const struct tm *tp; + extra_args_spec + { + struct tm tmcopy; + tmcopy = *tp; + return _strftime_copytm (s, maxsize, format, &tmcopy extra_args); + } +# undef my_strftime +# define my_strftime _strftime_copytm +#endif + + +/* Write information from TP into S according to the format + string FORMAT, writing no more that MAXSIZE characters + (including the terminating '\0') and returning number of + characters written. If S is NULL, nothing will be written + anywhere, so to determine how many characters would be + written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */ +size_t +my_strftime (s, maxsize, format, tp extra_args) + CHAR_T *s; + size_t maxsize; + const CHAR_T *format; + const struct tm *tp; + extra_args_spec +{ + int hour12 = tp->tm_hour; +#ifdef _NL_CURRENT + /* We cannot make the following values variables since we must delay + the evaluation of these values until really needed since some + expressions might not be valid in every situation. The `struct tm' + might be generated by a strptime() call that initialized + only a few elements. Dereference the pointers only if the format + requires this. Then it is ok to fail if the pointers are invalid. */ +# define a_wkday \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)) +# define f_wkday \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)) +# define a_month \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)) +# define f_month \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)) +# define ampm \ + ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ + ? NLW(PM_STR) : NLW(AM_STR))) + +# define aw_len STRLEN (a_wkday) +# define am_len STRLEN (a_month) +# define ap_len STRLEN (ampm) +#else +# if !HAVE_STRFTIME +# define f_wkday (weekday_name[tp->tm_wday]) +# define f_month (month_name[tp->tm_mon]) +# define a_wkday f_wkday +# define a_month f_month +# define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) + + size_t aw_len = 3; + size_t am_len = 3; + size_t ap_len = 2; +# endif +#endif + const char *zone; + size_t i = 0; + CHAR_T *p = s; + const CHAR_T *f; +#if DO_MULTIBYTE && !defined COMPILE_WIDE + const char *format_end = NULL; +#endif + + zone = NULL; +#if HAVE_TM_ZONE + /* The POSIX test suite assumes that setting + the environment variable TZ to a new value before calling strftime() + will influence the result (the %Z format) even if the information in + TP is computed with a totally different time zone. + This is bogus: though POSIX allows bad behavior like this, + POSIX does not require it. Do the right thing instead. */ + zone = (const char *) tp->tm_zone; +#endif +#if HAVE_TZNAME + if (ut) + { + if (! (zone && *zone)) + zone = "GMT"; + } + else + { + /* POSIX.1 8.1.1 requires that whenever strftime() is called, the + time zone names contained in the external variable `tzname' shall + be set as if the tzset() function had been called. */ +# if HAVE_TZSET + tzset (); +# endif + } +#endif + + if (hour12 > 12) + hour12 -= 12; + else + if (hour12 == 0) + hour12 = 12; + + for (f = format; *f != '\0'; ++f) + { + int pad = 0; /* Padding for number ('-', '_', or 0). */ + int modifier; /* Field modifier ('E', 'O', or 0). */ + int digits; /* Max digits for numeric format. */ + int number_value; /* Numeric value to be printed. */ + int negative_number; /* 1 if the number is negative. */ + const CHAR_T *subfmt; + CHAR_T *bufp; + CHAR_T buf[1 + (sizeof (int) < sizeof (time_t) + ? INT_STRLEN_BOUND (time_t) + : INT_STRLEN_BOUND (int))]; + int width = -1; + int to_lowcase = 0; + int to_uppcase = 0; + int change_case = 0; + int format_char; + +#if DO_MULTIBYTE && !defined COMPILE_WIDE + switch (*f) + { + case L_('%'): + break; + + case L_('\b'): case L_('\t'): case L_('\n'): + case L_('\v'): case L_('\f'): case L_('\r'): + 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_('~'): + /* The C Standard requires these 98 characters (plus '%') to + be in the basic execution character set. None of these + characters can start a multibyte sequence, so they need + not be analyzed further. */ + add (1, *p = *f); + continue; + + default: + /* Copy this multibyte sequence until we reach its end, find + an error, or come back to the initial shift state. */ + { + mbstate_t mbstate = mbstate_zero; + size_t len = 0; + size_t fsize; + + if (! format_end) + format_end = f + strlen (f) + 1; + fsize = format_end - f; + + do + { + size_t bytes = mbrlen (f + len, fsize - len, &mbstate); + + if (bytes == 0) + break; + + if (bytes == (size_t) -2) + { + len += strlen (f + len); + break; + } + + if (bytes == (size_t) -1) + { + len++; + break; + } + + len += bytes; + } + while (! mbsinit (&mbstate)); + + cpy (len, f); + f += len - 1; + continue; + } + } + +#else /* ! DO_MULTIBYTE */ + + /* Either multibyte encodings are not supported, they are + safe for formats, so any non-'%' byte can be copied through, + or this is the wide character version. */ + if (*f != L_('%')) + { + add (1, *p = *f); + continue; + } + +#endif /* ! DO_MULTIBYTE */ + + /* Check for flags that can modify a format. */ + while (1) + { + switch (*++f) + { + /* This influences the number formats. */ + case L_('_'): + case L_('-'): + case L_('0'): + pad = *f; + continue; + + /* This changes textual output. */ + case L_('^'): + to_uppcase = 1; + continue; + case L_('#'): + change_case = 1; + continue; + + default: + break; + } + break; + } + + /* As a GNU extension we allow to specify the field width. */ + if (ISDIGIT (*f)) + { + width = 0; + do + { + width *= 10; + width += *f - L_('0'); + ++f; + } + while (ISDIGIT (*f)); + } + + /* Check for modifiers. */ + switch (*f) + { + case L_('E'): + case L_('O'): + modifier = *f++; + break; + + default: + modifier = 0; + break; + } + + /* Now do the specified format. */ + format_char = *f; + switch (format_char) + { +#define DO_NUMBER(d, v) \ + digits = width == -1 ? d : width; \ + number_value = v; goto do_number +#define DO_NUMBER_SPACEPAD(d, v) \ + digits = width == -1 ? d : width; \ + number_value = v; goto do_number_spacepad + + case L_('%'): + if (modifier != 0) + goto bad_format; + add (1, *p = *f); + break; + + case L_('a'): + if (modifier != 0) + goto bad_format; + if (change_case) + { + to_uppcase = 1; + to_lowcase = 0; + } +#if defined _NL_CURRENT || !HAVE_STRFTIME + cpy (aw_len, a_wkday); + break; +#else + goto underlying_strftime; +#endif + + case 'A': + if (modifier != 0) + goto bad_format; + if (change_case) + { + to_uppcase = 1; + to_lowcase = 0; + } +#if defined _NL_CURRENT || !HAVE_STRFTIME + cpy (STRLEN (f_wkday), f_wkday); + break; +#else + goto underlying_strftime; +#endif + + case L_('b'): + case L_('h'): /* POSIX.2 extension. */ + if (change_case) + { + to_uppcase = 1; + to_lowcase = 0; + } + if (modifier != 0) + goto bad_format; +#if defined _NL_CURRENT || !HAVE_STRFTIME + cpy (am_len, a_month); + break; +#else + goto underlying_strftime; +#endif + + case L_('B'): + if (modifier != 0) + goto bad_format; + if (change_case) + { + to_uppcase = 1; + to_lowcase = 0; + } +#if defined _NL_CURRENT || !HAVE_STRFTIME + cpy (STRLEN (f_month), f_month); + break; +#else + goto underlying_strftime; +#endif + + case L_('c'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == 'E' + && (*(subfmt = + (const CHAR_T *) _NL_CURRENT (LC_TIME, + NLW(ERA_D_T_FMT))) + != '\0'))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT)); +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# else + subfmt = L_("%a %b %e %H:%M:%S %Y"); +# endif +#endif + + subformat: + { + CHAR_T *old_start = p; + size_t len = my_strftime (NULL, (size_t) -1, subfmt, + tp extra_args); + add (len, my_strftime (p, maxsize - i, subfmt, + tp extra_args)); + + if (to_uppcase) + while (old_start < p) + { + *old_start = TOUPPER ((UCHAR_T) *old_start); + ++old_start; + } + } + break; + +#if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY) + underlying_strftime: + { + /* The relevant information is available only via the + underlying strftime implementation, so use that. */ + char ufmt[4]; + char *u = ufmt; + char ubuf[1024]; /* enough for any single format in practice */ + size_t len; + /* Make sure we're calling the actual underlying strftime. + In some cases, config.h contains something like + "#define strftime rpl_strftime". */ +# ifdef strftime +# undef strftime + size_t strftime (); +# endif + + *u++ = '%'; + if (modifier != 0) + *u++ = modifier; + *u++ = format_char; + *u = '\0'; + len = strftime (ubuf, sizeof ubuf, ufmt, tp); + if (len == 0 && ubuf[0] != '\0') + return 0; + cpy (len, ubuf); + } + break; +#endif + + case L_('C'): /* POSIX.2 extension. */ + if (modifier == L_('O')) + goto bad_format; + if (modifier == L_('E')) + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp); + if (era) + { +# ifdef COMPILE_WIDE + size_t len = __wcslen (era->era_wname); + cpy (len, era->era_wname); +# else + size_t len = strlen (era->era_name); + cpy (len, era->era_name); +# endif + break; + } +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# endif +#endif + } + + { + int year = tp->tm_year + TM_YEAR_BASE; + DO_NUMBER (1, year / 100 - (year % 100 < 0)); + } + + case L_('x'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == L_('E') + && (*(subfmt = + (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT))) + != L_('\0')))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT)); + goto subformat; +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# else + /* Fall through. */ +# endif +#endif + case L_('D'): /* POSIX.2 extension. */ + if (modifier != 0) + goto bad_format; + subfmt = L_("%m/%d/%y"); + goto subformat; + + case L_('d'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_mday); + + case L_('e'): /* POSIX.2 extension. */ + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, tp->tm_mday); + + /* All numeric formats set DIGITS and NUMBER_VALUE and then + jump to one of these two labels. */ + + do_number_spacepad: + /* Force `_' flag unless overwritten by `0' flag. */ + if (pad != L_('0')) + pad = L_('_'); + + do_number: + /* Format the number according to the MODIFIER flag. */ + + if (modifier == L_('O') && 0 <= number_value) + { +#ifdef _NL_CURRENT + /* Get the locale specific alternate representation of + the number NUMBER_VALUE. If none exist NULL is returned. */ +# ifdef COMPILE_WIDE + const wchar_t *cp = _nl_get_walt_digit (number_value); +# else + const char *cp = _nl_get_alt_digit (number_value); +# endif + + if (cp != NULL) + { + size_t digitlen = STRLEN (cp); + if (digitlen != 0) + { + cpy (digitlen, cp); + break; + } + } +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# endif +#endif + } + { + unsigned int u = number_value; + + bufp = buf + sizeof (buf) / sizeof (buf[0]); + negative_number = number_value < 0; + + if (negative_number) + u = -u; + + do + *--bufp = u % 10 + L_('0'); + while ((u /= 10) != 0); + } + + do_number_sign_and_padding: + if (negative_number) + *--bufp = L_('-'); + + if (pad != L_('-')) + { + int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0])) + - bufp); + + if (pad == L_('_')) + { + while (0 < padding--) + *--bufp = L_(' '); + } + else + { + bufp += negative_number; + while (0 < padding--) + *--bufp = L_('0'); + if (negative_number) + *--bufp = L_('-'); + } + } + + cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp); + break; + + case L_('F'): + if (modifier != 0) + goto bad_format; + subfmt = L_("%Y-%m-%d"); + goto subformat; + + case L_('H'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_hour); + + case L_('I'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, hour12); + + case L_('k'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, tp->tm_hour); + + case L_('l'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER_SPACEPAD (2, hour12); + + case L_('j'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (3, 1 + tp->tm_yday); + + case L_('M'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_min); + + case L_('m'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_mon + 1); + + case L_('N'): /* GNU extension. */ + if (modifier == L_('E')) + goto bad_format; + + number_value = ns; + if (width != -1) + { + /* Take an explicit width less than 9 as a precision. */ + int j; + for (j = width; j < 9; j++) + number_value /= 10; + } + + DO_NUMBER (9, number_value); + + case L_('n'): /* POSIX.2 extension. */ + add (1, *p = L_('\n')); + break; + + case L_('P'): + to_lowcase = 1; +#if !defined _NL_CURRENT && HAVE_STRFTIME + format_char = L_('p'); +#endif + /* FALLTHROUGH */ + + case L_('p'): + if (change_case) + { + to_uppcase = 0; + to_lowcase = 1; + } +#if defined _NL_CURRENT || !HAVE_STRFTIME + cpy (ap_len, ampm); + break; +#else + goto underlying_strftime; +#endif + + case L_('R'): /* ISO C99 extension. */ + subfmt = L_("%H:%M"); + goto subformat; + + case L_('r'): /* POSIX.2 extension. */ +#ifdef _NL_CURRENT + if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, + NLW(T_FMT_AMPM))) + == L_('\0')) +#endif + subfmt = L_("%I:%M:%S %p"); + goto subformat; + + case L_('S'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, tp->tm_sec); + + case L_('s'): /* GNU extension. */ + { + struct tm ltm; + time_t t; + + ltm = *tp; + t = mktime (<m); + + /* Generate string value for T using time_t arithmetic; + this works even if sizeof (long) < sizeof (time_t). */ + + bufp = buf + sizeof (buf) / sizeof (buf[0]); + negative_number = t < 0; + + do + { + int d = t % 10; + t /= 10; + + if (negative_number) + { + d = -d; + + /* Adjust if division truncates to minus infinity. */ + if (0 < -1 % 10 && d < 0) + { + t++; + d += 10; + } + } + + *--bufp = d + L_('0'); + } + while (t != 0); + + digits = 1; + goto do_number_sign_and_padding; + } + + case L_('X'): + if (modifier == L_('O')) + goto bad_format; +#ifdef _NL_CURRENT + if (! (modifier == L_('E') + && (*(subfmt = + (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT))) + != L_('\0')))) + subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT)); + goto subformat; +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# else + /* Fall through. */ +# endif +#endif + case L_('T'): /* POSIX.2 extension. */ + subfmt = L_("%H:%M:%S"); + goto subformat; + + case L_('t'): /* POSIX.2 extension. */ + add (1, *p = L_('\t')); + break; + + case L_('u'): /* POSIX.2 extension. */ + DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1); + + case L_('U'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7); + + case L_('V'): + case L_('g'): /* ISO C99 extension. */ + case L_('G'): /* ISO C99 extension. */ + if (modifier == L_('E')) + goto bad_format; + { + int year = tp->tm_year + TM_YEAR_BASE; + int days = iso_week_days (tp->tm_yday, tp->tm_wday); + + if (days < 0) + { + /* This ISO week belongs to the previous year. */ + year--; + days = iso_week_days (tp->tm_yday + (365 + __isleap (year)), + tp->tm_wday); + } + else + { + int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)), + tp->tm_wday); + if (0 <= d) + { + /* This ISO week belongs to the next year. */ + year++; + days = d; + } + } + + switch (*f) + { + case L_('g'): + DO_NUMBER (2, (year % 100 + 100) % 100); + + case L_('G'): + DO_NUMBER (1, year); + + default: + DO_NUMBER (2, days / 7 + 1); + } + } + + case L_('W'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7); + + case L_('w'): + if (modifier == L_('E')) + goto bad_format; + + DO_NUMBER (1, tp->tm_wday); + + case L_('Y'): + if (modifier == 'E') + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp); + if (era) + { +# ifdef COMPILE_WIDE + subfmt = era->era_wformat; +# else + subfmt = era->era_format; +# endif + goto subformat; + } +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# endif +#endif + } + if (modifier == L_('O')) + goto bad_format; + else + DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); + + case L_('y'): + if (modifier == L_('E')) + { +#if HAVE_STRUCT_ERA_ENTRY + struct era_entry *era = _nl_get_era_entry (tp); + if (era) + { + int delta = tp->tm_year - era->start_date[0]; + DO_NUMBER (1, (era->offset + + delta * era->absolute_direction)); + } +#else +# if HAVE_STRFTIME + goto underlying_strftime; +# endif +#endif + } + DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100); + + case L_('Z'): + if (change_case) + { + to_uppcase = 0; + to_lowcase = 1; + } + +#if HAVE_TZNAME + /* The tzset() call might have changed the value. */ + if (!(zone && *zone) && tp->tm_isdst >= 0) + zone = tzname[tp->tm_isdst]; +#endif + if (! zone) + zone = ""; /* POSIX.2 requires the empty string here. */ + +#ifdef COMPILE_WIDE + { + /* The zone string is always given in multibyte form. We have + to transform it first. */ + wchar_t *wczone; + size_t len; + widen (zone, wczone, len); + cpy (len, wczone); + } +#else + cpy (strlen (zone), zone); +#endif + break; + + case L_('z'): /* ISO C99 extension. */ + if (tp->tm_isdst < 0) + break; + + { + int diff; +#if HAVE_TM_GMTOFF + diff = tp->tm_gmtoff; +#else + if (ut) + diff = 0; + else + { + struct tm gtm; + struct tm ltm; + time_t lt; + + ltm = *tp; + lt = mktime (<m); + + if (lt == (time_t) -1) + { + /* mktime returns -1 for errors, but -1 is also a + valid time_t value. Check whether an error really + occurred. */ + struct tm tm; + + if (! my_strftime_localtime_r (<, &tm) + || ((ltm.tm_sec ^ tm.tm_sec) + | (ltm.tm_min ^ tm.tm_min) + | (ltm.tm_hour ^ tm.tm_hour) + | (ltm.tm_mday ^ tm.tm_mday) + | (ltm.tm_mon ^ tm.tm_mon) + | (ltm.tm_year ^ tm.tm_year))) + break; + } + + if (! my_strftime_gmtime_r (<, >m)) + break; + + diff = tm_diff (<m, >m); + } +#endif + + if (diff < 0) + { + add (1, *p = L_('-')); + diff = -diff; + } + else + add (1, *p = L_('+')); + + diff /= 60; + DO_NUMBER (4, (diff / 60) * 100 + diff % 60); + } + + case L_('\0'): /* GNU extension: % at end of format. */ + --f; + /* Fall through. */ + default: + /* Unknown format; output the format, including the '%', + since this is most likely the right thing to do if a + multibyte string has been misparsed. */ + bad_format: + { + int flen; + for (flen = 1; f[1 - flen] != L_('%'); flen++) + continue; + cpy (flen, &f[1 - flen]); + } + break; + } + } + + if (p && maxsize != 0) + *p = L_('\0'); + return i; +} + + +#ifdef emacs +/* For Emacs we have a separate interface which corresponds to the normal + strftime function plus the ut argument, but without the ns argument. */ +size_t +emacs_strftimeu (s, maxsize, format, tp, ut) + char *s; + size_t maxsize; + const char *format; + const struct tm *tp; + int ut; +{ + return my_strftime (s, maxsize, format, tp, ut, 0); +} +#endif diff --git a/gnu/dist/diffutils/lib/strtoimax.c b/gnu/dist/diffutils/lib/strtoimax.c new file mode 100644 index 00000000000..c86d77959f1 --- /dev/null +++ b/gnu/dist/diffutils/lib/strtoimax.c @@ -0,0 +1,103 @@ +/* $NetBSD: strtoimax.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Convert string representation of a number into an intmax_t value. + + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifndef PARAMS +# if defined PROTOTYPES || defined __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +#endif + +/* Verify a requirement at compile-time (unlike assert, which is runtime). */ +#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } + +#ifdef UNSIGNED +# ifndef HAVE_DECL_STRTOUL +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRTOUL +unsigned long strtoul PARAMS ((char const *, char **, int)); +# endif +# ifndef HAVE_DECL_STRTOULL +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG +unsigned long long strtoull PARAMS ((char const *, char **, int)); +# endif + +#else + +# ifndef HAVE_DECL_STRTOL +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRTOL +long strtol PARAMS ((char const *, char **, int)); +# endif +# ifndef HAVE_DECL_STRTOLL +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRTOLL && HAVE_UNSIGNED_LONG_LONG +long long strtoll PARAMS ((char const *, char **, int)); +# endif +#endif + +#ifdef UNSIGNED +# undef HAVE_LONG_LONG +# define HAVE_LONG_LONG HAVE_UNSIGNED_LONG_LONG +# define INT uintmax_t +# define strtoimax strtoumax +# define strtol strtoul +# define strtoll strtoull +#else +# define INT intmax_t +#endif + +INT +strtoimax (char const *ptr, char **endptr, int base) +{ +#if HAVE_LONG_LONG + verify (size_is_that_of_long_or_long_long, + (sizeof (INT) == sizeof (long) + || sizeof (INT) == sizeof (long long))); + + if (sizeof (INT) != sizeof (long)) + return strtoll (ptr, endptr, base); +#else + verify (size_is_that_of_long, + sizeof (INT) == sizeof (long)); +#endif + + return strtol (ptr, endptr, base); +} diff --git a/gnu/dist/diffutils/lib/strtol.c b/gnu/dist/diffutils/lib/strtol.c new file mode 100644 index 00000000000..f8efabdf44a --- /dev/null +++ b/gnu/dist/diffutils/lib/strtol.c @@ -0,0 +1,474 @@ +/* $NetBSD: strtol.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Convert string representation of a number into an integer value. + Copyright (C) 1991, 92, 94, 95, 96, 97, 98, 99 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef _LIBC +# define USE_NUMBER_GROUPING +# define STDC_HEADERS +# define HAVE_LIMITS_H +#endif + +#include <ctype.h> +#include <errno.h> +#ifndef errno +extern int errno; +#endif +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +#ifdef STDC_HEADERS +# include <stddef.h> +# include <stdlib.h> +# include <string.h> +#else +# ifndef NULL +# define NULL 0 +# endif +#endif + +#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 work around common compiler bugs, + e.g. Cray C 5.0.3.0 when t == time_t. */ +# ifndef TYPE_SIGNED +# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +# endif +# ifndef TYPE_MINIMUM +# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ + : (t) 0)) +# endif +# ifndef TYPE_MAXIMUM +# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) +# endif + +# 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 + +# ifndef ULONG_MAX +# define ULONG_MAX ((unsigned long) ~(unsigned long) 0) +# endif +# ifndef LONG_MAX +# define LONG_MAX ((long int) (ULONG_MAX >> 1)) +# endif +# 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_DECL __locale_t loc; +#else +# define LOCALE_PARAM +# define LOCALE_PARAM_DECL +#endif + +#if defined _LIBC || defined HAVE_WCHAR_H +# include <wchar.h> +#endif + +#ifdef USE_WIDE_CHAR +# include <wctype.h> +# define L_(Ch) L##Ch +# define UCHAR_TYPE wint_t +# define STRING_TYPE wchar_t +# ifdef USE_IN_EXTENDED_LOCALE_MODEL +# define ISSPACE(Ch) __iswspace_l ((Ch), loc) +# define ISALPHA(Ch) __iswalpha_l ((Ch), loc) +# define TOUPPER(Ch) __towupper_l ((Ch), loc) +# else +# define ISSPACE(Ch) iswspace (Ch) +# define ISALPHA(Ch) iswalpha (Ch) +# define TOUPPER(Ch) towupper (Ch) +# endif +#else +# if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define IN_CTYPE_DOMAIN(c) 1 +# else +# define IN_CTYPE_DOMAIN(c) isascii(c) +# endif +# 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) (IN_CTYPE_DOMAIN (Ch) && isspace (Ch)) +# define ISALPHA(Ch) (IN_CTYPE_DOMAIN (Ch) && isalpha (Ch)) +# define TOUPPER(Ch) (IN_CTYPE_DOMAIN (Ch) ? toupper (Ch) : (Ch)) +# endif +#endif + +/* For compilers which are ansi but don't define __STDC__, like SGI + Irix-4.0.5 cc, also check whether PROTOTYPES is defined. */ +#if defined (__STDC__) || defined (PROTOTYPES) +# define INTERNAL(X) INTERNAL1(X) +# define INTERNAL1(X) __##X##_internal +# define WEAKNAME(X) WEAKNAME1(X) +#else +# define INTERNAL(X) __/**/X/**/_internal +#endif + +#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) (nptr, endptr, base, group LOCALE_PARAM) + const STRING_TYPE *nptr; + STRING_TYPE **endptr; + int base; + int group; + LOCALE_PARAM_DECL +{ + int negative; + register unsigned LONG int cutoff; + register unsigned int cutlim; + register unsigned LONG int i; + register const STRING_TYPE *s; + register UCHAR_TYPE c; + const STRING_TYPE *save, *end; + int overflow; + +#ifdef USE_NUMBER_GROUPING +# ifdef USE_IN_EXTENDED_LOCALE_MODEL + struct locale_data *current = loc->__locales[LC_NUMERIC]; +# endif + /* The thousands character of the current locale. */ + wchar_t thousands = L'\0'; + /* The numeric grouping specification of the current locale, + in the format described in <locale.h>. */ + const char *grouping; + + if (group) + { + grouping = _NL_CURRENT (LC_NUMERIC, GROUPING); + if (*grouping <= 0 || *grouping == CHAR_MAX) + grouping = NULL; + else + { + /* Figure out the thousands separator character. */ +# if defined _LIBC || defined _HAVE_BTOWC + thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP)); + if (thousands == WEOF) + thousands = L'\0'; +# endif + if (thousands == L'\0') + grouping = NULL; + } + } + else + grouping = NULL; +#endif + + if (base < 0 || base == 1 || base > 36) + { + __set_errno (EINVAL); + return 0; + } + + save = s = nptr; + + /* Skip white space. */ + while (ISSPACE (*s)) + ++s; + if (*s == L_('\0')) + goto noconv; + + /* Check for a sign. */ + if (*s == L_('-')) + { + negative = 1; + ++s; + } + else if (*s == L_('+')) + { + negative = 0; + ++s; + } + else + negative = 0; + + /* Recognize number prefix and if BASE is zero, figure it out ourselves. */ + if (*s == L_('0')) + { + if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X')) + { + s += 2; + base = 16; + } + else if (base == 0) + base = 8; + } + else if (base == 0) + base = 10; + + /* Save the pointer so we can check later if anything happened. */ + save = s; + +#ifdef USE_NUMBER_GROUPING + if (group) + { + /* Find the end of the digit string and check its grouping. */ + end = s; + for (c = *end; c != L_('\0'); c = *++end) + if ((wchar_t) c != thousands + && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9')) + && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base)) + break; + if (*s == thousands) + end = s; + else + end = correctly_grouped_prefix (s, end, thousands, grouping); + } + else +#endif + end = NULL; + + cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base; + cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base; + + overflow = 0; + i = 0; + for (c = *s; c != L_('\0'); c = *++s) + { + if (s == end) + break; + if (c >= L_('0') && c <= L_('9')) + c -= L_('0'); + else if (ISALPHA (c)) + c = TOUPPER (c) - L_('A') + 10; + else + break; + if ((int) c >= base) + break; + /* Check for overflow. */ + if (i > cutoff || (i == cutoff && c > cutlim)) + overflow = 1; + else + { + i *= (unsigned LONG int) base; + i += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) + goto noconv; + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr != NULL) + *endptr = (STRING_TYPE *) s; + +#if !UNSIGNED + /* Check for a value that is within the range of + `unsigned LONG int', but outside the range of `LONG int'. */ + if (overflow == 0 + && i > (negative + ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1 + : (unsigned LONG int) STRTOL_LONG_MAX)) + overflow = 1; +#endif + + if (overflow) + { + __set_errno (ERANGE); +#if UNSIGNED + return STRTOL_ULONG_MAX; +#else + return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX; +#endif + } + + /* Return the result of the appropriate sign. */ + return negative ? -i : i; + +noconv: + /* We must handle a special case here: the base is 0 or 16 and the + first two characters are '0' and 'x', but the rest are no + hexadecimal digits. This is no error case. We return 0 and + ENDPTR points to the `x`. */ + if (endptr != NULL) + { + if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X') + && save[-2] == L_('0')) + *endptr = (STRING_TYPE *) &save[-1]; + else + /* There was no number to convert. */ + *endptr = (STRING_TYPE *) nptr; + } + + return 0L; +} + +/* External user entry point. */ + +#if _LIBC - 0 == 0 +# undef PARAMS +# if defined (__STDC__) && __STDC__ +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif + +/* Prototype. */ +INT strtol PARAMS ((const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)); +#endif + + +INT +#ifdef weak_function +weak_function +#endif +strtol (nptr, endptr, base LOCALE_PARAM) + const STRING_TYPE *nptr; + STRING_TYPE **endptr; + int base; + LOCALE_PARAM_DECL +{ + return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM); +} diff --git a/gnu/dist/diffutils/lib/strtoul.c b/gnu/dist/diffutils/lib/strtoul.c new file mode 100644 index 00000000000..3f7305a794f --- /dev/null +++ b/gnu/dist/diffutils/lib/strtoul.c @@ -0,0 +1,24 @@ +/* $NetBSD: strtoul.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Copyright (C) 1991, 1999, 2001 Free Software Foundation, Inc. + +NOTE: The canonical source of this file is maintained with the GNU C Library. +Bugs can be reported to bug-glibc@prep.ai.mit.edu. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define UNSIGNED 1 + +#include "strtol.c" diff --git a/gnu/dist/diffutils/lib/strtoull.c b/gnu/dist/diffutils/lib/strtoull.c new file mode 100644 index 00000000000..342584c96bd --- /dev/null +++ b/gnu/dist/diffutils/lib/strtoull.c @@ -0,0 +1,29 @@ +/* $NetBSD: strtoull.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Function to parse an `unsigned long long int' from text. + Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define QUAD 1 + +#include "strtoul.c" + +#ifdef _LIBC +strong_alias (__strtoull_internal, __strtouq_internal) +weak_alias (strtoull, strtouq) +#endif diff --git a/gnu/dist/diffutils/lib/strtoumax.c b/gnu/dist/diffutils/lib/strtoumax.c new file mode 100644 index 00000000000..849b61bf04d --- /dev/null +++ b/gnu/dist/diffutils/lib/strtoumax.c @@ -0,0 +1,4 @@ +/* $NetBSD: strtoumax.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +#define UNSIGNED 1 +#include "strtoimax.c" diff --git a/gnu/dist/diffutils/lib/tempname.c b/gnu/dist/diffutils/lib/tempname.c new file mode 100644 index 00000000000..6c359274961 --- /dev/null +++ b/gnu/dist/diffutils/lib/tempname.c @@ -0,0 +1,344 @@ +/* $NetBSD: tempname.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Copyright (C) 1991-1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> +#include <assert.h> + +#include <errno.h> +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#include <stdio.h> +#ifndef P_tmpdir +# define P_tmpdir "/tmp" +#endif +#ifndef TMP_MAX +# define TMP_MAX 238328 +#endif +#ifndef __GT_FILE +# define __GT_FILE 0 +# define __GT_BIGFILE 1 +# define __GT_DIR 2 +# define __GT_NOCREATE 3 +#endif + +#if STDC_HEADERS || _LIBC +# include <stddef.h> +# include <string.h> +#endif + +#include <stdlib.h> + +#if HAVE_FCNTL_H || _LIBC +# include <fcntl.h> +#endif + +#if HAVE_SYS_TIME_H || _LIBC +# include <sys/time.h> +#endif + +#if HAVE_STDINT_H || _LIBC +# include <stdint.h> +#endif + +#if HAVE_UNISTD_H || _LIBC +# include <unistd.h> +#endif + +#include <sys/stat.h> +#if STAT_MACROS_BROKEN +# undef S_ISDIR +#endif +#if !defined S_ISDIR && defined S_IFDIR +# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) +#endif +#if !S_IRUSR && S_IREAD +# define S_IRUSR S_IREAD +#endif +#if !S_IRUSR +# define S_IRUSR 00400 +#endif +#if !S_IWUSR && S_IWRITE +# define S_IWUSR S_IWRITE +#endif +#if !S_IWUSR +# define S_IWUSR 00200 +#endif +#if !S_IXUSR && S_IEXEC +# define S_IXUSR S_IEXEC +#endif +#if !S_IXUSR +# define S_IXUSR 00100 +#endif + +#if _LIBC +# define struct_stat64 struct stat64 +#else +# define struct_stat64 struct stat +# define __getpid getpid +# define __gettimeofday gettimeofday +# define __mkdir mkdir +# define __open open +# define __open64 open +# define __lxstat64(version, path, buf) lstat (path, buf) +# define __xstat64(version, path, buf) stat (path, buf) +#endif + +#if ! (HAVE___SECURE_GETENV || _LIBC) +# define __secure_getenv getenv +#endif + +#ifdef _LIBC +# include <hp-timing.h> +# if HP_TIMING_AVAIL +# define RANDOM_BITS(Var) \ + if (__builtin_expect (value == UINT64_C (0), 0)) \ + { \ + /* If this is the first time this function is used initialize \ + the variable we accumulate the value in to some somewhat \ + random value. If we'd not do this programs at startup time \ + might have a reduced set of possible names, at least on slow \ + machines. */ \ + struct timeval tv; \ + __gettimeofday (&tv, NULL); \ + value = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; \ + } \ + HP_TIMING_NOW (Var) +# endif +#endif + +/* Use the widest available unsigned type if uint64_t is not + available. The algorithm below extracts a number less than 62**6 + (approximately 2**35.725) from uint64_t, so ancient hosts where + uintmax_t is only 32 bits lose about 3.725 bits of randomness, + which is better than not having mkstemp at all. */ +#if !defined UINT64_MAX && !defined uint64_t +# define uint64_t uintmax_t +#endif + +/* 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; +} + +/* These are the characters used in temporary filenames. */ +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. */ + unsigned int 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. */ + unsigned int attempts = attempts_min < TMP_MAX ? TMP_MAX : attempts_min; + + 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 +# if HAVE_GETTIMEOFDAY || _LIBC + { + struct timeval tv; + __gettimeofday (&tv, NULL); + random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; + } +# else + random_time_bits = time (NULL); +# endif +#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 = __open (tmpl, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); + break; + + case __GT_BIGFILE: + fd = __open64 (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/gnu/dist/diffutils/lib/umaxtostr.c b/gnu/dist/diffutils/lib/umaxtostr.c new file mode 100644 index 00000000000..2ee6dbefc43 --- /dev/null +++ b/gnu/dist/diffutils/lib/umaxtostr.c @@ -0,0 +1,5 @@ +/* $NetBSD: umaxtostr.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +#define inttostr umaxtostr +#define inttype uintmax_t +#include "inttostr.c" diff --git a/gnu/dist/diffutils/lib/unlocked-io.h b/gnu/dist/diffutils/lib/unlocked-io.h new file mode 100644 index 00000000000..a649802c066 --- /dev/null +++ b/gnu/dist/diffutils/lib/unlocked-io.h @@ -0,0 +1,71 @@ +/* $NetBSD: unlocked-io.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +#ifndef UNLOCKED_IO_H +# define UNLOCKED_IO_H 1 + +# ifndef USE_UNLOCKED_IO +# define USE_UNLOCKED_IO 1 +# endif + +# if USE_UNLOCKED_IO + +/* These are wrappers for functions/macros from GNU libc. + 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. */ + +# if HAVE_DECL_CLEARERR_UNLOCKED +# undef clearerr +# define clearerr(x) clearerr_unlocked (x) +# endif +# if HAVE_DECL_FEOF_UNLOCKED +# undef feof +# define feof(x) feof_unlocked (x) +# endif +# if HAVE_DECL_FERROR_UNLOCKED +# undef ferror +# define ferror(x) ferror_unlocked (x) +# endif +# if HAVE_DECL_FFLUSH_UNLOCKED +# undef fflush +# define fflush(x) fflush_unlocked (x) +# endif +# if HAVE_DECL_FGETS_UNLOCKED +# undef fgets +# define fgets(x,y,z) fgets_unlocked (x,y,z) +# endif +# if HAVE_DECL_FPUTC_UNLOCKED +# undef fputc +# define fputc(x,y) fputc_unlocked (x,y) +# endif +# if HAVE_DECL_FPUTS_UNLOCKED +# undef fputs +# define fputs(x,y) fputs_unlocked (x,y) +# endif +# if HAVE_DECL_FREAD_UNLOCKED +# undef fread +# define fread(w,x,y,z) fread_unlocked (w,x,y,z) +# endif +# if HAVE_DECL_FWRITE_UNLOCKED +# undef fwrite +# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z) +# endif +# if HAVE_DECL_GETC_UNLOCKED +# undef getc +# define getc(x) getc_unlocked (x) +# endif +# if HAVE_DECL_GETCHAR_UNLOCKED +# undef getchar +# define getchar() getchar_unlocked () +# endif +# if HAVE_DECL_PUTC_UNLOCKED +# undef putc +# define putc(x,y) putc_unlocked (x,y) +# endif +# if HAVE_DECL_PUTCHAR_UNLOCKED +# undef putchar +# define putchar(x) putchar_unlocked (x) +# endif + +# endif /* USE_UNLOCKED_IO */ +#endif /* UNLOCKED_IO_H */ diff --git a/gnu/dist/diffutils/lib/waitpid.c b/gnu/dist/diffutils/lib/waitpid.c new file mode 100644 index 00000000000..56ac7a1968c --- /dev/null +++ b/gnu/dist/diffutils/lib/waitpid.c @@ -0,0 +1,74 @@ +/* $NetBSD: waitpid.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* Emulate waitpid on systems that just have wait. + Copyright (C) 1994, 1995, 1998, 1999 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <errno.h> +#ifndef errno +extern int errno; +#endif + +#define WAITPID_CHILDREN 8 +static pid_t waited_pid[WAITPID_CHILDREN]; +static int waited_status[WAITPID_CHILDREN]; + +pid_t +waitpid (pid_t pid, int *stat_loc, int options) +{ + int i; + pid_t p; + + if (!options && (pid == -1 || 0 < pid)) + { + /* If we have already waited for this child, return it immediately. */ + for (i = 0; i < WAITPID_CHILDREN; i++) + { + p = waited_pid[i]; + if (p && (p == pid || pid == -1)) + { + waited_pid[i] = 0; + goto success; + } + } + + /* The child has not returned yet; wait for it, accumulating status. */ + for (i = 0; i < WAITPID_CHILDREN; i++) + if (! waited_pid[i]) + { + p = wait (&waited_status[i]); + if (p < 0) + return p; + if (p == pid || pid == -1) + goto success; + waited_pid[i] = p; + } + } + + /* We cannot emulate this wait call, e.g. because of too many children. */ + errno = EINVAL; + return -1; + +success: + if (stat_loc) + *stat_loc = waited_status[i]; + return p; +} diff --git a/gnu/dist/diffutils/lib/xalloc.h b/gnu/dist/diffutils/lib/xalloc.h new file mode 100644 index 00000000000..237f8ec2f2b --- /dev/null +++ b/gnu/dist/diffutils/lib/xalloc.h @@ -0,0 +1,84 @@ +/* $NetBSD: xalloc.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* xalloc.h -- malloc with out-of-memory checking + Copyright (C) 1990-1998, 1999, 2000, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef XALLOC_H_ +# define XALLOC_H_ + +# ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +# endif + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +# endif + +# ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +# endif + +/* If this pointer is non-zero, run the specified function upon each + allocation failure. It is initialized to zero. */ +extern void (*xalloc_fail_func) PARAMS ((void)); + +/* If XALLOC_FAIL_FUNC is undefined or a function that returns, this + message is output. It is translated via gettext. + Its value is "memory exhausted". */ +extern char const xalloc_msg_memory_exhausted[]; + +/* This function is always triggered when memory is exhausted. It is + in charge of honoring the three previous items. This is the + function to call when one wants the program to die because of a + memory allocation failure. */ +extern void xalloc_die PARAMS ((void)) ATTRIBUTE_NORETURN; + +void *xmalloc PARAMS ((size_t n)); +void *xcalloc PARAMS ((size_t n, size_t s)); +void *xrealloc PARAMS ((void *p, size_t n)); +char *xstrdup PARAMS ((const char *str)); + +# define XMALLOC(Type, N_items) ((Type *) xmalloc (sizeof (Type) * (N_items))) +# define XCALLOC(Type, N_items) ((Type *) xcalloc (sizeof (Type), (N_items))) +# define XREALLOC(Ptr, Type, N_items) \ + ((Type *) xrealloc ((void *) (Ptr), sizeof (Type) * (N_items))) + +/* Declare and alloc memory for VAR of type TYPE. */ +# define NEW(Type, Var) Type *(Var) = XMALLOC (Type, 1) + +/* Free VAR only if non NULL. */ +# define XFREE(Var) \ + do { \ + if (Var) \ + free (Var); \ + } while (0) + +/* Return a pointer to a malloc'ed copy of the array SRC of NUM elements. */ +# define CCLONE(Src, Num) \ + (memcpy (xmalloc (sizeof (*Src) * (Num)), (Src), sizeof (*Src) * (Num))) + +/* Return a malloc'ed copy of SRC. */ +# define CLONE(Src) CCLONE (Src, 1) + + +#endif /* !XALLOC_H_ */ diff --git a/gnu/dist/diffutils/lib/xmalloc.c b/gnu/dist/diffutils/lib/xmalloc.c new file mode 100644 index 00000000000..5796053b900 --- /dev/null +++ b/gnu/dist/diffutils/lib/xmalloc.c @@ -0,0 +1,115 @@ +/* $NetBSD: xmalloc.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* xmalloc.c -- malloc with out of memory checking + Copyright (C) 1990-1999, 2000, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <sys/types.h> + +#if STDC_HEADERS +# include <stdlib.h> +#else +void *calloc (); +void *malloc (); +void *realloc (); +void free (); +#endif + +#if ENABLE_NLS +# include <libintl.h> +# define _(Text) gettext (Text) +#else +# define textdomain(Domain) +# define _(Text) Text +#endif +#define N_(Text) Text + +#include "error.h" +#include "exitfail.h" +#include "xalloc.h" + +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +#ifndef HAVE_DONE_WORKING_MALLOC_CHECK +"you must run the autoconf test for a properly working malloc -- see malloc.m4" +#endif + +#ifndef HAVE_DONE_WORKING_REALLOC_CHECK +"you must run the autoconf test for a properly working realloc --see realloc.m4" +#endif + +/* If non NULL, call this function when memory is exhausted. */ +void (*xalloc_fail_func) PARAMS ((void)) = 0; + +/* If XALLOC_FAIL_FUNC is NULL, or does return, display this message + before exiting when memory is exhausted. Goes through gettext. */ +char const xalloc_msg_memory_exhausted[] = N_("memory exhausted"); + +void +xalloc_die (void) +{ + if (xalloc_fail_func) + (*xalloc_fail_func) (); + error (exit_failure, 0, "%s", _(xalloc_msg_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 terminate, call exit. */ + exit (EXIT_FAILURE); +} + +/* Allocate N bytes of memory dynamically, with error checking. */ + +void * +xmalloc (size_t n) +{ + void *p; + + p = malloc (n); + if (p == 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 == 0) + xalloc_die (); + return p; +} + +/* Allocate memory for N elements of S bytes, with error checking. */ + +void * +xcalloc (size_t n, size_t s) +{ + void *p; + + p = calloc (n, s); + if (p == 0) + xalloc_die (); + return p; +} diff --git a/gnu/dist/diffutils/lib/xstrtol.c b/gnu/dist/diffutils/lib/xstrtol.c new file mode 100644 index 00000000000..4c8a85338bc --- /dev/null +++ b/gnu/dist/diffutils/lib/xstrtol.c @@ -0,0 +1,304 @@ +/* $NetBSD: xstrtol.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* A more useful interface to strtol. + Copyright (C) 1995, 1996, 1998-2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Jim Meyering. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#ifndef __strtol +# define __strtol strtol +# define __strtol_t long int +# define __xstrtol xstrtol +#endif + +/* Some pre-ANSI implementations (e.g. SunOS 4) + need stderr defined if assertion checking is enabled. */ +#include <stdio.h> + +#if STDC_HEADERS +# include <stdlib.h> +#endif + +#if HAVE_STRING_H +# include <string.h> +#else +# include <strings.h> +# ifndef strchr +# define strchr index +# endif +#endif + +#include <assert.h> +#include <ctype.h> + +#include <errno.h> +#ifndef errno +extern int errno; +#endif + +#if HAVE_LIMITS_H +# include <limits.h> +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +/* The extra casts work around common compiler bugs. */ +#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +/* The outer cast is needed to work around a bug in Cray C 5.0.3.0. + It is necessary at least when t == time_t. */ +#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0)) +#define TYPE_MAXIMUM(t) (~ (t) 0 - TYPE_MINIMUM (t)) + +#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) +# define IN_CTYPE_DOMAIN(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) isascii(c) +#endif + +#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c)) + +#include "xstrtol.h" + +#if !HAVE_DECL_STRTOL && !defined strtol +long int strtol (); +#endif + +#if !HAVE_DECL_STRTOUL && !defined strtoul +unsigned long int strtoul (); +#endif + +#if !HAVE_DECL_STRTOIMAX && !defined strtoimax +intmax_t strtoimax (); +#endif + +#if !HAVE_DECL_STRTOUMAX && !defined strtoumax +uintmax_t strtoumax (); +#endif + +static int +bkm_scale (__strtol_t *x, int scale_factor) +{ + __strtol_t product = *x * scale_factor; + if (*x != product / scale_factor) + return 1; + *x = product; + return 0; +} + +static int +bkm_scale_by_power (__strtol_t *x, int base, int power) +{ + while (power--) + if (bkm_scale (x, base)) + return 1; + + return 0; +} + +/* 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; + + assert (0 <= strtol_base && strtol_base <= 36); + + p = (ptr ? ptr : &t_ptr); + + if (! TYPE_SIGNED (__strtol_t)) + { + const char *q = s; + while (ISSPACE ((unsigned char) *q)) + ++q; + if (*q == '-') + return LONGINT_INVALID; + } + + errno = 0; + tmp = __strtol (s, p, strtol_base); + if (errno != 0) + return LONGINT_OVERFLOW; + + 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; + } + + /* 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 LONGINT_OK; + } + + if (**p != '\0') + { + int base = 1024; + int suffixes = 1; + int overflow; + + if (!strchr (valid_suffixes, **p)) + { + *val = tmp; + return 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 LONGINT_INVALID_SUFFIX_CHAR; + break; + } + + if (overflow) + return LONGINT_OVERFLOW; + + (*p) += suffixes; + } + + *val = tmp; + return LONGINT_OK; +} + +#ifdef TESTING_XSTRTO + +# include <stdio.h> +# include "error.h" + +char *program_name; + +int +main (int argc, char** argv) +{ + strtol_error s_err; + int i; + + program_name = argv[0]; + for (i=1; i<argc; i++) + { + char *p; + __strtol_t val; + + s_err = __xstrtol (argv[i], &p, 0, &val, "bckmw"); + if (s_err == LONGINT_OK) + { + printf ("%s->%lu (%s)\n", argv[i], val, p); + } + else + { + STRTOL_FATAL_ERROR (argv[i], "arg", s_err); + } + } + exit (0); +} + +#endif /* TESTING_XSTRTO */ diff --git a/gnu/dist/diffutils/lib/xstrtol.h b/gnu/dist/diffutils/lib/xstrtol.h new file mode 100644 index 00000000000..8f745cd7480 --- /dev/null +++ b/gnu/dist/diffutils/lib/xstrtol.h @@ -0,0 +1,84 @@ +/* $NetBSD: xstrtol.h,v 1.1.1.1 2003/01/26 00:43:14 wiz Exp $ */ + +/* A more useful interface to strtol. + Copyright 1995, 1996, 1998, 1999, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef XSTRTOL_H_ +# define XSTRTOL_H_ 1 + +# if HAVE_INTTYPES_H +# include <inttypes.h> /* for uintmax_t */ +# endif + +# ifndef PARAMS +# if defined PROTOTYPES || (defined __STDC__ && __STDC__) +# define PARAMS(Args) Args +# else +# define PARAMS(Args) () +# endif +# endif + +# ifndef _STRTOL_ERROR +enum strtol_error + { + LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW + }; +typedef enum strtol_error strtol_error; +# endif + +# define _DECLARE_XSTRTOL(name, type) \ + strtol_error \ + name PARAMS ((const char *s, char **ptr, int base, \ + type *val, const char *valid_suffixes)); +_DECLARE_XSTRTOL (xstrtol, long int) +_DECLARE_XSTRTOL (xstrtoul, unsigned long int) +_DECLARE_XSTRTOL (xstrtoimax, intmax_t) +_DECLARE_XSTRTOL (xstrtoumax, uintmax_t) + +# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \ + do \ + { \ + switch ((Err)) \ + { \ + case LONGINT_OK: \ + abort (); \ + \ + case LONGINT_INVALID: \ + error ((Exit_code), 0, "invalid %s `%s'", \ + (Argument_type_string), (Str)); \ + break; \ + \ + case LONGINT_INVALID_SUFFIX_CHAR: \ + error ((Exit_code), 0, "invalid character following %s in `%s'", \ + (Argument_type_string), (Str)); \ + break; \ + \ + case LONGINT_OVERFLOW: \ + error ((Exit_code), 0, "%s `%s' too large", \ + (Argument_type_string), (Str)); \ + break; \ + } \ + } \ + while (0) + +# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \ + _STRTOL_ERROR (2, Str, Argument_type_string, Err) + +# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \ + _STRTOL_ERROR (0, Str, Argument_type_string, Err) + +#endif /* not XSTRTOL_H_ */ diff --git a/gnu/dist/diffutils/lib/xstrtoumax.c b/gnu/dist/diffutils/lib/xstrtoumax.c new file mode 100644 index 00000000000..4fc528ee10b --- /dev/null +++ b/gnu/dist/diffutils/lib/xstrtoumax.c @@ -0,0 +1,33 @@ +/* $NetBSD: xstrtoumax.c,v 1.1.1.1 2003/01/26 00:43:15 wiz Exp $ */ + +/* xstrtoumax.c -- A more useful interface to strtoumax. + Copyright 1999 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#define __strtol strtoumax +#define __strtol_t uintmax_t +#define __xstrtol xstrtoumax +#include "xstrtol.c" diff --git a/gnu/dist/diffutils/m4/Makefile.am b/gnu/dist/diffutils/m4/Makefile.am new file mode 100644 index 00000000000..ddf5373bbf9 --- /dev/null +++ b/gnu/dist/diffutils/m4/Makefile.am @@ -0,0 +1,50 @@ +## Process this file with automake to produce Makefile.in -*-Makefile-*- + +##m4-files-begin +EXTRA_DIST = \ + README jm-glibc-io.m4 Makefile.am.in \ +c-bs-a.m4 \ +c-stack.m4 \ +check-decl.m4 \ +codeset.m4 \ +dos.m4 \ +error.m4 \ +fnmatch.m4 \ +gettext.m4 \ +glibc21.m4 \ +gnu-source.m4 \ +iconv.m4 \ +inttypes.m4 \ +jm-glibc-io.m4 \ +lcmessage.m4 \ +lib-ld.m4 \ +lib-link.m4 \ +lib-prefix.m4 \ +longlong.m4 \ +malloc.m4 \ +mbrtowc.m4 \ +mbstate_t.m4 \ +prereq.m4 \ +progtest.m4 \ +realloc.m4 \ +regex.m4 \ +setmode.m4 \ +st_mtim.m4 \ +stdbool.m4 \ +strftime.m4 \ +vararrays.m4 \ +xstrtoumax.m4 +##m4-files-end + +Makefile.am: Makefile.am.in + rm -f $@ $@t + sed -n '1,/^##m4-files-begin/p' $< > $@t + (((echo EXTRA_DIST =; \ + echo " README jm-glibc-io.m4 Makefile.am.in" \ + ) | tr '\012' @); \ + (echo *.m4|tr ' ' @) ) \ + |sed 's/@$$/%/;s/@/ \\@/g' |tr @% '\012\012' \ + >> $@t + sed -n '/^##m4-files-end/,$$p' $< >> $@t + chmod a-w $@t + mv $@t $@ diff --git a/gnu/dist/diffutils/m4/Makefile.am.in b/gnu/dist/diffutils/m4/Makefile.am.in new file mode 100644 index 00000000000..de3ffff22ab --- /dev/null +++ b/gnu/dist/diffutils/m4/Makefile.am.in @@ -0,0 +1,17 @@ +## Process this file with automake to produce Makefile.in -*-Makefile-*- + +##m4-files-begin +##m4-files-end + +Makefile.am: Makefile.am.in + rm -f $@ $@t + sed -n '1,/^##m4-files-begin/p' $< > $@t + (((echo EXTRA_DIST =; \ + echo " README jm-glibc-io.m4 Makefile.am.in" \ + ) | tr '\012' @); \ + (echo *.m4|tr ' ' @) ) \ + |sed 's/@$$/%/;s/@/ \\@/g' |tr @% '\012\012' \ + >> $@t + sed -n '/^##m4-files-end/,$$p' $< >> $@t + chmod a-w $@t + mv $@t $@ diff --git a/gnu/dist/diffutils/m4/Makefile.in b/gnu/dist/diffutils/m4/Makefile.in new file mode 100644 index 00000000000..d481ae7292f --- /dev/null +++ b/gnu/dist/diffutils/m4/Makefile.in @@ -0,0 +1,272 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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@ +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +EXTRA_DIST = \ + README jm-glibc-io.m4 Makefile.am.in \ +c-bs-a.m4 \ +c-stack.m4 \ +check-decl.m4 \ +codeset.m4 \ +dos.m4 \ +error.m4 \ +fnmatch.m4 \ +gettext.m4 \ +glibc21.m4 \ +gnu-source.m4 \ +iconv.m4 \ +inttypes.m4 \ +jm-glibc-io.m4 \ +lcmessage.m4 \ +lib-ld.m4 \ +lib-link.m4 \ +lib-prefix.m4 \ +longlong.m4 \ +malloc.m4 \ +mbrtowc.m4 \ +mbstate_t.m4 \ +prereq.m4 \ +progtest.m4 \ +realloc.m4 \ +regex.m4 \ +setmode.m4 \ +st_mtim.m4 \ +stdbool.m4 \ +strftime.m4 \ +vararrays.m4 \ +xstrtoumax.m4 + +subdir = m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = +DIST_COMMON = README Makefile.am Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits m4/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +uninstall-info-am: +tags: TAGS +TAGS: + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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 + +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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 + +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic uninstall uninstall-am uninstall-info-am + + +Makefile.am: Makefile.am.in + rm -f $@ $@t + sed -n '1,/^##m4-files-begin/p' $< > $@t + (((echo EXTRA_DIST =; \ + echo " README jm-glibc-io.m4 Makefile.am.in" \ + ) | tr '\012' @); \ + (echo *.m4|tr ' ' @) ) \ + |sed 's/@$$/%/;s/@/ \\@/g' |tr @% '\012\012' \ + >> $@t + sed -n '/^##m4-files-end/,$$p' $< >> $@t + chmod a-w $@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/gnu/dist/diffutils/m4/README b/gnu/dist/diffutils/m4/README new file mode 100644 index 00000000000..d2c7724eba6 --- /dev/null +++ b/gnu/dist/diffutils/m4/README @@ -0,0 +1,10 @@ +Many of the files in this directory are taken from the fileutils, +shellutils, and textutils packages. + +These files are used by a program called aclocal (part of the GNU automake +package). aclocal uses these files to create aclocal.m4 which is in turn +used by autoconf to create the configure script at the top level in +this distribution. + +The Makefile.am file in this directory is automatically generated +from the template file, Makefile.am.in. diff --git a/gnu/dist/diffutils/m4/c-bs-a.m4 b/gnu/dist/diffutils/m4/c-bs-a.m4 new file mode 100644 index 00000000000..6e0863e4e0a --- /dev/null +++ b/gnu/dist/diffutils/m4/c-bs-a.m4 @@ -0,0 +1,23 @@ +#serial 4 + +dnl From Paul Eggert. + +AC_DEFUN([AC_C_BACKSLASH_A], +[ + AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a, + [AC_TRY_COMPILE([], + [ +#if '\a' == 'a' + syntax error; +#endif + char buf['\a' == 'a' ? -1 : 1]; + buf[0] = '\a'; + return buf[0] != "\a"[0]; + ], + ac_cv_c_backslash_a=yes, + ac_cv_c_backslash_a=no)]) + if test $ac_cv_c_backslash_a = yes; then + AC_DEFINE(HAVE_C_BACKSLASH_A, 1, + [Define if backslash-a works in C strings.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/c-stack.m4 b/gnu/dist/diffutils/m4/c-stack.m4 new file mode 100644 index 00000000000..0599d5023ff --- /dev/null +++ b/gnu/dist/diffutils/m4/c-stack.m4 @@ -0,0 +1,131 @@ +# Check prerequisites for compiling lib/c-stack.c. + +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC], + [# for STACK_DIRECTION + AC_REQUIRE([AC_FUNC_ALLOCA]) + + AC_CACHE_CHECK([for working C stack overflow detection], + ac_cv_sys_xsi_stack_overflow_heuristic, + [AC_TRY_RUN( + [ + #include <signal.h> + #include <ucontext.h> + + static union + { + char buffer[SIGSTKSZ]; + long double ld; + uintmax_t u; + void *p; + } alternate_signal_stack; + + #if STACK_DIRECTION + # define find_stack_direction(ptr) STACK_DIRECTION + #else + static int + find_stack_direction (char const *addr) + { + char dummy; + return (! addr ? find_stack_direction (&dummy) + : addr < &dummy ? 1 : -1); + } + #endif + + static void + segv_handler (int signo, siginfo_t *info, void *context) + { + if (0 < info->si_code) + { + ucontext_t const *user_context = context; + char const *stack_min = user_context->uc_stack.ss_sp; + size_t stack_size = user_context->uc_stack.ss_size; + char const *faulting_address = info->si_addr; + size_t s = faulting_address - stack_min; + size_t page_size = sysconf (_SC_PAGESIZE); + if (find_stack_direction (0) < 0) + s += page_size; + if (s < stack_size + page_size) + _exit (0); + } + + _exit (1); + } + + static int + c_stack_action (void) + { + stack_t st; + struct sigaction act; + int r; + + st.ss_flags = 0; + st.ss_sp = alternate_signal_stack.buffer; + st.ss_size = sizeof alternate_signal_stack.buffer; + r = sigaltstack (&st, 0); + if (r != 0) + return r; + + sigemptyset (&act.sa_mask); + act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; + act.sa_sigaction = segv_handler; + return sigaction (SIGSEGV, &act, 0); + } + + static int + recurse (char *p) + { + char array[500]; + array[0] = 1; + return *p + recurse (array); + } + + int + main (void) + { + c_stack_action (); + return recurse ("\1"); + } + ], + [ac_cv_sys_xsi_stack_overflow_heuristic=yes], + [ac_cv_sys_xsi_stack_overflow_heuristic=no], + [ac_cv_sys_xsi_stack_overflow_heuristic=cross-compiling])]) + + if test $ac_cv_sys_xsi_stack_overflow_heuristic = yes; then + AC_DEFINE(HAVE_XSI_STACK_OVERFLOW_HEURISTIC, 1, + [Define to 1 if extending the stack slightly past the limit causes + a SIGSEGV, and an alternate stack can be established with sigaltstack, + and the signal handler is passed a context that specifies the + run time stack. This behavior is defined by POSIX 1003.1-2001 + with the X/Open System Interface (XSI) option + and is a standardized way to implement a SEGV-based stack + overflow detection heuristic.]) + fi]) + + +AC_DEFUN([jm_PREREQ_C_STACK], + [AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) + AC_REQUIRE([AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC]) + + # for STACK_DIRECTION + AC_REQUIRE([AC_FUNC_ALLOCA]) + + AC_CHECK_HEADERS(unistd.h) + + AC_CHECK_TYPES([siginfo_t, stack_t], , , [#include <signal.h>])]) diff --git a/gnu/dist/diffutils/m4/check-decl.m4 b/gnu/dist/diffutils/m4/check-decl.m4 new file mode 100644 index 00000000000..b374705a021 --- /dev/null +++ b/gnu/dist/diffutils/m4/check-decl.m4 @@ -0,0 +1,85 @@ +#serial 18 + +dnl This is just a wrapper function to encapsulate this kludge. +dnl Putting it in a separate file like this helps share it between +dnl different packages. +AC_DEFUN([jm_CHECK_DECLS], +[ + AC_REQUIRE([_jm_DECL_HEADERS]) + AC_REQUIRE([AC_HEADER_TIME]) + headers=' +#include <stdio.h> +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#else +# if HAVE_STRINGS_H +# include <strings.h> +# endif +#endif +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include <sys/types.h> +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + +#if HAVE_UTMP_H +# include <utmp.h> +#endif + +#if HAVE_GRP_H +# include <grp.h> +#endif + +#if HAVE_PWD_H +# include <pwd.h> +#endif +' + + AC_CHECK_DECLS([ + free, + getenv, + geteuid, + getgrgid, + getlogin, + getpwuid, + getuid, + getutent, + lseek, + malloc, + memchr, + memrchr, + nanosleep, + realloc, + stpcpy, + strndup, + strnlen, + strstr, + strtoul, + strtoull, + ttyname], , , $headers) +]) + +dnl FIXME: when autoconf has support for it. +dnl This is a little helper so we can require these header checks. +AC_DEFUN([_jm_DECL_HEADERS], +[ + AC_REQUIRE([AC_HEADER_STDC]) + AC_CHECK_HEADERS(grp.h memory.h pwd.h string.h strings.h stdlib.h \ + unistd.h sys/time.h utmp.h utmpx.h) +]) diff --git a/gnu/dist/diffutils/m4/codeset.m4 b/gnu/dist/diffutils/m4/codeset.m4 new file mode 100644 index 00000000000..59535ebcff5 --- /dev/null +++ b/gnu/dist/diffutils/m4/codeset.m4 @@ -0,0 +1,23 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include <langinfo.h>], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have <langinfo.h> and nl_langinfo(CODESET).]) + fi +]) diff --git a/gnu/dist/diffutils/m4/dos.m4 b/gnu/dist/diffutils/m4/dos.m4 new file mode 100644 index 00000000000..868626e7e59 --- /dev/null +++ b/gnu/dist/diffutils/m4/dos.m4 @@ -0,0 +1,53 @@ +#serial 5 + +# Define some macros required for proper operation of code in lib/*.c +# on MSDOS/Windows systems. + +# From Jim Meyering. + +AC_DEFUN([jm_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__ +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 + else + ac_fs_accepts_drive_letter_prefix=0 + ac_fs_backslash_is_file_name_separator=0 + fi + + AH_VERBATIM(FILESYSTEM_PREFIX_LEN, + [#if FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX +# define FILESYSTEM_PREFIX_LEN(Filename) \ + ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0) +#else +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_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 FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_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.]) + ]) diff --git a/gnu/dist/diffutils/m4/error.m4 b/gnu/dist/diffutils/m4/error.m4 new file mode 100644 index 00000000000..3fddb5c1115 --- /dev/null +++ b/gnu/dist/diffutils/m4/error.m4 @@ -0,0 +1,13 @@ +#serial 4 + +dnl FIXME: put these prerequisite-only *.m4 files in a separate +dnl directory -- otherwise, they'll conflict with existing files. + +dnl These are the prerequisite macros for GNU's error.c file. +AC_DEFUN([jm_PREREQ_ERROR], +[ + AC_CHECK_FUNCS(strerror vprintf doprnt) + AC_CHECK_DECLS([strerror]) + AC_FUNC_STRERROR_R + AC_HEADER_STDC +]) diff --git a/gnu/dist/diffutils/m4/fnmatch.m4 b/gnu/dist/diffutils/m4/fnmatch.m4 new file mode 100644 index 00000000000..8132456bb66 --- /dev/null +++ b/gnu/dist/diffutils/m4/fnmatch.m4 @@ -0,0 +1,47 @@ +# Check for fnmatch. + +# This is a modified version of autoconf's AC_FUNC_FNMATCH; +# it also checks for FNM_CASEFOLD or FNM_IGNORECASE. + +# Copyright (C) 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# AC_FUNC_FNMATCH +# --------------- +# We look for fnmatch.h to avoid that the test fails in C++. +AC_DEFUN([AC_FUNC_FNMATCH], +[AC_CACHE_CHECK([for working GNU-style fnmatch], + [ac_cv_func_fnmatch_works], +# Some versions of Solaris, SCO, and the GNU C Library +# have a broken or incompatible fnmatch. +# So we run a test program. If we are cross-compiling, take no chance. +# Thanks to John Oleynick, Franc,ois Pinard, and Paul Eggert for this test. +[AC_RUN_IFELSE([AC_LANG_PROGRAM([@%:@include <fnmatch.h>], + [exit (fnmatch ("a*", "abc", 0) != 0 + || fnmatch ("xxXX", "xXxX", FNM_CASEFOLD) != 0 + || fnmatch ("d*/*1", "d/s/1", FNM_FILE_NAME) != FNM_NOMATCH + || fnmatch ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR) != 0 + || fnmatch ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR) != 0 + || fnmatch ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR) != 0);])], + [ac_cv_func_fnmatch_works=yes], + [ac_cv_func_fnmatch_works=no], + [ac_cv_func_fnmatch_works=no])]) +if test $ac_cv_func_fnmatch_works = yes; then + AC_DEFINE(HAVE_FNMATCH, 1, + [Define to 1 if your system has a working `fnmatch' function.]) +fi +])# AC_FUNC_FNMATCH diff --git a/gnu/dist/diffutils/m4/gettext.m4 b/gnu/dist/diffutils/m4/gettext.m4 new file mode 100644 index 00000000000..520f973d8de --- /dev/null +++ b/gnu/dist/diffutils/m4/gettext.m4 @@ -0,0 +1,541 @@ +# gettext.m4 serial 13 (gettext-0.11.1) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. +dnl Bruno Haible <haible@clisp.cons.org>, 2000-2002. + +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. +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], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + 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]) + + 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) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + 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. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-ngettext], 2, 1)) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "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_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <libintl.h> +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_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 test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; 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. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + 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 "$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 + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "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; 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) + AC_SUBST(INTLOBJS) + + 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 Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 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 Search for GNU xgettext 0.11 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= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /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 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 >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + 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 + 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" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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 "$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" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|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, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + AM_LC_MESSAGES + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) diff --git a/gnu/dist/diffutils/m4/glibc21.m4 b/gnu/dist/diffutils/m4/glibc21.m4 new file mode 100644 index 00000000000..9c9f3db3036 --- /dev/null +++ b/gnu/dist/diffutils/m4/glibc21.m4 @@ -0,0 +1,32 @@ +# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([jm_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include <features.h> +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/gnu/dist/diffutils/m4/gnu-source.m4 b/gnu/dist/diffutils/m4/gnu-source.m4 new file mode 100644 index 00000000000..d2f490b0d61 --- /dev/null +++ b/gnu/dist/diffutils/m4/gnu-source.m4 @@ -0,0 +1,25 @@ +#serial 3 +# Make sure _GNU_SOURCE is defined where necessary: as early as possible +# for configure-time tests, as well as for every source file that includes +# config.h. + +# From Jim Meyering. + +AC_DEFUN([AC__GNU_SOURCE], +[ + # Make sure that _GNU_SOURCE is defined for all subsequent + # configure-time compile tests. + # This definition must be emitted (into confdefs.h) before any + # test that involves compilation. + cat >>confdefs.h <<\EOF +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +EOF + + # Emit this code into config.h.in. + # The ifndef is to avoid redefinition warnings. + AH_VERBATIM([_GNU_SOURCE], [#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif]) +]) diff --git a/gnu/dist/diffutils/m4/iconv.m4 b/gnu/dist/diffutils/m4/iconv.m4 new file mode 100644 index 00000000000..f81e8b995f6 --- /dev/null +++ b/gnu/dist/diffutils/m4/iconv.m4 @@ -0,0 +1,96 @@ +# iconv.m4 serial AM3 (gettext-0.11) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +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). + + 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]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include <stdlib.h> +#include <iconv.h>], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + 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], +[ + AC_REQUIRE([AM_ICONV_LINK]) + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include <stdlib.h> +#include <iconv.h> +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/inttypes.m4 b/gnu/dist/diffutils/m4/inttypes.m4 new file mode 100644 index 00000000000..9571814f533 --- /dev/null +++ b/gnu/dist/diffutils/m4/inttypes.m4 @@ -0,0 +1,32 @@ +#serial 6 + +dnl From Paul Eggert. + +AC_PREREQ(2.52) + +# Define intmax_t to long or long long if <inttypes.h> doesn't define. + +AC_DEFUN([jm_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + AC_CHECK_TYPE(intmax_t, , + [test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to widest signed type if <inttypes.h> doesn't define.])]) +]) + +# Define uintmax_t to unsigned long or unsigned long long +# if <inttypes.h> doesn't define. + +AC_DEFUN([jm_AC_TYPE_UINTMAX_T], +[ + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + AC_CHECK_TYPE(uintmax_t, , + [test $ac_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, + [Define to widest unsigned type if <inttypes.h> doesn't define.])]) +]) diff --git a/gnu/dist/diffutils/m4/jm-glibc-io.m4 b/gnu/dist/diffutils/m4/jm-glibc-io.m4 new file mode 100644 index 00000000000..e8054f0bd28 --- /dev/null +++ b/gnu/dist/diffutils/m4/jm-glibc-io.m4 @@ -0,0 +1,14 @@ +#serial 7 -*- autoconf -*- + +dnl From Jim Meyering. +dnl +dnl See if the glibc *_unlocked I/O macros are available. +dnl Use only those *_unlocked macros that are declared. +dnl + +AC_DEFUN([jm_FUNC_GLIBC_UNLOCKED_IO], + [AC_CHECK_DECLS( + [clearerr_unlocked, feof_unlocked, ferror_unlocked, + fflush_unlocked, fgets_unlocked, fputc_unlocked, fputs_unlocked, + fread_unlocked, fwrite_unlocked, getc_unlocked, + getchar_unlocked, putc_unlocked, putchar_unlocked])]) diff --git a/gnu/dist/diffutils/m4/lcmessage.m4 b/gnu/dist/diffutils/m4/lcmessage.m4 new file mode 100644 index 00000000000..ffbf915f1a9 --- /dev/null +++ b/gnu/dist/diffutils/m4/lcmessage.m4 @@ -0,0 +1,32 @@ +# lcmessage.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1995. + +# Check whether LC_MESSAGES is available in <locale.h>. + +AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your <locale.h> file defines LC_MESSAGES.]) + fi + fi]) diff --git a/gnu/dist/diffutils/m4/lib-ld.m4 b/gnu/dist/diffutils/m4/lib-ld.m4 new file mode 100644 index 00000000000..ddb573234cb --- /dev/null +++ b/gnu/dist/diffutils/m4/lib-ld.m4 @@ -0,0 +1,97 @@ +# lib-ld.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +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. +if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +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. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + 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/gnu/dist/diffutils/m4/lib-link.m4 b/gnu/dist/diffutils/m4/lib-link.m4 new file mode 100644 index 00000000000..a16aa446054 --- /dev/null +++ b/gnu/dist/diffutils/m4/lib-link.m4 @@ -0,0 +1,521 @@ +# lib-link.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +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. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L, +dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. +AC_DEFUN([AC_LIB_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" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" +]) + +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. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + 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= + 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= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + 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//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + 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 "X$found_dir" = "X/usr/lib"; 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 "$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 "$hardcode_libdir_flag_spec" && test "$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 "$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 $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 + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + 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*) 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/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) 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 + ;; + -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 "$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:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$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=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/gnu/dist/diffutils/m4/lib-prefix.m4 b/gnu/dist/diffutils/m4/lib-prefix.m4 new file mode 100644 index 00000000000..b8b79ab9ad5 --- /dev/null +++ b/gnu/dist/diffutils/m4/lib-prefix.m4 @@ -0,0 +1,148 @@ +# lib-prefix.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + 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*) 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/lib"; 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/lib"; 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" +]) diff --git a/gnu/dist/diffutils/m4/longlong.m4 b/gnu/dist/diffutils/m4/longlong.m4 new file mode 100644 index 00000000000..daa95c07510 --- /dev/null +++ b/gnu/dist/diffutils/m4/longlong.m4 @@ -0,0 +1,35 @@ +#serial 2 + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the long long type.]) + fi +]) + +# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. + +AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], +[ + AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, + [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;], + [unsigned long long ullmax = (unsigned long long) -1; + return ull << i | ull >> i | ullmax / ull | ullmax % ull;], + ac_cv_type_unsigned_long_long=yes, + ac_cv_type_unsigned_long_long=no)]) + if test $ac_cv_type_unsigned_long_long = yes; then + AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, + [Define if you have the unsigned long long type.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/malloc.m4 b/gnu/dist/diffutils/m4/malloc.m4 new file mode 100644 index 00000000000..bb60947dc74 --- /dev/null +++ b/gnu/dist/diffutils/m4/malloc.m4 @@ -0,0 +1,34 @@ +#serial 5 + +dnl From Jim Meyering. +dnl Determine whether malloc accepts 0 as its argument. +dnl If it doesn't, arrange to use the replacement function. +dnl + +AC_DEFUN([jm_FUNC_MALLOC], +[ + dnl xmalloc.c requires that this symbol be defined so it doesn't + dnl mistakenly use a broken malloc -- as it might if this test were omitted. + AC_DEFINE(HAVE_DONE_WORKING_MALLOC_CHECK, 1, + [Define if the malloc check has been performed. ]) + + AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc, + [AC_TRY_RUN([ + char *malloc (); + int + main () + { + exit (malloc (0) ? 0 : 1); + } + ], + jm_cv_func_working_malloc=yes, + jm_cv_func_working_malloc=no, + dnl When crosscompiling, assume malloc is broken. + jm_cv_func_working_malloc=no) + ]) + if test $jm_cv_func_working_malloc = no; then + AC_LIBOBJ(malloc) + AC_DEFINE(malloc, rpl_malloc, + [Define to rpl_malloc if the replacement function should be used.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/mbrtowc.m4 b/gnu/dist/diffutils/m4/mbrtowc.m4 new file mode 100644 index 00000000000..87743919b9d --- /dev/null +++ b/gnu/dist/diffutils/m4/mbrtowc.m4 @@ -0,0 +1,18 @@ +#serial 4 + +dnl From Paul Eggert + +AC_DEFUN([jm_FUNC_MBRTOWC], +[ + AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], + jm_cv_func_mbrtowc, + [AC_TRY_LINK( + [#include <wchar.h>], + [mbstate_t state; return ! (sizeof state && mbrtowc);], + jm_cv_func_mbrtowc=yes, + jm_cv_func_mbrtowc=no)]) + if test $jm_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/gnu/dist/diffutils/m4/mbstate_t.m4 b/gnu/dist/diffutils/m4/mbstate_t.m4 new file mode 100644 index 00000000000..ae2bcf1e8e2 --- /dev/null +++ b/gnu/dist/diffutils/m4/mbstate_t.m4 @@ -0,0 +1,29 @@ +# serial 9 + +# From Paul Eggert. + +# BeOS 5 has <wchar.h> but does not define mbstate_t, +# so you can't declare an object of that type. +# Check for this incompatibility with Standard C. + +# Include stdlib.h first, because otherwise this test would fail on Linux +# (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits +# a syntax error in wchar.h due to the use of undefined __int32_t. + +AC_DEFUN([AC_MBSTATE_T], + [ + AC_CHECK_HEADERS(stdlib.h) + + AC_CACHE_CHECK([for mbstate_t], ac_cv_type_mbstate_t, + [AC_TRY_COMPILE([ +#if HAVE_STDLIB_H +# include <stdlib.h> +#endif +#include <wchar.h>], + [mbstate_t x; return sizeof x;], + ac_cv_type_mbstate_t=yes, + ac_cv_type_mbstate_t=no)]) + if test $ac_cv_type_mbstate_t = no; then + AC_DEFINE(mbstate_t, int, + [Define to a type if <wchar.h> does not define.]) + fi]) diff --git a/gnu/dist/diffutils/m4/prereq.m4 b/gnu/dist/diffutils/m4/prereq.m4 new file mode 100644 index 00000000000..816308ab408 --- /dev/null +++ b/gnu/dist/diffutils/m4/prereq.m4 @@ -0,0 +1,153 @@ +#serial 22 + +dnl These are the prerequisite macros for files in the lib/ +dnl directories of the fileutils, sh-utils, and textutils packages. + +AC_DEFUN([jm_PREREQ], +[ + jm_PREREQ_ADDEXT + jm_PREREQ_CANON_HOST + jm_PREREQ_DIRNAME + jm_PREREQ_ERROR + jm_PREREQ_EXCLUDE + jm_PREREQ_GETPAGESIZE + jm_PREREQ_HARD_LOCALE + jm_PREREQ_HASH + jm_PREREQ_HUMAN + jm_PREREQ_MBSWIDTH + jm_PREREQ_MEMCHR + jm_PREREQ_PHYSMEM + jm_PREREQ_POSIXVER + jm_PREREQ_QUOTEARG + jm_PREREQ_READUTMP + jm_PREREQ_REGEX + jm_PREREQ_TEMPNAME # called by mkstemp + jm_PREREQ_XGETCWD + jm_PREREQ_XREADLINK +]) + +AC_DEFUN([jm_PREREQ_ADDEXT], +[ + dnl For addext.c. + AC_SYS_LONG_FILE_NAMES + AC_CHECK_FUNCS(pathconf) + AC_CHECK_HEADERS(limits.h string.h unistd.h) +]) + +AC_DEFUN([jm_PREREQ_CANON_HOST], +[ + dnl Add any libraries as early as possible. + dnl In particular, inet_ntoa needs -lnsl at least on Solaris5.5.1, + dnl so we have to add -lnsl to LIBS before checking for that function. + AC_SEARCH_LIBS(gethostbyname, [inet nsl]) + + dnl These come from -lnsl on Solaris5.5.1. + AC_CHECK_FUNCS(gethostbyname gethostbyaddr inet_ntoa) + + AC_CHECK_FUNCS(gethostbyname gethostbyaddr inet_ntoa) + AC_CHECK_HEADERS(unistd.h string.h netdb.h sys/socket.h \ + netinet/in.h arpa/inet.h) +]) + +AC_DEFUN([jm_PREREQ_DIRNAME], +[ + AC_HEADER_STDC + AC_CHECK_HEADERS(string.h) +]) + +AC_DEFUN([jm_PREREQ_EXCLUDE], +[ + jm_FUNC_FNMATCH + AC_HEADER_STDBOOL +]) + +AC_DEFUN([jm_PREREQ_GETPAGESIZE], +[ + AC_CHECK_FUNCS(getpagesize) + AC_CHECK_HEADERS(OS.h unistd.h) +]) + +AC_DEFUN([jm_PREREQ_HARD_LOCALE], +[ + AC_C_PROTOTYPES + AC_CHECK_FUNCS(setlocale) + AC_CHECK_HEADERS(locale.h stdlib.h string.h) +]) + +AC_DEFUN([jm_PREREQ_HASH], +[ + AC_CHECK_HEADERS(stdlib.h) + AC_HEADER_STDBOOL + AC_REQUIRE([jm_CHECK_DECLS]) +]) + +# If you use human.c, you need the following files: +# inttypes.m4 ulonglong.m4 +AC_DEFUN([jm_PREREQ_HUMAN], +[ + AC_CHECK_HEADERS(limits.h stdlib.h string.h) + AC_CHECK_DECLS([getenv]) + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) +]) + +AC_DEFUN([jm_PREREQ_MEMCHR], +[ + AC_CHECK_HEADERS(limits.h stdlib.h bp-sym.h) +]) + +AC_DEFUN([jm_PREREQ_PHYSMEM], +[ + AC_CHECK_HEADERS(sys/pstat.h unistd.h) + AC_CHECK_FUNCS(pstat_getstatic pstat_getdynamic) +]) + +AC_DEFUN([jm_PREREQ_POSIXVER], +[ + AC_CHECK_HEADERS(unistd.h) + AC_CHECK_DECLS([getenv]) +]) + +AC_DEFUN([jm_PREREQ_QUOTEARG], +[ + AC_CHECK_FUNCS(isascii iswprint) + jm_FUNC_MBRTOWC + AC_CHECK_HEADERS(limits.h stddef.h stdlib.h string.h wchar.h wctype.h) + AC_HEADER_STDC + AC_C_BACKSLASH_A + AC_MBSTATE_T + AM_C_PROTOTYPES +]) + +AC_DEFUN([jm_PREREQ_REGEX], +[ + dnl FIXME: Maybe provide a btowc replacement someday: solaris-2.5.1 lacks it. + dnl FIXME: Check for wctype and iswctype, and and add -lw if necessary + dnl to get them. + AC_CHECK_FUNCS(bzero bcopy isascii btowc) + AC_CHECK_HEADERS(alloca.h libintl.h wctype.h wchar.h) + AC_HEADER_STDC + AC_FUNC_ALLOCA +]) + +AC_DEFUN([jm_PREREQ_TEMPNAME], +[ + AC_HEADER_STDC + AC_HEADER_STAT + AC_CHECK_HEADERS(fcntl.h sys/time.h stdint.h unistd.h) + AC_CHECK_FUNCS(__secure_getenv gettimeofday) + AC_CHECK_DECLS([getenv]) +]) + +AC_DEFUN([jm_PREREQ_XGETCWD], +[ + AC_C_PROTOTYPES + AC_CHECK_HEADERS(limits.h stdlib.h sys/param.h unistd.h) + AC_CHECK_FUNCS(getcwd) + AC_FUNC_GETCWD_NULL +]) + +AC_DEFUN([jm_PREREQ_XREADLINK], +[ + AC_C_PROTOTYPES + AC_CHECK_HEADERS(limits.h stdlib.h sys/types.h unistd.h) +]) diff --git a/gnu/dist/diffutils/m4/progtest.m4 b/gnu/dist/diffutils/m4/progtest.m4 new file mode 100644 index 00000000000..443c8e30630 --- /dev/null +++ b/gnu/dist/diffutils/m4/progtest.m4 @@ -0,0 +1,59 @@ +# progtest.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper <drepper@cygnus.com>, 1996. + +# 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], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/gnu/dist/diffutils/m4/realloc.m4 b/gnu/dist/diffutils/m4/realloc.m4 new file mode 100644 index 00000000000..c8a8237472d --- /dev/null +++ b/gnu/dist/diffutils/m4/realloc.m4 @@ -0,0 +1,34 @@ +#serial 5 + +dnl From Jim Meyering. +dnl Determine whether realloc works when both arguments are 0. +dnl If it doesn't, arrange to use the replacement function. +dnl + +AC_DEFUN([jm_FUNC_REALLOC], +[ + dnl xmalloc.c requires that this symbol be defined so it doesn't + dnl mistakenly use a broken realloc -- as it might if this test were omitted. + AC_DEFINE(HAVE_DONE_WORKING_REALLOC_CHECK, 1, + [Define if the realloc check has been performed. ]) + + AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc, + [AC_TRY_RUN([ + char *realloc (); + int + main () + { + exit (realloc (0, 0) ? 0 : 1); + } + ], + jm_cv_func_working_realloc=yes, + jm_cv_func_working_realloc=no, + dnl When crosscompiling, assume realloc is broken. + jm_cv_func_working_realloc=no) + ]) + if test $jm_cv_func_working_realloc = no; then + AC_LIBOBJ(realloc) + AC_DEFINE(realloc, rpl_realloc, + [Define to rpl_realloc if the replacement function should be used.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/regex.m4 b/gnu/dist/diffutils/m4/regex.m4 new file mode 100644 index 00000000000..0017507edf0 --- /dev/null +++ b/gnu/dist/diffutils/m4/regex.m4 @@ -0,0 +1,81 @@ +#serial 12 + +dnl Initially derived from code in GNU grep. +dnl Mostly written by Jim Meyering. + +dnl Usage: jm_INCLUDED_REGEX([lib/regex.c]) +dnl +AC_DEFUN([jm_INCLUDED_REGEX], + [ + dnl Even packages that don't use regex.c can use this macro. + dnl Of course, for them it doesn't do anything. + + # Assume we'll default to using the included regex.c. + ac_use_included_regex=yes + + # However, if the system regex support is good enough that it passes the + # 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. The first failing regular expression is from `Spencer ere + # test #75' in grep-2.3. + AC_CACHE_CHECK([for working re_compile_pattern], + jm_cv_func_working_re_compile_pattern, + AC_TRY_RUN( +[#include <stdio.h> +#include <regex.h> + int + main () + { + static struct re_pattern_buffer regex; + const char *s; + struct re_registers regs; + re_set_syntax (RE_SYNTAX_POSIX_EGREP); + [s = re_compile_pattern ("a[[:@:>@:]]b\n", 9, ®ex);] + /* This should fail with _Invalid character class name_ error. */ + if (!s) + exit (1); + + /* This should succeed, but doesn't for e.g. glibc-2.1.3. */ + s = re_compile_pattern ("{1", 2, ®ex); + + if (s) + exit (1); + + /* The following example is derived from a problem report + against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */ + s = re_compile_pattern ("[[anù]]*n", 7, ®ex); + if (s) + exit (1); + + /* This should match, but doesn't for e.g. glibc-2.2.1. */ + if (re_match (®ex, "an", 2, 0, ®s) != 2) + exit (1); + + exit (0); + } + ], + jm_cv_func_working_re_compile_pattern=yes, + jm_cv_func_working_re_compile_pattern=no, + dnl When crosscompiling, assume it's broken. + jm_cv_func_working_re_compile_pattern=no)) + if test $jm_cv_func_working_re_compile_pattern = yes; then + ac_use_included_regex=no + fi + + test -n "$1" || AC_MSG_ERROR([missing argument]) + m4_syscmd([test -f $1]) + ifelse(m4_sysval, 0, + [ + AC_ARG_WITH(included-regex, + [ --without-included-regex don't compile regex; this is the default on + systems with version 2 of the GNU C library + (use with caution on other system)], + jm_with_regex=$withval, + jm_with_regex=$ac_use_included_regex) + if test "$jm_with_regex" = yes; then + AC_LIBOBJ(regex) + fi + ], + ) + ] +) diff --git a/gnu/dist/diffutils/m4/setmode.m4 b/gnu/dist/diffutils/m4/setmode.m4 new file mode 100644 index 00000000000..1af6bca4a7e --- /dev/null +++ b/gnu/dist/diffutils/m4/setmode.m4 @@ -0,0 +1,38 @@ +# Check for setmode, DOS style. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_FUNC_SETMODE_DOS], + [AC_CHECK_HEADERS(fcntl.h unistd.h) + AC_CACHE_CHECK([for DOS-style setmode], + [ac_cv_func_setmode_dos], + [AC_TRY_LINK( + [#include <io.h> + #if HAVE_FCNTL_H + # include <fcntl.h> + #endif + #if HAVE_UNISTD_H + # include <unistd.h> + #endif], + [int ret = setmode && setmode (1, O_BINARY);], + [ac_cv_func_setmode_dos=yes], + [ac_cv_func_setmode_dos=no])]) + if test $ac_cv_func_setmode_dos = yes; then + AC_DEFINE(HAVE_SETMODE_DOS, 1, + [Define to 1 if you have the DOS-style `setmode' function.]) + fi]) diff --git a/gnu/dist/diffutils/m4/st_mtim.m4 b/gnu/dist/diffutils/m4/st_mtim.m4 new file mode 100644 index 00000000000..e9342cfebfa --- /dev/null +++ b/gnu/dist/diffutils/m4/st_mtim.m4 @@ -0,0 +1,32 @@ +#serial 5 + +dnl From Paul Eggert. + +# Define ST_MTIM_NSEC to be the nanoseconds member of struct stat's st_mtim, +# if it exists. + +AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC], + [AC_CACHE_CHECK([for nanoseconds member of struct stat.st_mtim], + ac_cv_struct_st_mtim_nsec, + [ac_save_CPPFLAGS="$CPPFLAGS" + ac_cv_struct_st_mtim_nsec=no + # tv_nsec -- the usual case + # _tv_nsec -- Solaris 2.6, if + # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 + # && !defined __EXTENSIONS__) + # st__tim.tv_nsec -- UnixWare 2.1.2 + for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do + CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" + AC_TRY_COMPILE([#include <sys/types.h> +#include <sys/stat.h>], [struct stat s; s.st_mtim.ST_MTIM_NSEC;], + [ac_cv_struct_st_mtim_nsec=$ac_val; break]) + done + CPPFLAGS="$ac_save_CPPFLAGS"]) + + if test $ac_cv_struct_st_mtim_nsec != no; then + AC_DEFINE_UNQUOTED(ST_MTIM_NSEC, $ac_cv_struct_st_mtim_nsec, + [Define to be the nanoseconds member of struct stat's st_mtim, + if it exists.]) + fi + ] +) diff --git a/gnu/dist/diffutils/m4/stdbool.m4 b/gnu/dist/diffutils/m4/stdbool.m4 new file mode 100644 index 00000000000..8916dd4c74b --- /dev/null +++ b/gnu/dist/diffutils/m4/stdbool.m4 @@ -0,0 +1,56 @@ +# Check for stdbool.h that conforms to C99. + +# Copyright (C) 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_HEADER_STDBOOL], + [AC_CACHE_CHECK([for stdbool.h that conforms to C99], + [ac_cv_header_stdbool_h], + [AC_TRY_COMPILE( + [ + #include <stdbool.h> + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #ifndef true + "error: false is not defined" + #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]; + char e[(bool) &s == true ? 1 : -1]; + char f[(_Bool) -0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + ], + [ return !a + !b + !c + !d + !e + !f + !g + !h + !i; ], + [ac_cv_header_stdbool_h=yes], + [ac_cv_header_stdbool_h=no])]) + 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/gnu/dist/diffutils/m4/strftime.m4 b/gnu/dist/diffutils/m4/strftime.m4 new file mode 100644 index 00000000000..831faecac5b --- /dev/null +++ b/gnu/dist/diffutils/m4/strftime.m4 @@ -0,0 +1,43 @@ +#serial 17 + +dnl This macro is intended to be used solely in this file. +dnl These are the prerequisite macros for GNU's strftime.c replacement. +AC_DEFUN([_jm_STRFTIME_PREREQS], +[ + dnl strftime.c uses localtime_r and the underyling system strftime + dnl if they exist. + AC_CHECK_FUNCS(localtime_r strftime) + + AC_CHECK_HEADERS(limits.h) + AC_CHECK_FUNCS(bcopy tzset mempcpy memcpy memset) + + # This defines (or not) HAVE_TZNAME and HAVE_TM_ZONE. + AC_STRUCT_TIMEZONE + + AC_CHECK_FUNCS(mblen mbrlen) + + AC_CHECK_MEMBER([struct tm.tm_gmtoff], + [AC_DEFINE(HAVE_TM_GMTOFF, 1, + [Define if struct tm has the tm_gmtoff member.])], + , + [#include <time.h>]) +]) + +dnl From Jim Meyering. +dnl +AC_DEFUN([jm_FUNC_GNU_STRFTIME], +[AC_REQUIRE([AC_HEADER_TIME])dnl + + _jm_STRFTIME_PREREQS + + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_CHECK_HEADERS(sys/time.h) + AC_DEFINE([my_strftime], [nstrftime], + [Define to the name of the strftime replacement function.]) +]) + +AC_DEFUN([jm_FUNC_STRFTIME], +[ + _jm_STRFTIME_PREREQS +]) diff --git a/gnu/dist/diffutils/m4/vararrays.m4 b/gnu/dist/diffutils/m4/vararrays.m4 new file mode 100644 index 00000000000..e4256f963b6 --- /dev/null +++ b/gnu/dist/diffutils/m4/vararrays.m4 @@ -0,0 +1,37 @@ +# Check for variable-length arrays. + +#serial 1 + +# From Paul Eggert + +# Copyright (C) 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AC_C_VARARRAYS], +[ + AC_CACHE_CHECK([for variable-length arrays], + ac_cv_c_vararrays, + [AC_TRY_COMPILE( + [], + [static int x; char a[++x]; a[sizeof a - 1] = 0; return a[0];], + ac_cv_c_vararrays=yes, + ac_cv_c_vararrays=no)]) + if test $ac_cv_c_vararrays = yes; then + AC_DEFINE(HAVE_C_VARARRAYS, 1, + [Define to 1 if C supports variable-length arrays.]) + fi +]) diff --git a/gnu/dist/diffutils/m4/xstrtoumax.m4 b/gnu/dist/diffutils/m4/xstrtoumax.m4 new file mode 100644 index 00000000000..9ab71ec6dd4 --- /dev/null +++ b/gnu/dist/diffutils/m4/xstrtoumax.m4 @@ -0,0 +1,40 @@ +#serial 4 + +# autoconf tests required for use of xstrtoumax.c + +AC_DEFUN([jm_AC_PREREQ_XSTRTOUMAX], +[ + AC_REQUIRE([jm_AC_TYPE_INTMAX_T]) + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T]) + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) + AC_CHECK_DECLS([strtol, strtoul, strtoull, strtoimax, strtoumax]) + AC_CHECK_HEADERS(limits.h stdlib.h inttypes.h) + + AC_CACHE_CHECK([whether <inttypes.h> defines strtoumax as a macro], + jm_cv_func_strtoumax_macro, + AC_EGREP_CPP([inttypes_h_defines_strtoumax], [#include <inttypes.h> +#ifdef strtoumax + inttypes_h_defines_strtoumax +#endif], + jm_cv_func_strtoumax_macro=yes, + jm_cv_func_strtoumax_macro=no)) + + if test "$jm_cv_func_strtoumax_macro" != yes; then + AC_REPLACE_FUNCS(strtoumax) + fi + + dnl Only the replacement strtoumax invokes strtoul and strtoull, + dnl so we need the replacements only if strtoumax does not exist. + case "$jm_cv_func_strtoumax_macro,$ac_cv_func_strtoumax" in + no,no) + AC_REPLACE_FUNCS(strtoul) + + dnl We don't need (and can't compile) the replacement strtoull + dnl unless the type `unsigned long long' exists. + if test "$ac_cv_type_unsigned_long_long" = yes; then + AC_REPLACE_FUNCS(strtoull) + fi + ;; + esac +]) diff --git a/gnu/dist/diffutils/man/Makefile.am b/gnu/dist/diffutils/man/Makefile.am new file mode 100644 index 00000000000..d3a1ee20bbc --- /dev/null +++ b/gnu/dist/diffutils/man/Makefile.am @@ -0,0 +1,34 @@ +# Automakefile for GNU diffutils man pages + +# Copyright (C) 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +dist_man_MANS = cmp.1 diff.1 diff3.1 sdiff.1 +MAINTAINERCLEANFILES = $(dist_man_MANS) + +S = $(top_srcdir)/src +cmp.1: $S/cmp.c +diff.1: $S/diff.c +diff3.1: $S/diff3.c +sdiff.1: $S/sdiff.c + +# Depend on configure.ac to get version number changes. +$(dist_man_MANS): $(top_srcdir)/configure.ac + base=`expr $@ : '\(.*\).1'` && \ + (echo '[NAME]' && sed 's@/\* *@@; s/-/\\-/; q' $S/$$base.c) | \ + $(HELP2MAN) -i - -S '$(PACKAGE) $(VERSION)' ../src/$$base | \ + sed 's/^\.B info .*/.B info diff/' >$@ diff --git a/gnu/dist/diffutils/man/Makefile.in b/gnu/dist/diffutils/man/Makefile.in new file mode 100644 index 00000000000..73ae371ad6c --- /dev/null +++ b/gnu/dist/diffutils/man/Makefile.in @@ -0,0 +1,291 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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@ + +# Automakefile for GNU diffutils man pages + +# Copyright (C) 2002 Free Software Foundation, Inc. +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +dist_man_MANS = cmp.1 diff.1 diff3.1 sdiff.1 +MAINTAINERCLEANFILES = $(dist_man_MANS) + +S = $(top_srcdir)/src +subdir = man +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +DIST_SOURCES = + +NROFF = nroff +MANS = $(dist_man_MANS) +DIST_COMMON = $(dist_man_MANS) Makefile.am Makefile.in +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits man/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +uninstall-info-am: + +man1dir = $(mandir)/man1 +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +tags: TAGS +TAGS: + +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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 $(MANS) + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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-generic mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-exec-am: + +install-info: install-info-am + +install-man: install-man1 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +uninstall-am: uninstall-info-am uninstall-man + +uninstall-man: uninstall-man1 + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-man1 install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic uninstall uninstall-am \ + uninstall-info-am uninstall-man uninstall-man1 + +cmp.1: $S/cmp.c +diff.1: $S/diff.c +diff3.1: $S/diff3.c +sdiff.1: $S/sdiff.c + +# Depend on configure.ac to get version number changes. +$(dist_man_MANS): $(top_srcdir)/configure.ac + base=`expr $@ : '\(.*\).1'` && \ + (echo '[NAME]' && sed 's@/\* *@@; s/-/\\-/; q' $S/$$base.c) | \ + $(HELP2MAN) -i - -S '$(PACKAGE) $(VERSION)' ../src/$$base | \ + sed 's/^\.B info .*/.B info diff/' >$@ +# 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/gnu/dist/diffutils/man/cmp.1 b/gnu/dist/diffutils/man/cmp.1 new file mode 100644 index 00000000000..04cd2c5010f --- /dev/null +++ b/gnu/dist/diffutils/man/cmp.1 @@ -0,0 +1,66 @@ +.\" $NetBSD: cmp.1,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ +.\" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.27. +.TH CMP "1" "April 2002" "diffutils 2.8.1" "User Commands" +.SH NAME +cmp \- compare two files byte by byte +.SH SYNOPSIS +.B cmp +[\fIOPTION\fR]... \fIFILE1 \fR[\fIFILE2 \fR[\fISKIP1 \fR[\fISKIP2\fR]]] +.SH DESCRIPTION +Compare two files byte by byte. +.TP +\fB\-b\fR \fB\-\-print\-bytes\fR +Print differing bytes. +.TP +\fB\-i\fR SKIP \fB\-\-ignore\-initial\fR=\fISKIP\fR +Skip the first SKIP bytes of input. +.HP +\fB\-i\fR SKIP1:SKIP2 \fB\-\-ignore\-initial\fR=\fISKIP1\fR:SKIP2 +.IP +Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2. +.TP +\fB\-l\fR \fB\-\-verbose\fR +Output byte numbers and values of all differing bytes. +.TP +\fB\-n\fR LIMIT \fB\-\-bytes\fR=\fILIMIT\fR +Compare at most LIMIT bytes. +.TP +\fB\-s\fR \fB\-\-quiet\fR \fB\-\-silent\fR +Output nothing; yield exit status only. +.TP +\fB\-v\fR \fB\-\-version\fR +Output version info. +.TP +\fB\-\-help\fR +Output this help. +.PP +SKIP1 and SKIP2 are the number of bytes to skip in each file. +SKIP values may be followed by the following multiplicative suffixes: +kB 1000, K 1024, MB 1,000,000, M 1,048,576, +GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y. +.PP +If a FILE is `-' or missing, read standard input. +.SH AUTHOR +Written by Torbjorn Granlund and David MacKenzie. +.SH "REPORTING BUGS" +Report bugs to <bug-gnu-utils@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2002 Free Software Foundation, Inc. +.PP +This program comes with NO WARRANTY, to the extent permitted by law. +You may redistribute copies of this program +under the terms of the GNU General Public License. +For more information about these matters, see the file named COPYING. +.SH "SEE ALSO" +The full documentation for +.B cmp +is maintained as a Texinfo manual. If the +.B info +and +.B cmp +programs are properly installed at your site, the command +.IP +.B info diff +.PP +should give you access to the complete manual. diff --git a/gnu/dist/diffutils/man/diff.1 b/gnu/dist/diffutils/man/diff.1 new file mode 100644 index 00000000000..12844815352 --- /dev/null +++ b/gnu/dist/diffutils/man/diff.1 @@ -0,0 +1,227 @@ +.\" $NetBSD: diff.1,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ +.\" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.27. +.TH DIFF "1" "April 2002" "diffutils 2.8.1" "User Commands" +.SH NAME +diff \- compare files line by line +.SH SYNOPSIS +.B diff +[\fIOPTION\fR]... \fIFILES\fR +.SH DESCRIPTION +Compare files line by line. +.TP +\fB\-i\fR \fB\-\-ignore\-case\fR +Ignore case differences in file contents. +.TP +\fB\-\-ignore\-file\-name\-case\fR +Ignore case when comparing file names. +.TP +\fB\-\-no\-ignore\-file\-name\-case\fR +Consider case when comparing file names. +.TP +\fB\-E\fR \fB\-\-ignore\-tab\-expansion\fR +Ignore changes due to tab expansion. +.TP +\fB\-b\fR \fB\-\-ignore\-space\-change\fR +Ignore changes in the amount of white space. +.TP +\fB\-w\fR \fB\-\-ignore\-all\-space\fR +Ignore all white space. +.TP +\fB\-B\fR \fB\-\-ignore\-blank\-lines\fR +Ignore changes whose lines are all blank. +.TP +\fB\-I\fR RE \fB\-\-ignore\-matching\-lines\fR=\fIRE\fR +Ignore changes whose lines all match RE. +.TP +\fB\-\-strip\-trailing\-cr\fR +Strip trailing carriage return on input. +.TP +\fB\-a\fR \fB\-\-text\fR +Treat all files as text. +.TP +\fB\-c\fR \fB\-C\fR NUM \fB\-\-context\fR[=\fINUM\fR] +Output NUM (default 3) lines of copied context. +.TP +\fB\-u\fR \fB\-U\fR NUM \fB\-\-unified\fR[=\fINUM\fR] +Output NUM (default 3) lines of unified context. +.TP +\fB\-\-label\fR LABEL +Use LABEL instead of file name. +.TP +\fB\-p\fR \fB\-\-show\-c\-function\fR +Show which C function each change is in. +.TP +\fB\-F\fR RE \fB\-\-show\-function\-line\fR=\fIRE\fR +Show the most recent line matching RE. +.TP +\fB\-q\fR \fB\-\-brief\fR +Output only whether files differ. +.TP +\fB\-e\fR \fB\-\-ed\fR +Output an ed script. +.TP +\fB\-\-normal\fR +Output a normal diff. +.TP +\fB\-n\fR \fB\-\-rcs\fR +Output an RCS format diff. +.TP +\fB\-y\fR \fB\-\-side\-by\-side\fR +Output in two columns. +.TP +\fB\-W\fR NUM \fB\-\-width\fR=\fINUM\fR +Output at most NUM (default 130) print columns. +.TP +\fB\-\-left\-column\fR +Output only the left column of common lines. +.TP +\fB\-\-suppress\-common\-lines\fR +Do not output common lines. +.TP +\fB\-D\fR NAME \fB\-\-ifdef\fR=\fINAME\fR +Output merged file to show `#ifdef NAME' diffs. +.TP +\fB\-\-GTYPE\-group\-format\fR=\fIGFMT\fR +Similar, but format GTYPE input groups with GFMT. +.TP +\fB\-\-line\-format\fR=\fILFMT\fR +Similar, but format all input lines with LFMT. +.TP +\fB\-\-LTYPE\-line\-format\fR=\fILFMT\fR +Similar, but format LTYPE input lines with LFMT. +.TP +LTYPE is `old', `new', or `unchanged'. +GTYPE is LTYPE or `changed'. +.IP +GFMT may contain: +.TP +%< +lines from FILE1 +.TP +%> +lines from FILE2 +.TP +%= +lines common to FILE1 and FILE2 +.TP +%[-][WIDTH][.[PREC]]{doxX}LETTER +printf-style spec for LETTER +.IP +LETTERs are as follows for new group, lower case for old group: +.TP +F +first line number +.TP +L +last line number +.TP +N +number of lines = L-F+1 +.TP +E +F-1 +.TP +M +L+1 +.IP +LFMT may contain: +.TP +%L +contents of line +.TP +%l +contents of line, excluding any trailing newline +.TP +%[-][WIDTH][.[PREC]]{doxX}n +printf-style spec for input line number +.IP +Either GFMT or LFMT may contain: +.TP +%% +% +.TP +%c'C' +the single character C +.TP +%c'\eOOO' +the character with octal code OOO +.TP +\fB\-l\fR \fB\-\-paginate\fR +Pass the output through `pr' to paginate it. +.TP +\fB\-t\fR \fB\-\-expand\-tabs\fR +Expand tabs to spaces in output. +.TP +\fB\-T\fR \fB\-\-initial\-tab\fR +Make tabs line up by prepending a tab. +.TP +\fB\-r\fR \fB\-\-recursive\fR +Recursively compare any subdirectories found. +.TP +\fB\-N\fR \fB\-\-new\-file\fR +Treat absent files as empty. +.TP +\fB\-\-unidirectional\-new\-file\fR +Treat absent first files as empty. +.TP +\fB\-s\fR \fB\-\-report\-identical\-files\fR +Report when two files are the same. +.TP +\fB\-x\fR PAT \fB\-\-exclude\fR=\fIPAT\fR +Exclude files that match PAT. +.TP +\fB\-X\fR FILE \fB\-\-exclude\-from\fR=\fIFILE\fR +Exclude files that match any pattern in FILE. +.TP +\fB\-S\fR FILE \fB\-\-starting\-file\fR=\fIFILE\fR +Start with FILE when comparing directories. +.TP +\fB\-\-from\-file\fR=\fIFILE1\fR +Compare FILE1 to all operands. FILE1 can be a directory. +.TP +\fB\-\-to\-file\fR=\fIFILE2\fR +Compare all operands to FILE2. FILE2 can be a directory. +.TP +\fB\-\-horizon\-lines\fR=\fINUM\fR +Keep NUM lines of the common prefix and suffix. +.TP +\fB\-d\fR \fB\-\-minimal\fR +Try hard to find a smaller set of changes. +.TP +\fB\-\-speed\-large\-files\fR +Assume large files and many scattered small changes. +.TP +\fB\-v\fR \fB\-\-version\fR +Output version info. +.TP +\fB\-\-help\fR +Output this help. +.PP +FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'. +If \fB\-\-from\-file\fR or \fB\-\-to\-file\fR is given, there are no restrictions on FILES. +If a FILE is `-', read standard input. +.SH AUTHOR +Written by Paul Eggert, Mike Haertel, David Hayes, +Richard Stallman, and Len Tower. +.SH "REPORTING BUGS" +Report bugs to <bug-gnu-utils@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2002 Free Software Foundation, Inc. +.PP +This program comes with NO WARRANTY, to the extent permitted by law. +You may redistribute copies of this program +under the terms of the GNU General Public License. +For more information about these matters, see the file named COPYING. +.SH "SEE ALSO" +The full documentation for +.B diff +is maintained as a Texinfo manual. If the +.B info +and +.B diff +programs are properly installed at your site, the command +.IP +.B info diff +.PP +should give you access to the complete manual. diff --git a/gnu/dist/diffutils/man/diff3.1 b/gnu/dist/diffutils/man/diff3.1 new file mode 100644 index 00000000000..c07bd067c6b --- /dev/null +++ b/gnu/dist/diffutils/man/diff3.1 @@ -0,0 +1,78 @@ +.\" $NetBSD: diff3.1,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ +.\" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.27. +.TH DIFF3 "1" "April 2002" "diffutils 2.8.1" "User Commands" +.SH NAME +diff3 \- compare three files line by line +.SH SYNOPSIS +.B diff3 +[\fIOPTION\fR]... \fIMYFILE OLDFILE YOURFILE\fR +.SH DESCRIPTION +Compare three files line by line. +.TP +\fB\-e\fR \fB\-\-ed\fR +Output unmerged changes from OLDFILE to YOURFILE into MYFILE. +.TP +\fB\-E\fR \fB\-\-show\-overlap\fR +Output unmerged changes, bracketing conflicts. +.TP +\fB\-A\fR \fB\-\-show\-all\fR +Output all changes, bracketing conflicts. +.TP +\fB\-x\fR \fB\-\-overlap\-only\fR +Output overlapping changes. +.TP +\fB\-X\fR +Output overlapping changes, bracketing them. +.TP +\fB\-3\fR \fB\-\-easy\-only\fR +Output unmerged nonoverlapping changes. +.TP +\fB\-m\fR \fB\-\-merge\fR +Output merged file instead of ed script (default \fB\-A\fR). +.TP +\fB\-L\fR LABEL \fB\-\-label\fR=\fILABEL\fR +Use LABEL instead of file name. +.TP +\fB\-i\fR +Append `w' and `q' commands to ed scripts. +.TP +\fB\-a\fR \fB\-\-text\fR +Treat all files as text. +.TP +\fB\-T\fR \fB\-\-initial\-tab\fR +Make tabs line up by prepending a tab. +.TP +\fB\-\-diff\-program\fR=\fIPROGRAM\fR +Use PROGRAM to compare files. +.TP +\fB\-v\fR \fB\-\-version\fR +Output version info. +.TP +\fB\-\-help\fR +Output this help. +.PP +If a FILE is `-', read standard input. +.SH AUTHOR +Written by Randy Smith. +.SH "REPORTING BUGS" +Report bugs to <bug-gnu-utils@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2002 Free Software Foundation, Inc. +.PP +This program comes with NO WARRANTY, to the extent permitted by law. +You may redistribute copies of this program +under the terms of the GNU General Public License. +For more information about these matters, see the file named COPYING. +.SH "SEE ALSO" +The full documentation for +.B diff3 +is maintained as a Texinfo manual. If the +.B info +and +.B diff3 +programs are properly installed at your site, the command +.IP +.B info diff +.PP +should give you access to the complete manual. diff --git a/gnu/dist/diffutils/man/sdiff.1 b/gnu/dist/diffutils/man/sdiff.1 new file mode 100644 index 00000000000..096bc80d492 --- /dev/null +++ b/gnu/dist/diffutils/man/sdiff.1 @@ -0,0 +1,90 @@ +.\" $NetBSD: sdiff.1,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ +.\" +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.27. +.TH SDIFF "1" "April 2002" "diffutils 2.8.1" "User Commands" +.SH NAME +sdiff \- side-by-side merge of file differences +.SH SYNOPSIS +.B sdiff +[\fIOPTION\fR]... \fIFILE1 FILE2\fR +.SH DESCRIPTION +Side-by-side merge of file differences. +.TP +\fB\-o\fR FILE \fB\-\-output\fR=\fIFILE\fR +Operate interactively, sending output to FILE. +.TP +\fB\-i\fR \fB\-\-ignore\-case\fR +Consider upper- and lower-case to be the same. +.TP +\fB\-E\fR \fB\-\-ignore\-tab\-expansion\fR +Ignore changes due to tab expansion. +.TP +\fB\-b\fR \fB\-\-ignore\-space\-change\fR +Ignore changes in the amount of white space. +.TP +\fB\-W\fR \fB\-\-ignore\-all\-space\fR +Ignore all white space. +.TP +\fB\-B\fR \fB\-\-ignore\-blank\-lines\fR +Ignore changes whose lines are all blank. +.TP +\fB\-I\fR RE \fB\-\-ignore\-matching\-lines\fR=\fIRE\fR +Ignore changes whose lines all match RE. +.TP +\fB\-\-strip\-trailing\-cr\fR +Strip trailing carriage return on input. +.TP +\fB\-a\fR \fB\-\-text\fR +Treat all files as text. +.TP +\fB\-w\fR NUM \fB\-\-width\fR=\fINUM\fR +Output at most NUM (default 130) columns per line. +.TP +\fB\-l\fR \fB\-\-left\-column\fR +Output only the left column of common lines. +.TP +\fB\-s\fR \fB\-\-suppress\-common\-lines\fR +Do not output common lines. +.TP +\fB\-t\fR \fB\-\-expand\-tabs\fR +Expand tabs to spaces in output. +.TP +\fB\-d\fR \fB\-\-minimal\fR +Try hard to find a smaller set of changes. +.TP +\fB\-H\fR \fB\-\-speed\-large\-files\fR +Assume large files and many scattered small changes. +.TP +\fB\-\-diff\-program\fR=\fIPROGRAM\fR +Use PROGRAM to compare files. +.TP +\fB\-v\fR \fB\-\-version\fR +Output version info. +.TP +\fB\-\-help\fR +Output this help. +.PP +If a FILE is `-', read standard input. +.SH AUTHOR +Written by Thomas Lord. +.SH "REPORTING BUGS" +Report bugs to <bug-gnu-utils@gnu.org>. +.SH COPYRIGHT +Copyright \(co 2002 Free Software Foundation, Inc. +.PP +This program comes with NO WARRANTY, to the extent permitted by law. +You may redistribute copies of this program +under the terms of the GNU General Public License. +For more information about these matters, see the file named COPYING. +.SH "SEE ALSO" +The full documentation for +.B sdiff +is maintained as a Texinfo manual. If the +.B info +and +.B sdiff +programs are properly installed at your site, the command +.IP +.B info diff +.PP +should give you access to the complete manual. diff --git a/gnu/dist/diffutils/po/LINGUAS b/gnu/dist/diffutils/po/LINGUAS new file mode 100644 index 00000000000..603a5833a4d --- /dev/null +++ b/gnu/dist/diffutils/po/LINGUAS @@ -0,0 +1 @@ +cs da de en_GB eo es fr gl he id ja pl ru sv tr zh_TW diff --git a/gnu/dist/diffutils/po/Makefile.in.in b/gnu/dist/diffutils/po/Makefile.in.in new file mode 100644 index 00000000000..ada8bb4ffa3 --- /dev/null +++ b/gnu/dist/diffutils/po/Makefile.in.in @@ -0,0 +1,317 @@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2002 by Ulrich Drepper <drepper@gnu.ai.mit.edu> +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS)" ;; *) echo "$(top_builddir)/$(MKINSTALLDIRS)" ;; esac` + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +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 Makevars remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) POTFILES.in $(DOMAIN).pot \ +$(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-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: $(CATALOGS) +all-no: + +# 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. + +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' + 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; \ + } + +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common); do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(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"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(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"; then \ + for file in $(DISTFILES.common); 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 + +dvi info tags TAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + 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 $(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: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test -f $(srcdir)/ChangeLog; then dists="$$dists ChangeLog"; fi; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext"; 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 $(top_builddir)/config.status POTFILES.in + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +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/gnu/dist/diffutils/po/Makevars b/gnu/dist/diffutils/po/Makevars new file mode 100644 index 00000000000..8b09f53b0f5 --- /dev/null +++ b/gnu/dist/diffutils/po/Makevars @@ -0,0 +1,25 @@ +# 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_ + +# 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 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/gnu/dist/diffutils/po/POTFILES.in b/gnu/dist/diffutils/po/POTFILES.in new file mode 100644 index 00000000000..3a987b2dfe4 --- /dev/null +++ b/gnu/dist/diffutils/po/POTFILES.in @@ -0,0 +1,33 @@ +# List of files that contain translatable strings. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +lib/c-stack.c +lib/error.c +lib/freesoft.c +lib/getopt.c +lib/regex.c +lib/xmalloc.c + +src/analyze.c +src/cmp.c +src/diff.c +src/diff3.c +src/dir.c +src/sdiff.c +src/util.c diff --git a/gnu/dist/diffutils/po/Rules-quot b/gnu/dist/diffutils/po/Rules-quot new file mode 100644 index 00000000000..5f46d237d25 --- /dev/null +++ b/gnu/dist/diffutils/po/Rules-quot @@ -0,0 +1,42 @@ +# 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-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/gnu/dist/diffutils/po/boldquot.sed b/gnu/dist/diffutils/po/boldquot.sed new file mode 100644 index 00000000000..4b937aa517b --- /dev/null +++ b/gnu/dist/diffutils/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/“/“[1m/g +s/â€/[0mâ€/g +s/‘/‘[1m/g +s/’/[0m’/g diff --git a/gnu/dist/diffutils/po/cs.gmo b/gnu/dist/diffutils/po/cs.gmo Binary files differnew file mode 100644 index 00000000000..5ed97e16f16 --- /dev/null +++ b/gnu/dist/diffutils/po/cs.gmo diff --git a/gnu/dist/diffutils/po/cs.po b/gnu/dist/diffutils/po/cs.po new file mode 100644 index 00000000000..b749caefd75 --- /dev/null +++ b/gnu/dist/diffutils/po/cs.po @@ -0,0 +1,947 @@ +# Czech translations for the GNU diffutils messages. +# Copyright (C) 1998 Free Software Foundation, Inc. +# Petr Koèvara <petr.kocvara@nemfm.cz>, 1998, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-19 18:44+0100\n" +"Last-Translator: Petr Koèvara <petr.kocvara@nemfm.cz>\n" +"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "chyba programu" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "pøeteèení zásobníku" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Neznámá chyba systému" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Tento program je zcela BEZ ZÁRUKY, v rozsahu povoleném zákony.\n" +"Toto programové vybavení mù¾ete dále ¹íøit podle podmínek Obecné veøejné\n" +"licence GNU. Dal¹í informace o licenèních podmínkách naleznete v souboru\n" +"COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: pøepínaè `%s' není jednoznaèný\n" + +#: lib/getopt.c:718 +#, 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:723 +#, 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:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: pøepínaè `%s' vy¾aduje argument\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neznámý pøepínaè `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neznámý pøepínaè `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: neznámý pøepínaè -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: neznámý pøepínaè -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: pøepínaè vy¾aduje argument -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: pøepínaè `-W %s' není jednoznaèný\n" + +#: lib/getopt.c:898 +#, 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/regex.c:1367 +msgid "Success" +msgstr "Hotovo" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "®ádná shoda" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Neplatný regulární výraz" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Neplatný znak porovnání" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Neplatné jméno tøídy znakù" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Koncové zpìtné lomítko" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Neplatný zpìtný odkaz" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Nepárová [ nebo ]^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Nepárová ( nebo \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Nepárová \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Neplatný obsah \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Neplatný konec rozsahu" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Pamì» vyèerpána" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Neplatný pøedchozí regulární výraz" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Pøedèasný konec regulárního výrazu" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Regulární výraz je pøíli¹ dlouhý" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Nepárová ) nebo \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Pøedchozí regulární výraz neexistuje" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "pamì» vyèerpána" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Soubory %s a %s jsou rùzné\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Binární soubory %s a %s jsou rùzné\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Chybí znak konce øádku na konci souboru" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Autoøi: Torbjorn Granlund a David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Více informací získáte pøíkazem `%s --help'." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "neplatná hodnota --ignore-inital `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "pøepínaèe -l a -s nejsou kompatibilní" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "zápis selhal" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "standardní výstup" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Vypí¹e rozdílné bajty." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i N --ignore-initial=N Ignoruje prvních N bajtù na vstupu." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i N1:N2 --ignore-initial=N1:N2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Pøeskoèí prvních N1 bajtù souboru SOUBOR1 a prvních N2 bajtù souboru " +"SOUBOR2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Vypí¹e pozice a hodnoty v¹ech rozdílných bajtù." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT Porovná maximálnì LIMIT bajtù." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent ®ádný výstup; vrátí pouze status." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Informace o verzi." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Vypí¹e tuto nápovìdu." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Pou¾ití: %s [PØEPÍNAÈ]... SOUBOR1 [SOUBOR2 [SKIP1 [SKIP2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Porovnání dvou soborù bajt po bajtu." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "N1 a N2 udávají poèet bajtù, které budou ignorovány v ka¾dém souboru." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Hodnoty SKIP mohou být doplnìny následujícími pøíponami:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, a stejnì tak i pro T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "" +"Pokud SOUBOR bude `-' nebo nebude existovat, bude èten standardní vstup." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" +"Chyby v programu oznamujte na adrese <bug-gnu-utils@gnu.org> (pouze " +"anglicky),\n" +"pøipomínky k pøekladu zasílejte na adresu <cs@li.org> (èesky)." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "neplatná hodnota pøepínaèe --bytes `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "po `%s' je nesprávný operand" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "operand `%s' je nadbyteèný" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s se li¹í: bajt %s, øádek %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s se li¹í: bajt %s, øádek %s je %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF v %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Autoøi: Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman a Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "neplatná délka kontextu `%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "pøestránkování není na tomto poèítaèi podporováno" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "pøíli¹ mnoho pøepínaèù popisu souboru" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "nesprávná délka `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "neplatná délka obzoru `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "pøepínaè `-%ld' je obsolete; pou¾ijte `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "pøepínaè `-%ld' je obsolete; omit it" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Porovnání souborù øádek po øádku." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case Ignoruje velikost písmen v obsahu souboru." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case Ignoruje velikost písmen v názvech souborù." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Bere v potaz velikost písmen v názvech souborù." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "-E --ignore-tab-expansion Ignoruje zmìny v odsazení tabelátorem." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Ignoruje zmìny v poètu mezer." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Ignoruje v¹echny mezery." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines Ignoruje zmìny v pøípadì prázdných øádkù." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RV --ignore-matching-lines=RV Ignoruje zmìny na v¹ech øádcích\n" +" odpovídajících RV." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Odstraní ukonèovací znak CR na vstupu." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Ète a zapisuje data v binárním re¾imu." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Pokládá v¹echny soubory za text." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C POÈ --context[=POÈ] Vypí¹e POÈ (implicitnì 3) øádky kopírovaného\n" +" kontextu.\n" +"-u -U POÈ --unified[=POÈ] Vypí¹e POÈ (implicitnì 3) øádky sjednoceného\n" +" kontextu.\n" +" -L POPIS --label POPIS Pou¾ije POPIS místo jména souboru.\n" +" -p --show-c-function U ka¾dé zmìny vypí¹e jméno C funkce, ve které se\n" +" tato zmìna nachází.\n" +" -F RV --show-function-line=RV Vypí¹e nejnovìj¹í øádky odpovídající RV." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Výstup pouze pøi rozdílných souborech." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Vytvoøí skript pro ed." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Výstup bude v normálním diff formátu." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Výstup bude ve formátu RCS diff." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Výstup ve dvou sloupcích.\n" +" -W POÈ --width=POÈ Vypí¹e maximálnì POÈ (implicitnì 130) znakù na " +"øádek.\n" +" --left-column Vypí¹e pouze levý sloupec spoleèných øádkù.\n" +" --suppress-common-lines Nevypí¹e spoleèné øádky." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D JMENO --ifdef=JMENO Vypí¹e slouèený soubor s rozdíly `#ifdef JMENO'." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=FMTS Podobné, ale formátuje vstupní skupiny GTYPE\n" +" podle FMTS." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=FMTR Podobnì, ale formátuje v¹echny vstupní øádky podle FMTR." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=FMTR Podobné, ale formátuje vstupní øádky LTYPE podle " +"FMTR." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE je `starý', `nový' nebo `nezmìnìn'. GTYPE je LTYPE nebo `zmìnìn'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT mù¾e obsahovat:\n" +" %< øádky ze SOUBOR1\n" +" %> øádky ze SOUBOR2\n" +" %= øádky spoleèné pro SOUBOR1 i SOUBOR2\n" +" %[-][DELKA][.[PRES]]{doxX}ZNAK formát stylu printf pro ZNAK\n" +" ZNAKy dále jsou pro novou skupinu, malými písmeny pro starou skupinu:\n" +" F èíslo prvního øádku\n" +" L èíslo posledního øádku\n" +" N poèet øádkù = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT mù¾e obsahovat:\n" +" %L obsah øádku\n" +" %l obsah øádku, s vyjímkou znaku konce øádku\n" +" %[-][©ÍØKA][.[PØES]]{doxX}c formát stylu printf pro èíslo vstupního " +"øádku" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Jeden z GFMT nebo LFMT mù¾e obsahovat:\n" +" %% %\n" +" %c'C' jeden znak C\n" +" %c'\\000' znak s osmièkovým kódem 000" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Výstup projde pøes `pr' pro pøestránkování." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Ve výstupu pøevede tabulátory na mezery." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab Na zaèátek øádkù se vlo¾í tabulátor." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Rekurzívní porovnání v¹ech nalezených podadresáøù." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Neexistující soubory pova¾uje za prázdné." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Pøi porovnávání adresáøù pova¾uje neexistující\n" +" soubory v prvém adresáøi za prázdné." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Uvede pouze shodné soubory." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x VZOR --exclude=VZOR Vynechá soubory odpovídající VZORu." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X SOUBOR --exclude-from=SOUBOR Vynechá soubory, které odpovídají\n" +" libovolnému vzorku ze SOUBORu." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S SOUBOR --starting-file=SOUBOR Pøi porovnávání adresáøù zaène souborem\n" +" SOUBOR." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=SOUBOR1 Porovná SOUBOR1 se v¹emi operandy. SOUBOR1 mù¾e být\n" +" adresáø." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=SOUBOR2 Porovná v¹echny operandy se SOUBOR2. SOUBOR2 mù¾e být\n" +" adresáø." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=POÈET Ponechá POÈET shodných øádkù pøedpony a pøípony." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Pokusí se nalézt nejmen¹í sadu zmìn." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Pøedpokládá velké soubory a mnoho rozptýlených\n" +" drobných zmìn." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"SOUBORY jsou `SOUBOR1 SOUBOR2' nebo `ADRESAR1 ADRESAR2' nebo\n" +"`ADRESAR SOUBOR...' nebo `SOUBOR... ADRESAR'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Pokud je uveden --from-file nebo --to-file, pak nejsou u SOUBORù ¾ádná " +"omezení." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Pokud SOUBOR bude `-', bude èten standardní vstup." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Pou¾ití: %s [PØEPÍNAÈ]... SOUBORY\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "pro pøepínaè %s konfliktní hodnota `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "konfliktní pøepínaèe pro styl výstupu" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "obyèejný prázdný soubor" + +#: src/diff.c:976 +msgid "regular file" +msgstr "obyèejný soubor" + +#: src/diff.c:978 +msgid "directory" +msgstr "adresáø" + +#: src/diff.c:981 +msgid "block special file" +msgstr "speciální blokový soubor" + +#: src/diff.c:984 +msgid "character special file" +msgstr "speciální znakový soubor" + +#: src/diff.c:987 +msgid "fifo" +msgstr "roura" + +#: src/diff.c:991 +msgid "socket" +msgstr "soket" + +#: src/diff.c:994 +msgid "message queue" +msgstr "fronta zpráv" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semafor" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "objekt sdílené pamìti" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "typový pamì»ový objekt" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "soubor neznámého typu" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Pouze v %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "`-' s adresáøem nelze porovnat" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D pøepínaè nepodporuje práci s adresáøi" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Spoleèné podadresáøe: %s a %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Soubor %s je %s pokud soubor %s je %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Soubory %s a %s jsou identické\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Autor: Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "nekompatibilní pøepínaèe" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "`-' zadáno pro více ne¾ jeden vstupní soubor" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "ètení selhalo" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Vypí¹e nespojené zmìny ze STARYSOUBOR k VASSOUBOR do MUJSOUBOR." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap Vypí¹e neslouèené zmìny, konflikty v závorkách." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Vypí¹e v¹echny rozdíly, konflikty v závorkách." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Vypí¹e pøekrývající se zmìny." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Vypí¹e pøekrývající se zmìny, uzavøené v závorkách." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Vypí¹e neslouèené nepøekrývající se zmìny." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "-m --merge Vypí¹e spojený soubor místo ed skriptu (implicitnì -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L POPIS --label=POPIS Pou¾ije POPIS místo jména souboru." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Pøidá pøíkazy `w' a `q' do skriptù pro ed." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM Pou¾ij PROGRAM k porovnání souborù." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Pou¾ití: %s [PØEPÍNAÈ]... MUJSOUBOR STARYSOUBOR VASSOUBOR\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Porovnání tøí souborù øádek po øádku." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "vnitøní chyba: chyba ve formátu diff blokù" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff selhal: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "vnitøní chyba: nesprávný typ diffu v process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "neplatný formát diff souboru; neplatný oddìlovaè zmìny" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "neplatný formát diff souboru; nekompletní poslední øádek" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "pomocný program `%s' není spustitelný" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "pomocný program `%s' nebyl nalezen" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "pomocný program `%s' selhal" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "neplatný formát diff souboru; nesprávné úvodní znaky na øádku" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "vnitøní chyba: nesprávný typ diffu pro výstup" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "vstupní soubor se zmen¹il" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "nemohu porovnat jména souborù `%s' a `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Autor: Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o SOUBOR --output=SOUBOR Interaktivní práce, výstup pùjde do SOUBORu." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Nerozli¹uje velká a malá písmena." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignoruje v¹echny mezery." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w POÈ --width=POÈ Vypí¹e maximálnì POÈ (implicitnì 130) znakù na øádek." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Vypí¹e pouze levý sloupec spoleèných øádkù." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Nevypisuje shodné øádky." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Pøedpokládá velké soubory a mnoho rozptýlených\n" +" drobných zmìn." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Pou¾ití: %s [PØEPÍNAÈ]... SOUBOR1 SOUBOR2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "interaktivnì nelze standardní vstup slouèit" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "oba soubory k porovnání jsou adresáøi" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tEditace - pou¾ije obì verze, ka¾dou obdaøí hlavièkou.\n" +"eb:\tEditace - pou¾ije obì verze.\n" +"el:\tEditace - pou¾ije levou verzi.\n" +"er:\tEditace - pou¾ije pravou verzi.\n" +"e:\tEditace nové verze.\n" +"l:\tPou¾ije levou verzi.\n" +"r:\tPou¾ije pravou verzi.\n" +"s:\tVtichosti vlo¾í spoleèné øádky.\n" +"v:\tUpozorní na vlo¾ení spoleèných øádkù.\n" +"q:\tUkonèení.\n" + +#~ msgid "context length specified twice" +#~ msgstr "délka kontextu zadána dvakrát" + +#~ msgid "multiple `--from-file' options" +#~ msgstr "více pøepínaèù `--from-file'" + +#~ msgid "multiple `--to-file' options" +#~ msgstr "více pøepínaèù `--to-file'" + +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge Neslouèí èásti." + +#~ msgid "regular empty executable file" +#~ msgstr "obyèejný prázdný spustitelný soubor" + +#~ msgid "regular executable file" +#~ msgstr "obyèejný spustitelný soubor" diff --git a/gnu/dist/diffutils/po/da.gmo b/gnu/dist/diffutils/po/da.gmo Binary files differnew file mode 100644 index 00000000000..3af33a07448 --- /dev/null +++ b/gnu/dist/diffutils/po/da.gmo diff --git a/gnu/dist/diffutils/po/da.po b/gnu/dist/diffutils/po/da.po new file mode 100644 index 00000000000..368d076bce8 --- /dev/null +++ b/gnu/dist/diffutils/po/da.po @@ -0,0 +1,931 @@ +# Danish diffutils translation po-file +# Copyright (C) 2000 Free Software Foundation, Inc. +# Claus Hindsgaul <claus_h@image.dk>, 2000-2002. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-12 14:51GMT\n" +"Last-Translator: Claus Hindsgaul <claus_h@image.dk>\n" +"Language-Team: Danish <dansk@klid.dk>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.5\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "programfejl" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "stakoverløb" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Ukendt systemfejl" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Dette program kommer HELT UDEN GARANTI i den udstrækning, loven tillader " +"det.\n" +"Du må videredistribuere kopier af dette program\n" +"under betingelserne i GNU General Public License (GPL).\n" +"Se filen COPYING for flere oplysninger om dette." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: tilvalg '%s' er flertydigt\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '--%s' tillader ikke et parameter\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: tilvalg '%c%s' tillader ikke et parameter\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: tilvalg '--%s' tillader ikke et parameter\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ukendt tilvalg '--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ukendt tilvalg '%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ugyldigt tilvalg -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt tilvalg -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: tilvalg kræver et parameter -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: tilvalget '-W %s' er flertydigt\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: tilvalget '-W %s' tillader ikke et parameter\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Succes" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Ingen match" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Ugyldigt regulært udtryk" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Ugyldig sammenlignings-tegn" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Ugyldigt navn på tegn-klasse" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Efterstillet backslash" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Ugyldig bagud-reference" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Uparret [ eller [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Uparret ( eller \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Uparret \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Ugyldigt indhold af \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Ugyldig område-afslutning" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Hukommelse opbrugt" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Ugyldigt foranstillet regulært udtryk" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "For tidlig afslutning på regulært udtryk" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "For stort regulært udtryk" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Uparret ) eller \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Intet foranstillet regulært udtryk" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "hukommelse opbrugt" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Filerne %s og %s er forskellige\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Binære filer %s og %s er forskellige\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Intet linjeskift ved filafslutning" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Skrevet af Torbjorn Granlund og David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Prøv '%s --help' for mere information." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "ugyldig '--ignore-initial'-værdi `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "tilvalgene -l og -s er inkompatible" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "skrivning mislykkedes" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "standard-ud" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-byte Vis afvigende byte." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i SPRING --ignore-initial=SPRING Overspring de første SPRING byte i " +"inddata." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SPRING1:SPRING2 --ignore-initial=SPRING1:SPRING2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Overspring de første SPRING1 byte i FIL1 og de første SPRING2 byte i FIL2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Vis antal byte og værdierne for alle afvigende byte." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n GRÆNSE --bytes=GRÆNSE Sammenlign højst GRÆNSE byte." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" +"-s --quiet --silent Ingen udlæsning; sæt kun en afslutnings-slut-kode." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Vis versions-info." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Vis denne hjælp." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Brug: %s [TILVALG]... FIL1 [FIL2 [SPRING1 [SPRING2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Sammenlign to filer byte for byte." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "" +"SPRING1 og SPRING2 er antallet af byte, der skal overspringes i hver fil." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"SPRING-værdier kan efterfølges af følgende enheder:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, og så videre for T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Såfremt en FIL er '_' eller mangler, læses fra standard inddata." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Raportér programfejl på engelsk til <bug-gnu-utils@gnu.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "ugyldig '--bytes'-værdi `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "manglende operant efter '%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "ekstra operant '%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s afviger: byte %s, linje %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s afviger: tegn %s, linje %s er %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: filafslutning på %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Skrevet af Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman og Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "ugyldig indholdslængde '%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "paginering understøttes ikke af denne vært" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "for mange fil-mærke tilvalg" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "ugyldig bredde '%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "modstridende breddeangivelser" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "ugyldig horisont-længde '%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "Tilvalget '-%ld' er forældet; benyt '-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "Tilvalget '-%ld' er forældet; udelad det" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "både --from-file og --to-file er angivet" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Sammenlign filer linje for linje" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case Ignorér versalforskelle i filindholdet" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case Ignorér versalforskelle ved sammenligning af " +"filnavne." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Bemærk versalforskelle, når filnavne " +"sammenlignes." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Ignore ændringer, der skyldes tabulatoromsætning." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" +"-b --ignore-space-change Ignorér ændringer i antallet af mellemrumstegn." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Ignorér alle mellemrums-tegn." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines Ignorér ændringer med udelukkende tomme linjer." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I MØNSTER --ignore-matching-lines=MØNSTER Ignorér ændringer, hvis linjer " +"alle matcher MØNSTER." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" +"--strip-trailing-cr Fjern afsluttende vognretur (carriage return) i inddata." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Læs og skriv data binært." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Behandl alle filer som tekst." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C ANTAL --context[=ANTAL] Udlæs ANTAL (standard 3) linjer af kopieret " +"kontekst.\n" +"-u -U ANTAL --unified[=ANTAL] Udlæs ANTAL (standard 3) linjer af unified " +"kontekst.\n" +" -L MÆRKE --label MÆRKE Brug MÆRKE i stedet for filnavn.\n" +" -p --show-c-function Vis hvilken C funktion hver ændring er i.\n" +" -F MØNSTER --show-function-line=MØNSTER Vis den sidste foregående linje, " +"der matcher MØNSTER." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Undersøg kun om filerne er ens eller ej." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Udlæs et ed skript." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Udlæs en almindelig diff." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Udlæs en diff i RCS-format." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Udlæs i to kolonner.\n" +" -W ANTAL --width=ANTAL Udlæs højst ANTAL (standard 130) skriftsøjler.\n" +" --left-column Vis kun venstre kolonne af identiske linjer.\n" +" --suppress-common-lines Udlæs ikke sammenfaldende linjer." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NAVN --ifdef=NAVN Udlæs flettet fil for at vise '#ifdef NAVN' ændringer." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Det samme, men formatér GTYPE inddata grupper med " +"GFMT" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT Det samme, men formatér alle indlæste linjer med LFMT." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Det samme, men formatér LTYPE inddata med LFMT" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE er 'gammel', 'ny' eller 'uændret'. GTYPE er LTYPE eller 'ændret'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT må indeholde:\n" +" %< linjer fra FIL1\n" +" %> linjer fra FIL2\n" +" %= linjer, der er fælles mellem FIL1 og FIL2\n" +" %[-][BREDDE][.[PRÆC]]{doxX}BOGSTAV printf-type specifikation for " +"BOGSTAV\n" +" BOGSAV er som nedenfor for en ny gruppe, små bogstaver for gammel " +"gruppe:\n" +" F første linjenummer\n" +" L sidste linjenummer\n" +" N antal linjer = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT må indeholde:\n" +" %L indhold af linje\n" +" %l indhold af linje, undtagen eventuel følgende linjeskift\n" +" %[-][BREDDE][.[PRÆC]]{doxX}n printf-stil angivelse af inddata " +"linjenummer" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Enten kan GFMT eller LFMT indeholde:\n" +" %% %\n" +" %c'T' tegnet T alene\n" +" %c'\\000' tegnet med oktal kode 000" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Led uddata gennem 'pr' for at sideinddele det." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Lav tabulatorer om til mellemrum i output." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab Få tabulatorer på linje ved at forudstille en tabulator." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Sammenlign alle fundne underkataloger rekursivt." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Behandl manglende filer som var de tomme." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Behandl første manglende filer som var de tomme." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Rapportér hvis to filer er ens." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x MØNSTER --exclude=MØNSTER Udelad filer, det matcher MØNSTER." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FIL --exclude-from=FIL Udelad filer, der matcher ethvert mønster i FIL." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "-S FIL --starting-file=FIL Star med FIL, når kataloger sammenlignes." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FIL1 Sammenlign FIL1 med alle operanter. FIL1 må godt være et " +"katalog." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FIL1 Sammenlign alle operanter med FIL2. FIL2 må godt være et " +"katalog." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=ANTAL Behold ANTAL linjer af fælles præfix og suffiks." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Grundigt forsøg på at finde et mindre antal ændringer." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Antag store filer og mange spredte, små ændringer." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FILER er 'FIL1 FIL2' eller 'KATALOG1 KATALOG2' eller 'KATALOG FIL...' eller " +"'FIL... KATALOG'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"hvis --from-file eller --to-file er angivet, er der ingen restriktioner på " +"FILER." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Såfremt en FIL er '-', læses fra standard-ind." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Brug: %s [TILVALG]... FILER\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "modstridende værdi for %s-tilvalget: '%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "modstridende valg af uddata-stil" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "almindelig tom fil" + +#: src/diff.c:976 +msgid "regular file" +msgstr "almindelig fil" + +#: src/diff.c:978 +msgid "directory" +msgstr "katalog" + +#: src/diff.c:981 +msgid "block special file" +msgstr "blok-specialfil" + +#: src/diff.c:984 +msgid "character special file" +msgstr "tegn-specialfil" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "stik" + +#: src/diff.c:994 +msgid "message queue" +msgstr "meddelelseskø" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "signal" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "delt hukommelses-objekt" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "typeangivet hukommelses-objekt" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "mystisk fil" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Kun i %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "kan ikke sammenligne '-' med et katalog" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D tilvalg understøttes ikke for kataloger" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Identiske underkataloger: %s og %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Filen %s er en %s mens filen %s er en %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Filerne %s og %s er identiske\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Skrevet af Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "inkompatible tilvalg" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "'-' angiver mere en én ind-fil" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "læsning mislykkedes" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Udlæs uflettede ændringer mellem GAMMELFIL og DINFIL til MINFIL." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap Udlæs uflettede ændringer, konflikter i paranteser" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Udlæs alle ændringer, konflikter i paranteser." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Vis kun overlappende ændringer." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Udlæs overlappende ændringer, i paranteser." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Udlæs ikke-flettede, ikke-overlappende ændringer." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "-m --merge Udlæs flettet fil i stedet for ed skript (standard -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L MÆRKE --label=MÆRKE Brug MÆRKE i stedet for filnavn." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Tilføj 'w' og 'q'-kommandoer til ed skripter." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM Brug PROGRAM til at sammenligne filerne." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Brug: %s [TILVALG]... MINFIL GAMMELFIL DINFIL\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Sammenlign tre filer linje for linje." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "intern fejl: rod i formatet på diff blokke" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff fejlede: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "intern fejl: ugyldig diff type i process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "ugyldigt diff format; ugyldig ændrings-separator" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "ugyldigt diff format; uafsluttet sidste linje" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "hjælpeprogram '%s' er ikke eksekverbart" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "hjælpeprogram '%s' blev ikke fundet" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "hjælpeprogram '%s' fejlede" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "ugyldigt diff format; forkerte linje-begyndelses-tegn" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "intern fejl: ugyldig diff type sendt til uddata" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "ind-fil formindskedes" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "kan ikke sammenligne filnavnene '%s' og '%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Skrevet af Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o FIL --output=FIL Arbejd interaktivt, send uddata til FIL." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-e --ignore-case Anse store og små bogstaver for at være ens." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignorer alle mellemrumskarakterer." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w ANTAL --width=ANTAL Udlæs højst ANTAL (standard 130) søjler per linje." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Vis kun venstre kolonne af identiske linjer." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Udlæs ingen identiske linjer." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Antag store filer og mange spredte, små ændringer." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Brug: %s [TILVALG]... FIL1 FIL2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Ved-siden-af-hinanden-sammenfletning af filforskelle." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "kan ikke indflette standard input interaktivt" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "begge filer der sammenlignes er kataloger" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tRedigér og brug så begge udgaver, hver udstyret med et hoved.\n" +"eb:\tRedigér og brug så begge udgaver.\n" +"el:\tRedigér og brug så venstre udgave.\n" +"er:\tRedigér og brug så højre udgave.\n" +"e:\tRedigér en ny udgave.\n" +"l:\tBrug venstre udgave.\n" +"r:\tBrug højre udgave.\n" +"s:\tMedtag tavst fælles linjer.\n" +"v:\tMedtag og vis fælles linjer.\n" +"q:\tAfslut.\n" diff --git a/gnu/dist/diffutils/po/de.gmo b/gnu/dist/diffutils/po/de.gmo Binary files differnew file mode 100644 index 00000000000..1c33b987730 --- /dev/null +++ b/gnu/dist/diffutils/po/de.gmo diff --git a/gnu/dist/diffutils/po/de.po b/gnu/dist/diffutils/po/de.po new file mode 100644 index 00000000000..2ce4060e6f8 --- /dev/null +++ b/gnu/dist/diffutils/po/de.po @@ -0,0 +1,993 @@ +# German messages for GNU diffutils. +# Copyright (C) 1996, 2001, 2002 Free Software Foundation, Inc. +# Karl Eichwalder <keichwa@gmx.net>, 1996 +# Martin von Löwis <martin@v.loewis.de>, 1997, 2001, 2002 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-13 18:22+0100\n" +"Last-Translator: Martin von Löwis <martin@v.loewis.de>\n" +"Language-Team: German <de@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "Programmfehler" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "Stacküberlauf" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Unbekannter Systemfehler." + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Dieses Programm wird ohne Gewährleistung geliefert, soweit dies\n" +"gesetzlich zulässig ist. Sie können es unter den Bedingungen der GNU\n" +"General Public License weitergeben. \n" +"Details dazu enthält die Datei COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Option »%s« ist mehrdeutig.\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: Option »--%s« verlangt kein Argument.\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: Option »%c%s« erlaubt kein Argument.\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: Option »%s« verlangt ein Argument.\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: Unbekannte Option »--%s«.\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: Unbekannte Option »%c%s«.\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ungültige Option -- %c.\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: Option verlangt ein Argument -- %c.\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Option »-W %s« ist mehrdeutig.\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: Option »-W %s« erlaubt kein Argument.\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Erfolg." + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Keine Übereinstimmung." + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Ungültiger regulärer Ausdruck." + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Ungültiges Sortierzeichen." + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Ungültiger Name für Zeichenklasse." + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Extra Backslash." + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Ungültige Rückreferenz." + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Öffnende [ oder [^ ohne schließende." + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Öffnende ( oder \\( ohne schließende." + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Öffnende \\{ ohne schließende." + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Ungültiger Inhalt von \\{\\}." + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Ungültiges Bereichsende." + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Speicher verbraucht." + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Ungüliger vorhergehender regulärer Ausdruck." + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Vorzeitiges Ende des regulären Ausdrucks." + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Regulärer Ausdruck zu groß." + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Schließende ) oder \\) ohne öffnende." + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Kein vorhergehender regulärer Ausdruck." + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "Speicher verbraucht." + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Dateien %s und %s sind verschieden.\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Binärdateien %s and %s sind verschieden.\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Kein Zeilenumbruch am Dateiende." + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Geschrieben von Torbjorn Granlund und David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "»%s --help« gibt Ihnen mehr Informationen." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "ungültiger --ignore-initial-Wert »%s«." + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "Die Optionen -l und -s sind inkompatibel." + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "Schreibfehler." + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "Standardausgabe" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Verschiedene Bytes ausgeben." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i SKIP --ignore-initial=SKIP Die ersten SKIP Bytes der Eingabe " +"überspringen." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Die ersten SKIP1 Bytes von DATEI1 und die ersten SKIP2 Bytes von DATEI2\n" +" überspringen." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" +"-l --verbose Bytenummern und Werte aller unterschiedlichen Bytes ausgeben." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT Höchstens LIMIT Bytes vergleichen." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s -quiet --silent Keine Ausgabe; nur den Exit-Status setzen." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v -version Versionsinformation ausgeben." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Nur diese Hilfe zeigen." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Aufruf: %s [OPTION]... DATEI1 [DATEI2 [SKIP1 [SKIP2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Zwei Dateien Byte für Byte vergleichen." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "" +"SKIP1 und SKIP2 ist die Zahl der Bytes, die in jeder Datei übersprungen " +"werden." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"SKIP-Werte dürfen die folgenden multiplikativen Anhänge haben:\n" +"kB 1000, K 1024, MB 1.000.000, M 1.048.576,\n" +"GB 1.000.000.000, G 1.073.741.824, und so weiter für T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Wenn DATEI »-« ist oder fehlt, von der Standardeingabe lesen." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Fehlerberichte bitte an <bug-gnu-utils@gnu.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "ungültiger --bytes-Wert »%s«." + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "Fehlender Operand nach »%s«." + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "extra Argument »%s«." + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s differieren: Byte %s, Zeile %s.\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s differieren: Zeichen %s, Zeile %s ist %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF auf %s.\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Geschrieben von Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman und Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "Ungültige Kontextlänge »%s«." + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "Seitenumbruch ist auf diesem System nicht unterstützt." + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "Zu viele Datei-Label-Optionen." + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "Ungültig mit »%s«." + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "Widersprüchliche Breitenoptionen" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "ungültige Horizontlänge '%s'." + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "Die Option »-%ld« ist veraltet; verwenden Sie »-%c %ld«." + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "Die Option »-%ld« ist veraltet; lassen Sie sie weg." + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--from-file und --to-file sind beide angegeben." + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Vergleichen Sie Dateien Zeile für Zeile." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case Unterschiede der Groß/Kleinschreibung im Dateiinhalt \n" +" ignorieren." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case Unterschiede der Groß/Kleinschreibung von " +"Dateinamen\n" +" ignorieren." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Unterschiede der Groß/Kleinschreibung von \n" +" Dateinamen beachten." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Änderungen aufgrund von Tabausdehnungen " +"ignorieren." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Ignoriere Änderungen im Leerraum." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Freiraum ignorieren." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B, --ignore-blank-lines Die Änderungen übergehen, wo die Zeilen leer sind." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE Änderungen ignorieren, deren Zeilen \n" +" auf das Muster RE passen." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" +"--strip-trailing-cr Wagenrücklauf (CR) am Zeilenende beim Einlesen " +"entfernen." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Daten im Binärmodus lesen und schreiben." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Betrachte alle Dateien als Text." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +" -c, -C ZAHL, --context[=ZAHL] ZAHL Zeilen des kopierten Kontextes " +"ausgeben\n" +" (Vorgabe: 3).\n" +" -u, -U ZAHL, --unified[=ZAHL] ZAHL Zeilen des \"unifizierten\" " +"Kontextes ausgeben\n" +" (Vorgabe: 3).\n" +" --label LABEL LABEL statt Dateiname verwenden.\n" +" -p, --show-c-function Anzeigen, in welcher C-Funktion die " +"Veränderung\n" +" vorkommt.\n" +" -F RE, --show-function-line=RE Die nächste Zeile anzeigen, auf die RE " +"zutrifft." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Nur ausgeben ob die Dateien verschieden sind." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Ein ed-Skript ausgeben." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Ein normales Diff ausgeben." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Ausgabe im Diff-Format von RCS." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y -side-by-side In zwei Spalten ausgeben.\n" +" -W ZAHL --width=ZAHL Maximal ZAHL Zeichen pro Zeile ausgeben(Vorgabe: " +"130).\n" +" --left-column Nur linke Spalte gemeinsamer Zeilen ausgeben.\n" +" ---suppress-common-lines Keine gemeinsamen Zeilen ausgeben." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "-D NAME --ifdef=NAME Datei mit »#ifdef NAME« in die Ausgabe mischen." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Ähnlich, GTYPE-Eingabe jedoch mit GFMT " +"formatieren." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT Ähnlich, aber alle Eingabe-Zeilen mit LFMT formatieren." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Ähnlich, LTYPE-Eingabe jedoch mit LFMT formatieren." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE kann »old«, »new« oder »unchanged« sein. GTYPE ist LTYPE oder " +"»changed«." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT kann enthalten:\n" +" %< Zeilen von DATEI1.\n" +" %> Zeilen von DATEI2.\n" +" %= Zeilen, die sowohl zu DATEI1 als auc zu DATEI2 gehören.\n" +" %[-][BREITE][.[PRÄZ]]{doxX}BUCHST Ausgabe nach printf-Regeln für " +"BUCHST.\n" +" Folgende BUCHTSTaben gelten für neue Gruppen, Kleinschreibung für " +"alte:\n" +" F Erste Zeilennummer.\n" +" L Letzte Zeilennummer.\n" +" N Zahl der Zeilen = L-F+1.\n" +" E F-1." + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT kann enthalten:\n" +" %L Inhalt der Zeile.\n" +" %l Inhalt der Zeile, ohne Newline am Ende.\n" +" %[-][BREITE][.[PRÄZ]]{doxX}n Zeilennummer im printf-Stil." + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Sowohl GFMT als auch LFMT können folgendes enthalten:\n" +" %% %\n" +" %c'C' das einzelne Zeichen C\n" +" %c'\\000' das Zeichen mit dem Oktalcode 000" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Ausgabe an »pr« zum Seitenumbruch übergeben." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t -expand-tabs Tabulatoren zu Leerzeichen in der Ausgabe ausdehnen." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab Einrückungen durch vorangestellte Tabulatoren erzeugen." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Rekursiv alle Unterverzeichnisse vergleichen." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Fehlende Dateien als leer betrachten." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Die ersten fehlenden Dateien als leer betrachten." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Meldung, wenn zwei Dateien gleich sind." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "" +"-x MUSTER --exclude=MUSTER Dateien, die auf MUSTER passen, ausschließen." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X DATEI --exclude-from=DATEI Dateien überspringen, die auf eines der " +"Muster in DATEI passen." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S DATEI --starting-file=DATEI Beim Verzeichnisvergleich mit DATEI " +"beginnen." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=DATEI1 DATEI1 mit allen Operanden vergleichen.\n" +" DATEI1 kann ein Verzeichnis sein." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=DATEI2 Alle Operanden mit DATEI2 vergleichen.\n" +" DATEI2 kann ein Verzeichnis sein." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=ZAHL Behalte ZAHL Zeilen mit gemeinsamen Pre- und Suffix." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "" +"-d --minimal Aufwendig nach einem kleineren Satz von Änderungen suchen." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Es werden große Dateien und viele Änderungen vermutet." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"DATEIEN sind 'DATEI1 DATEI2' oder 'VERZ1 VERZ2' oder \"VERZ DATEI...\" \n" +"oder \"DATEI... VERZ;" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Wenn --from-file oder --to-file angegeben werden, gibt es keine \n" +"Einschränkungen für DATEIEN." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Wenn DATEI »-« ist, von der Standardeingabe lesen." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Aufruf: %s [OPTION]... DATEIEN\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "Widersprüchlicher Optionswert %s für »%s«." + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "Widersprüchliche Optionenen für den Ausgabestil." + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "Normale leere Datei." + +#: src/diff.c:976 +msgid "regular file" +msgstr "Normale Datei." + +#: src/diff.c:978 +msgid "directory" +msgstr "Verzeichnis" + +#: src/diff.c:981 +msgid "block special file" +msgstr "Blockgerät" + +#: src/diff.c:984 +msgid "character special file" +msgstr "Zeichenorientiertes Gerät" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "Socket." + +#: src/diff.c:994 +msgid "message queue" +msgstr "Nachrichtenschlange (»message queue«)" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "Semaphore." + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "Shared-Memory-Objekt." + +# XXX was ist das? +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "Typisiertes Speicherobjekt." + +#: src/diff.c:1006 +msgid "weird file" +msgstr "Seltsame Datei." + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Nur in %s: %s.\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "»-« kann nicht mit Verzeichnis verglichen werden." + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "Option -D nicht unterstützt bei Verzeichnissen" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Gemeinsame Unterverzeichnisse: %s und %s.\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Datei %s ist ein %s während Datei %s ein %s ist.\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Dateien %s und %s sind identisch.\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Geschrieben von Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "Inkompatible Optionen." + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "»-« für mehr als eine Eingabedatei angegeben." + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "Lesefehler." + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Nicht in DEINEDATEI übernommene Änderungen aus ALTEDATEI in " +"MEINEDATEI abspeichern." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Ungemische Änderungen anzeigen, Konflikte in Klammern." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Alle Änderungen ausgeben, Konflikte in Klammern." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Überlappende Änderungen ausgeben." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Überlappende Änderungen geklammert ausgeben." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "" +"-3, --easy-only Nicht-zusammengeführte (`unmerged') nichtüberlappende " +"Änderungen ausgeben." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Zusammengeführte Datei anstelle von ed-Skript ausgeben (Vorgabe " +"-A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L LABEL --label=LABEL LABEL anstelle des Dateinamens verwenden." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i An ed-Skripte »w«- und »q«-Kommandos anhängen." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +"--diff-program=PROGRAMM PROGRAMM zum Vergleichen von Dateien verwenden." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Benutzung: %s [OPTION]... MEINEDATEI ALTEDATEI DEINEDATEI\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Drei Dateien Zeile für Zeile vergleichen." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "Interner Fehler: Format für diff-Blöcke ist durcheinander." + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: »diff« ist gescheitert: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "Interner Fehler: Ungültiger diff-Typ in process_diff." + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "Ungültiges Diff-Format; ungültiger Änderungstrenner." + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "Ungültiges Diff-Format; felende letzte Zeile." + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "Unterprogramm »%s« ist nicht ausführbar." + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "Unterprogramm »%s« nicht gefunden." + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "Unterprogramm »%s« schlug fehl." + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "Ungültiges Diff-Format; inkorrektes Zeichen in führender Zeile" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "Interner Fehler: Ungültiger diff-Typ an Ausgabe übergeben." + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "Eingabedatei schrumpfte." + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "Die Dateinamen »%s« und »%s« können nicht verglichen werden." + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Geschrieben von Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o DATEI --output=DATEI Interaktiv arbeiten, Ausgabe in DATEI speichern." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "" +"-i --ignore-case Nicht zwischen Groß- und Kleinschreibung unterscheiden." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W -ignore-all-space Leerraum ignorieren." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "-w ZAHL --width=ZAHL Maximal ZAHL Zeichen pro Zeile (Vorgabe: 130)." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Nur linke Spalte der gemeinsamen Zeilen ausgeben." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Keine gemeinsamen Zeilen ausgeben." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Es werden große Dateien und viele Änderungen " +"vermutet." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Aufruf: %s [OPTION]... DATEI1 DATEI2\n" + +# XXX Was ist das? +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "" +"Nebeneinanderstehenden Zusammenbringen (side-by-side merge) der " +"Dateiunterschiede." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "Kann nicht die Standardeingabe interaktiv mischen." + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "Beide zu vergleichenden Dateien sind Verzeichnisse." + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\\tEdieren, dann beide Versionen benutzen, jede mit einem Kopf " +"dekoriert.\n" +"eb:\\tEdieren, dann beide Versionen benutzen.\n" +"el:\\tEdieren, dann linke Version benutzen.\n" +"er:\\tEdieren, dann rechte Version benutzen.\n" +"e:\\t Neue Version edieren.\n" +"l:\\tLinke Version benutzen.\n" +"r:\\tRechte Version benutzen.\n" +"s:\\tSchweigend gemeinsame Zeilen übernehmen.\n" +"v:\\tLauthals gemeinsame Zeilen übernehmen.\n" +"q:\\tBeenden.\n" + +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge Blöcke (hunks) nicht vermischen." + +#~ msgid "" +#~ "SKIP values may be followed by the following multiplicative suffixes:\n" +#~ msgstr "nicht gefunden" + +#~ msgid "kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +#~ msgstr "kB 1000, K 1024, MB 1.000.000, M 1.048.576,\n" + +#~ msgid "GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.\n" +#~ msgstr "" +#~ "GB 1.000.000.000, G 1.073.741.824, und so weiter für T, P, E, Z, Y.\n" + +#~ msgid "Report bugs to <bug-gnu-utils@gnu.org>.\n" +#~ msgstr "Fehlerberichte bitte an <bug-gnu-utils@gnu.org>.\n" + +#~ msgid "context length specified twice" +#~ msgstr "Kontextlänge zweimal angegeben." + +#~ msgid "multiple `--from-file' options" +#~ msgstr "mehrere Optionen '--from-file'." + +#~ msgid "multiple `--to-file' options" +#~ msgstr "mehrere Optionen '--to-file'." + +#~ msgid "regular empty executable file" +#~ msgstr "Normale leere ausführbare Datei." + +#~ msgid "regular executable file" +#~ msgstr "Normale ausführbare Datei." + +#~ msgid "If a FILE is `-', read standard input.\n" +#~ msgstr "Wenn DATEI »-« ist, von der Standardeingabe lesen.\n" diff --git a/gnu/dist/diffutils/po/diffutils.pot b/gnu/dist/diffutils/po/diffutils.pot new file mode 100644 index 00000000000..0325b1e1926 --- /dev/null +++ b/gnu/dist/diffutils/po/diffutils.pot @@ -0,0 +1,841 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "" + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "" + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "" + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "" + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "" + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "" + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "" + +#: src/diff.c:976 +msgid "regular file" +msgstr "" + +#: src/diff.c:978 +msgid "directory" +msgstr "" + +#: src/diff.c:981 +msgid "block special file" +msgstr "" + +#: src/diff.c:984 +msgid "character special file" +msgstr "" + +#: src/diff.c:987 +msgid "fifo" +msgstr "" + +#: src/diff.c:991 +msgid "socket" +msgstr "" + +#: src/diff.c:994 +msgid "message queue" +msgstr "" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "" + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "" + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "" + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" diff --git a/gnu/dist/diffutils/po/en@boldquot.header b/gnu/dist/diffutils/po/en@boldquot.header new file mode 100644 index 00000000000..fedb6a06d12 --- /dev/null +++ b/gnu/dist/diffutils/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/gnu/dist/diffutils/po/en@quot.header b/gnu/dist/diffutils/po/en@quot.header new file mode 100644 index 00000000000..a9647fc35c3 --- /dev/null +++ b/gnu/dist/diffutils/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/gnu/dist/diffutils/po/en_GB.gmo b/gnu/dist/diffutils/po/en_GB.gmo Binary files differnew file mode 100644 index 00000000000..00aeb817310 --- /dev/null +++ b/gnu/dist/diffutils/po/en_GB.gmo diff --git a/gnu/dist/diffutils/po/en_GB.po b/gnu/dist/diffutils/po/en_GB.po new file mode 100644 index 00000000000..57d715ba075 --- /dev/null +++ b/gnu/dist/diffutils/po/en_GB.po @@ -0,0 +1,843 @@ +# British English messages for GNU diffutils +# Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. +# Paul Eggert <eggert@twinsun.com>, 1998 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.8\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-02-27 23:01-0800\n" +"Last-Translator: Paul Eggert <eggert@twinsun.com>\n" +"Language-Team: English <en@translate.freefriends.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=US-ASCII\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "" + +# `Thou whoreson zed! Thou unnecessary letter!' -- Kent in _King Lear_ +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: unrecognised option `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: unrecognised option `%c%s'\n" + +# POSIX requires the word "illegal" in the POSIX locale, but the error +# is not really against the law. This is not the POSIX locale, so fix +# the wording. +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: unrecognised option `-%c'\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "" + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "" + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "" + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "" + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "" + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "" + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "" + +#: src/diff.c:976 +msgid "regular file" +msgstr "" + +#: src/diff.c:978 +msgid "directory" +msgstr "" + +#: src/diff.c:981 +msgid "block special file" +msgstr "" + +#: src/diff.c:984 +msgid "character special file" +msgstr "" + +#: src/diff.c:987 +msgid "fifo" +msgstr "" + +#: src/diff.c:991 +msgid "socket" +msgstr "" + +#: src/diff.c:994 +msgid "message queue" +msgstr "" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "" + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "" + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "" + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" diff --git a/gnu/dist/diffutils/po/eo.gmo b/gnu/dist/diffutils/po/eo.gmo Binary files differnew file mode 100644 index 00000000000..14f7cd982cb --- /dev/null +++ b/gnu/dist/diffutils/po/eo.gmo diff --git a/gnu/dist/diffutils/po/eo.po b/gnu/dist/diffutils/po/eo.po new file mode 100644 index 00000000000..f3de52c0616 --- /dev/null +++ b/gnu/dist/diffutils/po/eo.po @@ -0,0 +1,923 @@ +# Esperantaj mesaøoj por GNU diffutils. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Edmund GRIMLEY EVANS <edmundo@rano.org>, 2001-2002. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-13 21:19+0000\n" +"Last-Translator: Edmund GRIMLEY EVANS <edmundo@rano.org>\n" +"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-3\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "programeraro" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "stako tro granda" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Nekonata sistemeraro" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Æi tiu programo venas kun NENIA GARANTIO, laý la grado permesata de juro.\n" +"Vi rajtas redistribui kopiojn de æi tiu programo\n" +"laý la kondiæoj de la Øenerala Publika Rajtigilo de GNU.\n" +"Por pli da informoj pri æi tiaj afero, vidu la dosieron COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcio '%s' estas plursenca\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opcio '--%s' ne permesas argumenton\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opcio '%c%s' ne permesas argumenton\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s opcio '%s' postulas argumenton\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: nekonata opcio '--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: nekonata opcio '%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nepermesita opcio -- %c.\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: nevalida opcio -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcio postulas argumenton -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcio '-W %s' estas plursenca\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opcio '-W %s' ne permesas argumenton\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Sukceso" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Nenia trafo" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Nevalida regula esprimo" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Nevalida ordiga signo" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Nevalida nomo de signoklaso" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "'\\' æe la fino" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Nevalida retroreferenco" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Neparigita [ aý [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Neparigita ( aý \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Neparigita \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Nevalida kunteksto de \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Nevalida fino de gamo" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Memoro elæerpiøis" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Nevalida antaýa regula esprimo" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Neatendita fino de regula esprimo" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Regula esprimo estas tro granda" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Neparigita ) aý \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Mankas antaýa regula esprimo" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "memoro elæerpiøis" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Dosieroj %s kaj %s estas malsamaj\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Binaraj dosieroj %s kaj %s estas malsamaj\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Mankas linifino æe fino de dosiero" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Verkite de Torbjorn Granlund kaj David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Provu '%s --help' por pli da informoj." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "nevalida valoro '%s' de --ignore-initial" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "opcioj -l kaj -s malkongruas" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "skriberaro" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "normala eligo" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Eligi diferencajn bitokojn." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i N --ignore-initial=N Ignori la unuajn N bitokojn de la enigo." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i N1:N2 --ignore-initial=N1:N2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Ignori la unuajn N1 bitokojn de DOSIERO1 kaj la unuajn N2 bitokojn de " +"DOSIERO2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Eligi indeksojn kaj kodojn de æiuj diferencaj bitokoj." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMO --bytes=LIMO Kompari maksimume LIMO bitokojn." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent Eligi nenion; doni nur elig-valoron." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Eligi informojn pri la versio." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Montri æi tiun helpon." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Uzado: %s [OPCIO]... DOSIERO1 [DOSIERO2 [N1 [N2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Kompari du dosierojn bitokon post bitoko." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "N1 kaj N2 estas la nombro de bitokoj ignorendaj en æiu dosiero." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Valoroj povas esti sekvataj de la sekvaj multobligaj sufiksoj:\n" +"kB 1000, K 1024, MB 1 000 000, M 1 048 576,\n" +"GB 1 000 000 000, G 1 073 741 824, kaj tiel plu por T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Se DOSIERO estas '-' aý mankas, legi la normalan enigon." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Raportu pri cimoj al <bug-gnu-utils@gnu.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "nevalida valoro '%s' de --bytes" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "argumento mankas post '%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "kroma argumento '%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s malsamaj: bitoko %s, linio %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s malsamaj: bitoko %s, linio %s estas %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF æe %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Verkite de Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, kaj Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "nevalida longo '%s' de kunteksto" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "dispaøigo ne eblas kun æi tiu sistemo" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "tro da dosieretikedopcioj" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "nevalida larøo '%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "malkongruaj opcioj pri larøo" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "nevalida horizonta longo '%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "opcio '-%ld' estas malnova; uzu '-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "opcio '-%ld' estas malnova; ellasu øin" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--from-file kaj --to-file ambaý specifitaj" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Kompari dosierojn linion post linio." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case Ignori diferencojn en uskleco en dosierenhavo." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case Ignori usklecon en komparado de dosiernomoj." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Konsideri usklecon en komparado de dosiernomoj." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "-E --ignore-tab-expansion Ignori þanøojn kaýzatajn de TAB-oj." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Ignori þanøojn en blanka spaco." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Ignori æian blankan spacon." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines Ignori þanøojn, kies linioj estas malplenaj." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE Ignori þanøojn, kies linioj æiuj kongruas " +"kun RE." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Forigi linifinan CR æe enigo." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Legi kaj skribi datenojn binare." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Trakti æiujn dosierojn kiel tekstajn." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C NOM --context[=NOM] Eligi NOM (implicite 3) liniojn da kopiita " +"kunteksto.\n" +"-u -U NOM --unified[=NOM] Eligi NOM (implicite 3) liniojn da unuigita " +"kunteksto.\n" +" --label ETIK Uzi ETIKedon anstataý dosiernomo.\n" +" -p --show-c-function Montri, en kiu C-funkcio estas æiu þanøo.\n" +" -F RE -show-function-line=RE Montri la plej lastan linion, kiu kongruas " +"kun RE." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Eligi nur, æu la dosieroj estas malsamaj." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Eligi ed-programeton." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Eligi normalan diferencaron." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Eligi diferencaron en RCS-formo." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Eligi en du kolumnoj.\n" +" -W NOM --width=NOM Eligi maksimume NOM (implicite 130) signojn en " +"linio.\n" +" --left-column Eligi nur la maldekstran kolumnon de komunaj linioj.\n" +" --suppress-common-lines Ne eligi komunajn liniojn." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NOMO --ifdef=NOMO Eligi kunfanditan dosieron por montri '#ifdef NOMO'-" +"diferencojn." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Simile, sed montri GTYPE-enig-grupojn per GFMT." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "--line-format=LFMT Simile, sed montri æiujn enigliniojn per LFMT." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Simile, sed montri LTYPE-enig-grupojn per LFMT." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE estas 'old', 'new' aý 'unchanged'. GTYPE estas LTYPE aý 'changed'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT povas enhavi:\n" +" %< linioj el DOSIERO1\n" +" %> linioj el DOSIERO2\n" +" %= linioj komunaj al DOSIERO1 kaj DOSIERO2\n" +" %[-][LARØO][.[PREC]]{doxX}LITERO printf-stila specifo por LITERO\n" +" LITEROJ estas jenaj por nova grupo, minuskle por malnova grupo:\n" +" F unua lininumero\n" +" L lasta lininumero\n" +" N nombro de linioj = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT povas enhavi:\n" +" %L enhavo de linio\n" +" %l enhavo linio, sen eventuala linifino\n" +" %[-][LARØO][.[PREC]]{doxX}n printf-stila specifo de lininumero" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Kaj GFMT kaj LFMT povas enhavi:\n" +" %% %\n" +" %c'C' la unuopa signo C\n" +" %c'\\000' la signo kun okuma kodo OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Pasigi la eligon tra 'pr' por enpaøigi øin." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Konverti TABojn al spacetoj en la eligo." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab Øustigi TABojn per antaýmetado de spaceto." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Rekurse kompari trovitajn subdosierujojn." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Trakti mankantajn dosierojn kiel malplenajn." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Trakti mankantajn unuajn dosierojn kiel " +"malplenajn." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Raporti, kiam du dosieroj estas samaj." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x ÞAB --exclude=ÞAB Ignori dosierojn, kiuj kongruas kun ÞABlono." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X DOS --exclude-from=DOS Ignori dosierojn, kiuj kongruas kun iu þablono " +"en DOSiero." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S DOS --starting-file=DOS Komenci per DOSiero, komparante dosierujojn." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=DOS1 Kompari DOS1 kun æiuj argumentoj. DOS1 povas esti " +"dosierujo." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=DOS2 Kompari æiujn argumentoj kun DOS2. DOS2 povas esti " +"dosierujo." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=NOM Gardi NOM liniojn de la komuna prefikso kaj sufikso." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Pene seræi malpli grandan aron da þanøoj." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Atendi grandajn dosierojn kaj multajn disajn þanøetojn." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"DOSIEROJ estas 'DOSIERO1 DOSIERO2' aý 'DOSIERUJO1 DOSIERUJO2' aý DOSIERUJO " +"DOSIERO...' aý 'DOSIERO... DOSIERUJO'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Se --from-file aý --to-file estas donita, ne estas limigoj de DOSIEROJ." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Se DOSIERO estas '-', legi la normalan enigon." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Uzado: %s [OPCIO]... DOSIEROJ\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "malkongrua valoro de opcio %s: '%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "malkongruaj opcioj pri eligostilo" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "normala malplena dosiero" + +#: src/diff.c:976 +msgid "regular file" +msgstr "normala dosiero" + +#: src/diff.c:978 +msgid "directory" +msgstr "dosierujo" + +#: src/diff.c:981 +msgid "block special file" +msgstr "blokaparatdosiero" + +#: src/diff.c:984 +msgid "character special file" +msgstr "signoaparatdosiero" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "konektilo" + +#: src/diff.c:994 +msgid "message queue" +msgstr "mesaøovico" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semaforo" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "komuna memoro" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "tipita memora objekto" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "stranga dosiero" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Nur en %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "ne povas kompari '-' kun dosierujo" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "opcio -D ne eblas kun dosierujoj" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Komunaj subdosierujoj: %s kaj %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Dosiero %s estas %s, dum dosiero %s estas %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Dosieroj %s kaj %s estas samaj\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Verkite de Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "malkongruaj opcioj" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "'-' donita por pli ol unu enigdosiero" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "legeraro" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Eligi nekunfanditajn þanøojn de OLDFILE al YOURFILE en MYFILE." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Eligi nekunfanditajn þanøojn, kun konfliktoj en " +"parentezoj." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Eligi æiujn þanøojn, kun konfliktoj en parentezoj." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Eligi interkovriøantajn þanøojn." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Eligi interkovriøantajn þanøojn, en parentezoj." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Eligi nekunfanditajn neinterkovriøantajn þanøojn." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Eligi kunfanditan dosieron anstataý ed-programeto (implicite -" +"A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ETIK --label=ETIK Uzi ETIKedon anstataý la dosiernomo." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Aldoni la komandojn 'w' kaj 'q' al ed-programetoj." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAMO Uzi PROGRAMOn por kompari dosierojn." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Uzado: %s [OPCIO]... MYFILE OLDFILE YOURFILE\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Kompari tri dosierojn linion post linio." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "interna eraro: fuþo en formato de diff-blokoj" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff malsukcesis: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "interna eraro: nevalida diff-speco en process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "nevalida diff-formato; nevalida þanø-apartigilo" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "nevalida diff-formato; malkompleta lasta linio" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "subprogramo '%s' ne rulebla" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "subprogramo '%s' ne trovita" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "subprogramo '%s' malsukcesis" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "nevalida diff-formato; maløusta signo en antaýa linio" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "interna eraro: nevalida diff-speco donita al eligo" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "enigdosiero þrumpis" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "ne povas kompari dosiernomojn '%s' kaj '%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Verkite de Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o DOS --output=DOS Funkcii interage, sendante eligon al DOSiero." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Trakti majusklojn kaj minusklojn kiel samajn." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignori æian blankan spacon." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w NOM --width=NOM Eligi maksimume NOM (implicite 130) signojn en linio." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" +"-l --left-column Montri nur la maldekstran kolumnon de komunaj linioj." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Ne eligi komunajn liniojn." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Atendi grandajn dosierojn kaj multajn disajn " +"þanøetojn." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Uzado: %s [OPCIO]... DOSIERO1 DOSIERO2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Æeflanka kunfando de dosierodiferencoj." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "ne povas interage kunfandi la normalan enigon" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "ambaý komparendaj dosieroj estas dosierujoj" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tredakti kaj uzi ambaý versiojn, æiu kun æapa¼o\n" +"eb:\tredakti kaj uzi ambaý versiojn\n" +"el:\tredakti kaj uzi maldekstran version\n" +"er:\tredakti kaj uzi dekstran version\n" +"e:\tredakti novan version\n" +"l:\tuzi maldekstran version\n" +"r:\tuzi dekstran version\n" +"s:\tsilente transpreni komunajn liniojn\n" +"v:\tlaýte transpreni komunajn liniojn\n" +"q:\tfini\n" diff --git a/gnu/dist/diffutils/po/es.gmo b/gnu/dist/diffutils/po/es.gmo Binary files differnew file mode 100644 index 00000000000..6035981d85e --- /dev/null +++ b/gnu/dist/diffutils/po/es.gmo diff --git a/gnu/dist/diffutils/po/es.po b/gnu/dist/diffutils/po/es.po new file mode 100644 index 00000000000..4b8761c3bce --- /dev/null +++ b/gnu/dist/diffutils/po/es.po @@ -0,0 +1,1137 @@ +# Mensajes en español para GNU diffutils. +# Copyright (C) 1996, 2001, 2002 Free Software Foundation, Inc. +# Iñaky Pérez González <inaky@peloncho.fis.ucm.es>, 1996. +# Santiago Vila Doncel <sanvila@unex.es>, 2001, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-17 19:06+0100\n" +"Last-Translator: Santiago Vila Doncel <sanvila@unex.es>\n" +"Language-Team: Spanish <es@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "error del programa" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "desbordamiento de pila" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Error del sistema desconocido" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Este programa viene sin NINGUNA GARANTÍA, hasta donde permite la ley.\n" +"Se pueden redistribuir copias de este programa bajo los términos de la\n" +"Licencia Pública General de GNU.\n" +"Para más información sobre esto, vea el fichero llamado COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: la opción `%s' es ambigua\n" + +#: lib/getopt.c:718 +#, 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:723 +#, 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:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: la opción `%s' requiere un argumento\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción no reconocida `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción no reconocida `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción ilegal -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción inválida -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: la opción requiere un argumento -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: la opción `-W %s' es ambigua\n" + +#: lib/getopt.c:898 +#, 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/regex.c:1367 +msgid "Success" +msgstr "Conseguido" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "No hay ninguna coincidencia" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Expresión regular inválida" + +# Se refiere probablemente a cosas tales como que la c con la h es "ch", +# aunque este ejemplo ya no es válido, pues la Real Academia dice +# que para propósitos de ordenación son letras independientes. +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Carácter de unión inválido" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Carácter de clase inválido" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Barra invertida al final" + +# FIXME +# Retro-referencia es lo mejor que se me ocurre ... claro, que acepto +# sugerencias ;) +# ¿Referencia hacia atrás? sv +# Me suena a cangrejo ;) ... no se ... a ver que opinan Enrique y el resto de +# la gente ... La verdad es que prefiero Retro-referencia a referencia hacia +# atrás (más que nada es por que es la traducción que se hace, como por +# ejemplo en backfeed -- retroalimentación) IPG +# En glibc.1.10.1 : +# # posix/regex.c:946 +# msgid "Invalid back reference" +# msgstr "Referencia hacia atrás no válida" em +# Si no fuese porque has traducido tu la glibc, te preguntaría quien ha sido +# el asesino que ha puesto eso :) Momento que voy a mirar la enciclopedia +# esa que tenemos decorando la estantería ;) ... ¡¡Ja jaaaa!! :) ¡Palidecerás +# ante esta cita! "Diccionario Enciclopédico Espasa-Calpe". Edición de Dios +# sabe cuando (la décima, creo), volumen 15, página 8846, tercera columna, +# tal que a la mitad: +# +# retrocontrol. (De retro- y control.) m. Biol. Fenómeno de autocontrol por +# el cual la excesiva acumulación de una hormona en la sangre actúa sobre +# la glándula corespondiente e inhibe automáticamente su producción. Se +# utiliza mucho internacionalmente la voz inglesa --feed-back-- para expre- +# sar esta idea. +# +# Y mejor ... para rematar :). Misma página, primera columna, cuarta entrada: +# +# retro-. (del lat. retro, --hacia atrás--) pref. que lleva a lugar o tiempo +# anterior a la significación de las voces simples a que se halla unida: +# retro-traer, retro-vender ... +# +# ¡¡Quiyos!! Hay dos páginas de retro-"algo" ... :) ¡no me digáis después +# de esto que preferís "hacia atrás"! y máxime cuando está aceptado preponer +# retro- para ello :) Si no os importa, y a no ser que venga alguno de la +# RALE y me castre por ello, dejaré retro-referencia. +# ipg +# Un comentario: No serán los de la RALE los que hagan eso, sino los +# que no lo entiendan. Aún después de ver tus acertadas referencias, pienso +# que referencia hacia atrás se puede entender mejor, pero por supuesto, +# no estoy dispuesto a matar por ello... sv +# :) Gracias, pero por ahora dejaré retro-referencia, me parece más clara +# en cuanto al significado preciso de la frase. ipg +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Retro-referencia inválida" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "[ ó [^ desemparejados" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "( ó \\( desemparejado" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "\\{ desemparejado" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "El contenido de \\{\\} no es válido" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Final de rango inválido" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Memoria agotada" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Expresión regular precedente inválida" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Final prematuro de la expresión regular" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "La expresión regular es demasiado grande" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr ") ó \\) desemparejado" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "No hay ninguna expresión regular previa" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "memoria agotada" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Los ficheros %s y %s son distintos\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Los ficheros binarios %s y %s son distintos\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "No hay ningún carácter de nueva línea al final del fichero" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Escrito por Torbjorn Granlund and David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Pruebe `%s --help' para más información." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "valor --ignore-initial inválido `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "las opciones -l y -s son incompatibles" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "la escritura falló" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "salida estándar" + +# Muestra como caracteres los bytes que difieran +# queda más claro, creo yo em +# Yo no le veo diferencia (¿será por qué lo parí yo? ;) ipg +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Muestra los bytes que son distintos." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i SALTO --ignore-initial=SALTO Salta los primeros SALTO bytes de\n" +" la entrada." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SALTO1:SALTO2 --ignore-initial=SALTO1:SALTO2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Salta los primeros SALTO1 bytes del FICHERO1 y los primeros SALTO2 bytes\n" +" del FICHERO2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" +"-l --verbose Muestra los números de byte y valores de todos los bytes que\n" +" difieran." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LÍMITE --bytes=LÍMITE Compara como máximo LÍMITE bytes." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent No muestra nada, sólo da un código de salida." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Informa de la versión y finaliza." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Muestra esta ayuda y finaliza." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Modo de empleo: %s [OPCIÓN]... FICHERO1 [FICHERO2 [SALTO1 [SALTO2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Compara dos ficheros byte por byte." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "SALTO1 y SALTO2 son el número de bytes que se saltan en cada fichero." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Los valores SALTO pueden estar seguidos por los siguientes sufijos\n" +"multiplicadores:\n" +"kB 1.000, K 1.024, MB 1.000.000, M 1.048.576,\n" +"GB 1.000.000.000, G 1.073.741.824, y así en adelante para T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Si un FICHERO es `-' o no se especifica, lee la entrada estándar." + +# Véase "A bug's life". +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Comunicar bichos a <bug-gnu-utils@gnu.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "valor --bytes inválido `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "falta un operando después de `%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "operando extra `%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s son distintos: byte %s, línea %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s son distintos: el byte %s, en la línea %s es %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: fin de fichero encontrado en %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Escrito por Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, y Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "longitud de contexto inválida `%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "este sistema no admite paginación" + +# FIXME +# me sace a mi que esto no se parece ni un ápice a lo que +# se quiere decir en realidad. He mirado los docs y no consigo +# encontrarle un buen significado, así que pido ayuda ;) +# Ni p... idea em +# La opción -L LABEL puedes usarla, una o dos veces, pero no más. A eso +# se refiere. la opción de etiqueta de fichero se ha especificado demasiadas +# veces. O más cortito, dejarlo como está :) em+ +# Me parece que así está bien ... +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "demasiadas opciones de etiqueta de fichero" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "ancho inválido `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "opciones de ancho conflictivas" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "longitud del horizonte inválida `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "la opción `-%ld' está obsoleta; utilice `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "la opción `-%ld' está obsoleta; omítala" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "se ha especificado tanto --from-file como --to-file" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Compara ficheros línea por línea." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case Descarta las diferencias entre mayúsculas y minúsculas\n" +" en el contenido de los ficheros." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case Descarta las diferencias entre mayúsculas y\n" +" minúsculas al comparar los nombres de los ficheros." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Considera distintas mayúsculas y minúsculas\n" +" cuando compara los nombres de los ficheros." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Descarta cambios debidos a expansiones de tabs." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" +"-b --ignore-space-change Descarta las diferencias en la cantidad de " +"espacios\n" +" en blanco." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Descarta los espacios en blanco." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines Descarta los cambios cuyas líneas son todas vacías." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I EXPR-REG --ignore-matching-lines=EXPR-REG Descarta las líneas que\n" +" coincidan con EXPR-REG." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" +"--strip-trailing-cr Elimina los retornos de carro finales en la entrada." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Lee y escribe los datos en modo binario." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Trata todos los ficheros como de tipo texto." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C NÚM --context[=NÚM] Muestra NÚM (3 por omisión) líneas de contexto\n" +"-u -U NÚM --unified[=NÚM] Muestra NÚM (3 por omisión) líneas de contexto\n" +" unificado.\n" +" --label NOMBRE Usa NOMBRE en lugar del nombre de fichero.\n" +" -p --show-c-function Muestra en qué función C se encuentra cada cambio.\n" +" -F EXPR-REG --show-function-line=EXPR-REG Muestra la línea más reciente\n" +" que coincida con EXPR-REG." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Indica sólo si los ficheros son diferentes o no." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Produce un script ed." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Produce un diff normal." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Produce un diff en formato RCS." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Genera salida en dos columnas.\n" +" -W NÚM --width=NÚM Genera como máximo NÚM (130 por omisión) caracteres\n" +" por línea.\n" +" --left-column Muestra sólo la columna izquierda en las líneas comunes.\n" +" --suppress-common-lines No muestra las líneas comunes." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NOMBRE --ifdef=NOMBRE Genera un fichero combinado que muestra las\n" +" diferencias con '#ifdef NOMBRE'" + +# Propongo similar -> parecida. Ver gettext. sv +# Hmmm ... prefiero similar. Antes estaba puesto `parecida' y la verdad, +# no quedaba tan bien. ipg +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Similar, pero formatea los grupos de entrada " +"GTYPE\n" +" con GFMT." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT Similar, pero formatea todas las líneas de entrada\n" +" con LFMT." + +# ídem. sv +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Similar, pero formatea las líneas de entrada " +"LTYPE\n" +" con LFMT." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE es `old' (antiguo), `new' (nuevo) o `unchanged' (sin cambios).\n" +" GTYPE es como LTYPE o `changed' (cambiado)." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT puede contener:\n" +" %< líneas del FICHERO1\n" +" %> líneas del FICHERO2\n" +" %= líneas comunes a FICHERO1 y FICHERO2\n" +" %[-][ANCHO][.[PRECISIÓN]]{doxX}LETRA especificación printf para LETRA\n" +" Las LETRAs pueden ser como siguen para grupos nuevos (en minúsculas\n" +" para grupos antiguos):\n" +" F número de la primera línea\n" +" L número de la última línea\n" +" N número de líneas = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT puede contener:\n" +" %L contenido de la línea\n" +" %l contenido de la línea, excluyendo caracteres de nueva línea finales\n" +" %[-][ANCHO][.[PRECISIÓN]]{doxX}n especificación en estilo printf para " +"el\n" +" número de línea de entrada" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Tanto GFMT como LFMT pueden contener:\n" +" %% %\n" +" %c'C' el carácter C\n" +" %c'\\OOO' el carácter con código octal OOO" + +# Sugerencia: la salida -> el resultado. +# (y paginarla -> paginarlo, en su caso). sv +# Yo personalmente prefiero `la salida'; si traducimos literalmente el +# inglés es eso, no cabe duda, pero poner `el resultado' no me cuadra. +# Lo digo porque tenemos una entrada y una salida (por un lado entran +# los cerdos a la máquina de hacer chorizos, y por otro salen). Creo +# que con esto me guiaré por lo que haya hecho el resto de la gente. +# Si sabes qué han hecho ... :). ipg +# Te mandaré el gettext, para que veas lo que vale un peine... sv +# X'D ... no soy tan malo ... ipg +# Medita de nuevo si no usas resultado em +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Pasa la salida a través de `pr' para paginarla." + +# Aquí a lo mejor también: la salida -> el resultado. sv +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Expande los tabuladores a espacios en la salida." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab Hace que los tabuladores se alineen anteponiendo uno." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Compara recursivamente todos los subdirectorios." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Trata los ficheros que no existan como vacíos." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Trata los ficheros originales que no existan\n" +" como vacíos." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +"-s --report-identical-files Notifica cuándo dos ficheros son idénticos." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x PAT --exclude=PAT Excluye los ficheros que coincidan con PAT." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FICHERO --exclude-from=FICHERO Excluye los ficheros que coincidan con\n" +" alguna expresión regular de FICHERO." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S FICHERO --starting-file=FICHERO Comienza por FICHERO cuando se " +"comparan\n" +" directorios." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FICHERO1 Compara FICHERO1 con todos los operandos.\n" +" FICHERO1 puede ser un directorio." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FICHERO2 Compara todos los operandos con FICHERO2.\n" +" FICHERO2 puede ser un directorio." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=NÚM Mantiene NÚM líneas de prefijos y sufijos comunes." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Se esfuerza en encontrar un grupo de cambios menor." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Supone que los ficheros son grandes y los cambios son\n" +" numerosos, pequeños y dispersos." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FICHEROS puede ser `FICHERO1 FICHERO2' o `DIRECTORIO1 DIRECTORIO2'\n" +" o `DIRECTORIO FICHERO...' o `FICHERO... DIRECTORIO'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "Si se da --from-file o --to-file, no hay restricciones en FICHEROS." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Si un FICHERO es `-', lee la entrada estándar." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Modo de empleo: %s [OPCIÓN]... FICHEROS\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "la opción %s tiene el valor conflictivo `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "las especificaciones del estilo de salida son conflictivas" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "fichero regular vacío" + +#: src/diff.c:976 +msgid "regular file" +msgstr "fichero regular" + +#: src/diff.c:978 +msgid "directory" +msgstr "directorio" + +#: src/diff.c:981 +msgid "block special file" +msgstr "fichero especial de bloques" + +#: src/diff.c:984 +msgid "character special file" +msgstr "fichero especial de caracteres" + +#: src/diff.c:987 +msgid "fifo" +msgstr "`fifo'" + +#: src/diff.c:991 +msgid "socket" +msgstr "`socket'" + +#: src/diff.c:994 +msgid "message queue" +msgstr "cola de mensajes" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semáforo" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "objeto de memoria compartido" + +# ¿Alguien sabe lo que es esto? +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "objeto de memoria `typed'" + +# FIXME +# se podría decir algo más decente para "weird" ... pero ¿qué? +# ¿ no habitual ? em +# ¡Nchts! Prefiero extraño ... no habitual me suena muy difuso +# siempre podemos poner escachifollado ;) ipg +#: src/diff.c:1006 +msgid "weird file" +msgstr "fichero extraño" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Sólo en %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "no se puede comparar `-' con un directorio" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "la opción -D no se puede usar con directorios" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Subdirectorios comunes: %s y %s\n" + +# Nota: El segundo y el cuarto `%s' son tipos de fichero. +# Por ejemplo, "texto C", "texto FORTRAN", etc. +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "El fichero %s es un %s mientras que el %s es un %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Los ficheros %s y %s con idénticos\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Escrito por Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "opciones incompatibles" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "se ha especificado `-' para más de un fichero de entrada" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "la lectura falló" + +# Sería ideal traducir OLDFILE y YOURFILE. sv +# Sí, eso pensé yo, pero no sé como ponerlo para que quede bien ... +# Esto no hay quien lo entienda, piénsalo 3 minutos más si te apetece :) em+ +# +# OLDFILE FICHERO-ANTIGUO +# YOURFILE TU-FICHERO +# MYFILE MI-FICHERO +# +# Pongo eso por ahora, pero espero una sugerencia mejor ;) +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Muestra los cambios sin mezclar entre FICHERO-ANTIGUO\n" +" y TU-FICHERO en MI-FICHERO." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Muestra los cambios no mezclados, encerrando los\n" +" conflictos entre corchetes." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" +"-A --show-all Muestra todos los cambios, encerrando los conflictos entre\n" +" corchetes." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Muestra los cambios que se solapen." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Muestra los cambios superpuestos (entre corchetes)." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Muestra los cambios no mezclados ni superpuestos." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Produce un fichero mezclado en lugar de un\n" +" script ed (por omisión -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L NOMBRE --label=NOMBRE Usa NOMBRE en lugar del nombre de fichero." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Añade las órdenes `w' y `q' a los `scripts' ed." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAMA Utiliza PROGRAMA para comparar los ficheros." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Modo de empleo: %s [OPCIÓN]... MI-FICHERO FICHERO-ANTIGUO TU-FICHERO\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Compara tres ficheros línea por línea." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "error interno: fallo en el formato de los bloques diff" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff falló: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "error interno: tipo de diff inválido en process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "formato de diff inválido; separador de cambio inválido" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "formato de diff inválido; línea final incompleta" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "el programa subsidiario `%s' no es ejecutable" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "no se encontró el programa subsidiario `%s'" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "el programa subsidiario `%s' falló" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "" +"formato de diff inválido; caracteres incorrectos al comienzo de la línea" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "error interno: tipo de diff inválido pasado a la salida" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "el fichero de entrada ha menguado" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "no se pueden comparar los nombres de fichero `%s' y `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Escrito por Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o FICHERO --output=FICHERO Opera interactivamente, enviando el resultado\n" +" al fichero FICHERO." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Considera iguales mayúsculas y minúsculas." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Descarta los espacios en blanco." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w NÚM --width=NÚM Muestra como mucho NÚM caracteres por línea\n" +" (por omisión 130)." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" +"-l --left-column Muestra sólo en la columna izquierda las líneas comunes." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines No muestra las líneas comunes." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Supone que los ficheros son grandes y los cambios " +"son\n" +" numerosos, pequeños y dispersos." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Modo de empleo: %s [OPCIÓN]... FICHERO1 FICHERO2\n" + +# Se admiten sugerencias. +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Combinación a dos columnas de las diferencias entre ficheros." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "no se puede mezclar interactivamente con la entrada estándar" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "los dos ficheros que hay que comparar son directorios" + +# FIXME +# ¿sugerencias para traducir mejor "verbosely"? +# ¿ Con verborrea ?, ;) +# era una broma, ¿ qué tal prolijamente ? em +# Huy ... mi famosa enciclopedia no dice en prolijo nada que se +# parezca a dar mucho la lata ... casi que lo dejamos, ¿no? ipg +# Sugerencia -> `verbosamente' -> con detalle. sv +# Hfff ... es que `con detalle' suena más a dar detalles de lo +# que es cada cosa, que no a que se está haciendo ipg +# Federico ha usado "prolijamente" en tar. Algo habrá que hacer, porque +# verbosamente no me suena a español. ¿Existe eso? sv +# A mi tampoco ... voy a ver si conecto con el diccionario de Anaya +# y lo miro ... a veeeeerrr ... ya ta: +# prolijo, -a: Del lat. prolixus = fluyente. +# 1. (adjetivo, -a). Largo, muy extenso. +# 2. (adjetivo, -a). Cuidadoso o esmerado con exceso. +# 3. (adjetivo, -a). Cargante, molesto. +# FAM: Prolijamente, prolijidad. +# SIN. 1. Amplio. 3. Impertinente, pesado. +# ANT. 1. Lacónico, conciso. 2. Descuidado. 3. Ameno. +# (Referencia: http://www.anaya.es/dict/Buscar) +# +# Pues está claro que es castellano (o español), pero yo no lo había +# oído hasta ahora, y me imagino que mucha gente estará igual. Yo +# voto por buscar algo más común (y creo que verbosamente vale, +# momento que lo bujco). ipg +# +# ¿ Lo encontraste ? , yo no lo he oído en mi vida, y me suena a verborrea, que +# es más bien despectivo. ¿ qué tal `con detalle' ? em+ +# Dejo verbosamente, que al menos el alma precavida lo asociará con que hay +# mucho verbo :) ipg +# +# Pero vamos a ver, ¿la palabra "verbosamente" existe? +# A mí me parece completamente un "palabro". sv +# ## ¿Por qué no la buscas en algún diccionario? sv +# ## Momeneto ... en la Espasa Calpe viene: +# ## verbosamente: adverbio, con verbosidad. +# ## En Anaya (http://www.anaya.es/dict): +# ## verbosidad +# ## I. De verbo. +# ## 1. (sustantivo femenino). Verborrea. +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed: Edita y usa ambas versiones, cada una decorada con una cabecera.\n" +"eb: Edita y usa ambas versiones.\n" +"el: Edita y usa la versión izquierda.\n" +"er: Edita y usa la versión derecha.\n" +"e: Edita una nueva versión.\n" +"l: Usa la versión izquierda.\n" +"r: Usa la versión derecha.\n" +"s: Incluye líneas comunes silenciosamente.\n" +"v: Incluye líneas comunes verbosamente.\n" +"q: Salir.\n" + +# Creo que es suficientemente decente, pero se admiten sugerencias. +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge No junta los trozos." + +#~ msgid "context length specified twice" +#~ msgstr "la longitud del contexto se ha especificado dos veces" + +#~ msgid "multiple `--from-file' options" +#~ msgstr "se han dado varias opciones `--from-file'" + +#~ msgid "multiple `--to-file' options" +#~ msgstr "se han dado varias opciones `--to-file'" + +#~ msgid "regular empty executable file" +#~ msgstr "fichero regular ejecutable vacío" + +#~ msgid "regular executable file" +#~ msgstr "fichero regular vacío" + +#~ msgid ": not found\n" +#~ msgstr ": no encontrado\n" + +#~ msgid "-D%s: conflicting #ifdef format" +#~ msgstr "-D%s: formato #ifdef conflictivo" + +#~ msgid "%s: conflicting line format" +#~ msgstr "%s: formato de línea conflictivo" + +#~ msgid "conflicting group format" +#~ msgstr "formato de grupo conflictivo" + +#~ msgid "--ignore-initial value must be a nonnegative integer" +#~ msgstr "el valor de --ignore-initial debe ser un entero no negativo" + +#~ msgid "column width must be a positive integer" +#~ msgstr "el ancho de la columna debe ser un entero positivo" + +#~ msgid "context length must be a nonnegative integer" +#~ msgstr "la longitud del contexto ha de ser un entero no negativo" + +#~ msgid "horizon must be a nonnegative integer" +#~ msgstr "el horizonte (horizon) ha de ser un entero no negativo" diff --git a/gnu/dist/diffutils/po/fr.gmo b/gnu/dist/diffutils/po/fr.gmo Binary files differnew file mode 100644 index 00000000000..eeeea833960 --- /dev/null +++ b/gnu/dist/diffutils/po/fr.gmo diff --git a/gnu/dist/diffutils/po/fr.po b/gnu/dist/diffutils/po/fr.po new file mode 100644 index 00000000000..43cd5df4ca7 --- /dev/null +++ b/gnu/dist/diffutils/po/fr.po @@ -0,0 +1,1033 @@ +# Messages français pour GNU concernant diffutils. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-17 20:00-0500\n" +"Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA>\n" +"Language-Team: French <traduc@traduc.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "erreur du programme" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "débordement de pile" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Erreur système inconnue" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Ce programme est fourni sans AUCUNE GARANTIE, tel que permis par la loi.\n" +"Vous pouvez le redistribuer selon les termes de « GNU General Public License " +"»,\n" +"lire le texte du fichier COPYING pour plus de détails." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: l'option « %s » est ambiguë.\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: l'option « --%s » ne permet aucun argument.\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: l'option « %c%s » ne permet aucun argument.\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: l'option « %s » requiert un argument.\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: l'option « --%s » n'est pas reconnue.\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: l'option « %c%s » n'est pas reconnue.\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: l'option -- %c est illégale.\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: l'option -- %c est invalide.\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'option -- %c requiert un argument.\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: l'option « -W %s » est ambiguë.\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: l'option « -W %s » ne permet aucun argument.\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Succès" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Pas de concordance." + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "L'expression régulière est invalide." + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Le caractère de regroupement est invalide." + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Le nom d'un ensemble de caractères est invalide." + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Barre oblique inverse à la fin." + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "La référence arrière est invalide." + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "[ or [^ non repéré." + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr " ( ou \\( non repéré." + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "\\{ non repéré." + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Le contenu de \\{\\} est invalide." + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "La fin d'intervalle est invalide." + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Mémoire épuisée." + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "L'expression régulière précédente est invalide." + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Fin prématurée de l'expression régulière." + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Expression régulière trop grande." + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr ") or \\) non repéré." + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "N'est pas précédé d'une expression régulière." + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "mémoire épuisée" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Les fichiers %s et %s sont différents.\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Les fichiers binaires %s et %s sont différents.\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Pas de fin de ligne à la fin du fichier." + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Écrit par Torbjorn Granlund et David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Pour en savoir davantage, faites: « %s --help »." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "valeur invalide --ignore-initial « %s »" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "options -l et -s sont incompatibles" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "échec d'écriture" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "sortie standard" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes afficher les octets qui diffèrent" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i N --ignore-initial=N escamoter les N premiers octets à l'entrée" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SAUT1:SAUT2 --ignore-initial=SAUT1:SAUT2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" escamoter les SAUT1 premiers octets du FICHIER1 et les SAUT2 premiers " +"octets du FICHIER2" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" +"-l --verbose afficher les numéros d'octets et les valeurs de tous les " +"octets qui diffèrent" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMITE --bytes=LIMITE comparer un nombre d'octets selon la LIMITE." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" +"-s --quiet --silent ne rien afficher, produire seulement un constat de " +"fin d'exécution" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version afficher le nom et la version du logiciel" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help afficher l'aide-mémoire" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Usage: %s [OPTION]... FICHIER1 [FICHIER2 [SAUT1 [SAUT2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Comparer deux fichiers octet par octet" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "" +"SAUT1 et SAUT2 correspondent au nombre d'octets à escamoter dans chaque " +"fichier" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"valeurs de SAUT peuvent être suivies par un des suffixes multiplicateurs " +"suivants:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, et ainsi de suite pour T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Si FICHIER spécifié est « - » ou manquant, lire de l'entrée standard" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Rapporter toutes anomalies à <bug-gnu-utils@gnu.org>" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "valeur invalide --bytes « %s »" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "opérande manquante après « %s »" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "opérande supplémentaire « %s »" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s sont différents: octet %s, ligne %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s diffèrent: octet %s, ligne %s est %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: Fin-de-fichier (EOF) sur %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Écrit par Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman et Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "longueur du contexte invalide « %s »" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "La pagination 'est pas supporté sur cette machine hôte." + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "Trop d'options présentes pour nommer les fichiers." + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "largeur invalide « %s »" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "option de largeur conflictuelle" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "longueur d'horizon invalide « %s »" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "l'option « -%ld » est obsolète; utilise « -%c %ld »" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "l'option « -%ld » est obsolète; l'omettre" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--from-file et --to-file ont été spécifiés ensemble" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Comparer les fichiers ligne par ligne" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case ignorer les différences de casses dans le contenu des " +"fichiers" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case ignorer la casse lors de la comparaison des noms de " +"fichiers" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case tenir compte de la casse lors de la comparaison " +"des noms de fichiers" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion ignorer les changements liés à l'expansion des " +"tabulations" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change ignorer les changements dans l'espacement" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space ignorer tout blanc d'espacement" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines ignorer les changements dont toutes les lignes " +"sont blanches" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I EXPREG --ignore-matching-lines=EXPREG ignorer les différences dont les " +"lignes concordent à l'EXPression RÉGulière" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr éliminer les retours de chariot de l'entrée." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary lire et écrire les données en binaire" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text traiter tous les fichiers comme des textes." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C N --context[=N] afficher N lignes de contexte (3 par défaut)\n" +"-u -U N --unified[=N] afficher N lignes du contexte unifié (3 par " +"défaut)\n" +" --label ÉTIQ utiliser l'ÉTIQuette comme nom de fichier.\n" +" -p --show-c-function identifier la fonction contenant chaque " +"différence.\n" +" -F EXPREG\n" +" --show-function-line=EXPREG\n" +" afficher la ligne la plus récente qui " +"concorde\n" +" avec l'EXPression RÉGulière" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief indiquer seulement si les fichiers diffèrent ou non" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed générer un script pour « ed »" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal produire un « diff » en format normal" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs générer un fichier de type « diff » en format RCS" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side afficher la sortie sur deux colonnes\n" +" -w N --width=N limiter la sortie à N caractères par ligne (130 " +"par défaut)\n" +" --left-column afficher seulement la colonne de gauche pour les " +"lignes identiques\n" +" --suppress-common-lines ne pas afficher les lignes identiques" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NOM --ifdef=NOM afficher la fusion des fichiers en indiquant les " +"différences par des « #ifdef NAME » dans le « diff » produit" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT similaire, mais formater les groupes\n" +" d'entrée GTYPE avec GFMT" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT similaire, mais formater toutes les lignes d'entrée avec " +"LFMT" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT similaire, mais formater les lignes\n" +" d'entrée LTYPE avec LFMT" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +"LTYPE peut être soit « old », « new », ou « unchanged ». GTYPE prend une " +"des valeurs de LTYPE ou « changed »." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +"GFMT peut contenir:\n" +" %< pour marquer les lignes du FICHIER1\n" +" %> pour marquer les lignes du FICHIER2\n" +" %= pour marquer les lignes identiques entre FICHIER1 et FICHIER2\n" +" %[-][LARGEUR][.[PREC]]{doxX}LETTRE, les spécifications de LETTRE\n" +" sont identiques à la notation que l'on retrouve dans « printf() »\n" +" dont les codes possibles de LETTRE sont\n" +" en majuscule pour le nouveau groupe, \n" +" en minuscules pour l'ancien groupe:\n" +" F numéro de la première ligne\n" +" L numéro de la dernière ligne\n" +" N nombre de lignes = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +"LFMT peut contenir:\n" +" %L pour le contenu de la ligne\n" +" %l pour le contenu de la ligne sans fin de " +"ligne\n" +" %[-][LARGEUR][.[PREC]]{doxX}n la spécification du numéro de ligne\n" +" d'entrée selon le format de printf()" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +"GFMT ou LFMT peuvent contenir:\n" +" %% %\n" +" %c« C » le caractère « C » lui-même\n" +" %c'\\OOO» le caractère dont le code octal est OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate relayer la sortie à « pr » afin de la paginer" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs étaler les tabulateurs en espaces dans la sortie." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab aligner les tabulateurs par l'ajout d'un tabulateur de " +"préfixe" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive comparer récursivement les sous-répertoires présents" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file traiter les fichiers absents comme des fichiers vides" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file traiter les fichiers absents comme vides" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +"-s --report-identical-files indiquer si les deux fichiers sont identiques" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "" +"-x PAT --exclude=PAT exclure les fichiers dont les noms concordent avec le " +"PATron" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FICHIER --exclude-from=FICHIER exclure les fichiers dont les noms\n" +" concordent à ceux contenus dans le FICHIER" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S FICHIER --starting-file=FICHIER débuter la comparaison des\n" +" répertoires par le FICHIER" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FICHIER1\n" +" comparer le FICHIER1 à toutes les opérandes.\n" +" FICHIER1 peut être un répertoire." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FICHIER2\n" +" comparer toutes les opérandes à FICHIER2.\n" +" FICHIER2 peut être un répertoire." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=N retenir N lignes ayant des préfixes et suffixes " +"identiques" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "" +"-d --minimal si possible afficher le plus petit ensemble de différences." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files traiter de grands fichiers et ayant plusieurs petits " +"changements dispersés" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FICHIERS sont « FICHIER1 FICHIER2 » ou « RÉP1 RÉP2 » ou « RÉP FICHIER... » " +"ou «FICHIER... RÉP'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Si --from-file ou --to-file est fournie, il n'y a pas de restriction sur les " +"FICHIERS." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Si le FICHIER spécifié est « - » alors lire de l'entrée standard." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Usage: %s [OPTION]... FICHIERS\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "valeur « %s » conflictuelle de l'option %s" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "options de style de sortie conflictuelles" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "fichier régulier vide" + +#: src/diff.c:976 +msgid "regular file" +msgstr "fichier régulier" + +#: src/diff.c:978 +msgid "directory" +msgstr "répertoire" + +#: src/diff.c:981 +msgid "block special file" +msgstr "fichier spécial-blocs" + +#: src/diff.c:984 +msgid "character special file" +msgstr "fichier spécial-caractères" + +#: src/diff.c:987 +msgid "fifo" +msgstr "« fifo »" + +#: src/diff.c:991 +msgid "socket" +msgstr "« socket »" + +#: src/diff.c:994 +msgid "message queue" +msgstr "queue de messages" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "sémaphore" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "objet en mémoire partagée" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "objet mémoire typé" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "fichier bizarre" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Seulement dans %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "Ne peut comparer « - » avec un répertoire" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "L'option -D ne traite pas les répertoires." + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Les sous-répertoires %s et %s sont identiques.\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Le fichier %s est un %s alors que le fichier %s est un %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Les fichiers %s et %s sont identiques.\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Écrit par Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "options incompatibles" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "« - » fourni pour plus d'un fichier d'entrée" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "lecture non-réussie" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed afficher les différences non fusionnés selon l'ordre suivant:\n" +" entre le fichier ORIGINAL et le fichier MODIFIÉ\n" +" vers le fichier de SORTIE" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap afficher les différences entre crochets" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all afficher toutes les différences entre crochets" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only afficher les différences qui se recoupent" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X afficher les différences qui se recoupent entre crochets." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "" +"-3 --easy-only afficher tous les changements non fusionnés qui ne se " +"recoupent pas" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge afficher le fichier fusionné plutôt qu'un script « ed " +"» (implique -A)" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "" +"-L ÉTIQ --label=ÉTIQ utiliser l'ÉTIQuette plutôt que le nom du fichier" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i ajouter les commandes « w » et « q » au script « ed »" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +"--diff-program=PROG utiliser le PROGramme pour comparer les fichiers." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Comparer trois fichiers ligne par ligne" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "Erreur interne: mélange dans le format des blocs « diff »" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: échec de « diff »: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "Erreur interne: type de « diff » invalide dans process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "format de « diff » invalide; séparateur de changement invalide" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "format de « diff » invalide; dernière ligne incomplète" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "programme de service « %s » n'est pas exécutable" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "programme de service « %s » non repéré" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "échec du programme de service « %s »" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "" +"format de « diff » invalide; caractères incorrects sur la ligne d'annonce" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "Erreur interne: type de « diff » invalide fourni à output" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "Le fichier d'entrée a rétréci." + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "ne peut comparer les noms de fichier « %s » et « %s »" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Écrit par Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o FICHIER --output=FICHIER agir intéractivement, avec sortie sur FICHIER" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case banaliser majuscules et minuscules" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space ignorer tout blanc d'espacement" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w N --width=N limiter la sortie à N colonnes par ligne (130 par " +"défaut)" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" +"-l --left-column afficher dans la colonne de gauche les lignes identiques" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines ne pas afficher les lignes identiques" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files traiter de grands fichiers ayant plusieurs " +"changements éparpillés" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Usage: %s [OPTION]... FICHIER1 FICHIER2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Fusion côte à côte des différences des fichiers" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "Ne peut fusionner l'entrée standard, interactivement." + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "Les deux fichiers à comparer sont des répertoires." + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\téditer les deux versions, chacune chapeautée d'une en-tête\n" +"eb:\téditer puis utiliser les deux versions\n" +"el:\téditer puis utiliser la version de gauche\n" +"er:\téditer puis utiliser la version de droite\n" +"e:\téditer une nouvelle version\n" +"l:\tutiliser la version de gauche\n" +"r:\tutiliser la version de droite\n" +"s:\tinclure les lignes identiques silencieusement\n" +"v:\tinclure les lignes identiques et le signaler\n" +"q:\tquitter.\n" + +# src/diff.c:882 MRO +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge ne pas faire la fusion des hunks" + +#~ msgid "context length specified twice" +#~ msgstr "La longueur du contexte a été spécifié deux fois." + +#~ msgid "multiple `--from-file' options" +#~ msgstr "options multiples de `--from-file'" + +#~ msgid "multiple `--to-file' options" +#~ msgstr "options multiples de `--to-file'" + +#~ msgid "regular empty executable file" +#~ msgstr "fichier régulier exécutable vide" + +#~ msgid "regular executable file" +#~ msgstr "fichier régulier exécutable" + +#~ msgid "" +#~ "SKIP values may be followed by the following multiplicative suffixes:\n" +#~ msgstr "" +#~ "Les valeurs de SAUT peuvent être suivies par un des facteurs " +#~ "multiplicatifs suivants:\n" + +#~ msgid "kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +#~ msgstr "kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" + +#~ msgid "GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.\n" +#~ msgstr "" +#~ "GB 1,000,000,000, G 1,073,741,824, et ainsi de suite pour T, P, E, Z, Y.\n" + +#~ msgid "Report bugs to <bug-gnu-utils@gnu.org>.\n" +#~ msgstr "Rapporter toutes anomalies à <bug-gnu-utils@gnu.org>\n" + +#~ msgid "If a FILE is `-', read standard input.\n" +#~ msgstr "Si FICHIER spécifié est `-', alors lire de l'entrée standard.\n" + +#~ msgid ": not found\n" +#~ msgstr ": introuvable\n" + +#~ msgid "-D%s: conflicting #ifdef format" +#~ msgstr "-D%s: format #ifdef conflictuels" + +#~ msgid "%s: conflicting line format" +#~ msgstr "%s: format de ligne conflictuel" + +#~ msgid "conflicting group format" +#~ msgstr "formats de groupes conflictuels" + +#~ msgid "--ignore-initial value must be a nonnegative integer" +#~ msgstr "La valeur de --ignore-initial doit être un entier non-négatif" + +#~ msgid "column width must be a positive integer" +#~ msgstr "Le nombre de colonnes doit être un entier positif." + +#~ msgid "context length must be a nonnegative integer" +#~ msgstr "La longueur du contexte doit être un entier non négatif." + +#~ msgid "horizon must be a nonnegative integer" +#~ msgstr "L'horizon doit être un entier non négatif." diff --git a/gnu/dist/diffutils/po/gl.gmo b/gnu/dist/diffutils/po/gl.gmo Binary files differnew file mode 100644 index 00000000000..d1243f6234d --- /dev/null +++ b/gnu/dist/diffutils/po/gl.gmo diff --git a/gnu/dist/diffutils/po/gl.po b/gnu/dist/diffutils/po/gl.po new file mode 100644 index 00000000000..0e8fc51144d --- /dev/null +++ b/gnu/dist/diffutils/po/gl.po @@ -0,0 +1,997 @@ +# Galician translation of GNU diffutils +# Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. +# Jacobo Tarrío Barreiro <jtarrio@iname.com>, 2000, 2001, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-12 15:52+0100\n" +"Last-Translator: Jacobo Tarrío Barreiro <jtarrio@iname.com>\n" +"Language-Team: Galician <gpul-traduccion@ceu.fi.udc.es>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "erro do programa" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "desbordamento da pila" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Erro do sistema descoñecido" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Este programa ven SEN GARANTÍA, ata o permitido pola lei.\n" +"Pode redistribuír copias deste programa baixo os termos\n" +"da Licencia Pública Xeral de GNU.\n" +"Para máis información sobre estas materias, vexa o ficheiro chamado COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opción `%s' é ambigua\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: a opción `--%s' non admite un parámetro\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: a opción `%c%s' non admite un parámetro\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opción `%s' precisa dun parámetro\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción non recoñecida `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción non recoñecida `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción non permitida -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción incorrecta -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opción precisa dun parámetro -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opción `-W %s' é ambigua\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: a opción `-W %s' non admite un parámetro\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Éxito" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Non hai coincidencias" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Expresión regular incorrecta" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Carácter de ordeación incorrecto" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Nome de clase de caracteres incorrecto" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Barra invertida ao final" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Referencia cara a atrás incorrecta" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "[ ou [^ sen parella" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "( ou \\( sen parella" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "\\{ sen parella" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Contido de \\{\\} incorrecto" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Fin de rango incorrecto" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Memoria esgotada" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Expresión regular precedente incorrecta" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Fin de expresión regular prematura" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Expresión regular grande de máis" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr ") ou \\) sen parella" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Non hai unha expresión regular anterior" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "memoria esgotada" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Os ficheiros %s e %s son diferentes\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Os ficheiros binarios %s e %s son diferentes\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Non hai un salto de liña na fin da liña" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Escrito por Torbjorn Granlund e David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Escriba `%s --help' para obter máis información." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "valor de --ignore-initial `%s' non válido" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "as opcións -l e -s son incompatibles" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "fallou a escritura" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "saída estándar" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Amosa-los bytes diferentes." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i N --ignore-initial=N Omiti-los primeiros N bytes de entrada." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i N1:N2 --ignore-initial=N1:N2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Omiti-los primeiros N1 bytes de FICH1 e os primeiros N2 bytes de FICH2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Amosa-los números e valores dos bytes que difiran." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LÍMITE --bytes=LÍMITE Comparar como moito LÍMITE bytes." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent Non producir nada; só da-lo estado de saída." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Amosar información sobre a versión." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Amosar esta axuda." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Uso: %s [OPCIÓN]... FICH1 [FICH2 [N1 [N2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Comparar dous ficheiros byte a byte." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "N1 e N2 son o número de bytes a omitir en cada ficheiro." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Os valores N poden estar seguidos polos seguintes sufixos multiplicativos:\n" +"kB 1000, K 1024, MB 1.000.000, M 1.048.576,\n" +"GB 1.000.000.000, G 1.073.741.824, e así para T, P, E, Z e Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Se un FICHEIRO é `-' ou non se indica, lese da entrada estándar." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" +"Informe dos erros no programa a <bug-gnu-utils@gnu.org>.\n" +"Informe dos erros na traducción a <proxecto@trasno.net>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "valor de --bytes `%s' non válido" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "falta un operando despois de `%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "operando `%s' sobrante" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s son diferentes: byte %s, liña %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s son diferentes: byte %s, liña %s é %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: Fin de Ficheiro en %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Escrito por Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman e Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "lonxitude do contexto `%s' non válida" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "a paxinación non está soportada nesta máquina" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "demasiadas opcións de etiquetas de ficheiro" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "ancho `%s' non válido" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "opcións de anchura conflictivas" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "lonxitude do horizonte `%s' non válida" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "A opción `-%ld' é obsoleta; empregue `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "A opción `-%ld' é obsoleta; omítaa" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "Especificáronse --from-file e --to-file ao mesmo tempo" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Compara-los ficheiros liña a liña." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case Ignorar maiúsculas/minúsculas no contido do ficheiro." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case Ignorar maiúsculas/minúsculas no nome do ficheiro." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Ter en conta as maiúsculas/minúsculas\n" +" ao compara-los nomes dos ficheiros." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Ignora-los cambios pola expansión de tabulacións." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" +"-b --ignore-space-change Ignora-los cambios na cantidade de espacios." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Ignorar tódolos espacios en branco." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines Ignora-los cambios que teñan tódalas liñas en " +"branco" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE Ignora-los cambios nos que tódalas liñas\n" +" conteñan RE." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "" +"--strip-trailing-cr Elimina-los retornos de carro á fin das liñas de " +"entrada." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Ler e escribir datos en modo binario." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Tratar tódolos ficheiros coma texto" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C NÚM --context[=NÚM] Amosar NÚM [3] liñas de contexto copiado.\n" +"-u -U NÚM --unified[=NÚM] Amosar NÚM [3] liñas de contexto unificado.\n" +" --label ETIQUETA Usa-la ETIQUETA no canto do nome do ficheiro.\n" +" -p --show-c-function Amosar en que función C está cada cambio.\n" +" -F RE --show-function-line=RE Amosa-la liña máis recente que coincide\n" +" con RE." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Producir unha saída só se os ficheiros teñen diferencias." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Producir un script de ed." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Producir un diff normal." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Producir un diff en formato RCS." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Produci-la saída en dúas columnas.\n" +" -w NÚM --width=NÚM Amosar como moito NÚM [130] columnas de impresión.\n" +" --left-column Amosar só a columna da esquerda nas liñas comúns.\n" +" --suppress-common-lines Non amosa-las liñas comúns." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NOME -ifdef=NOME Amosa-lo ficheiro mesturado con diffs `#ifdef NOME'." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Similar, pero formata-los grupos de entrada " +"GTYPE\n" +" con GFMT." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT Similar, pero formatar tódalas liñas de entrada con LFMT." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Similar, pero formata-las liñas de entrada LTYPE\n" +" con LFMT." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE é `old' (vello), `new' (novo) ou `unchanged' (sen cambios).\n" +" GTYPE é LTYPE ou `changed' (con cambios)." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT pode conter:\n" +" %< liñas do FICH1\n" +" %> liñas do FICH2\n" +" %= liñas comúns a FICH1 e FICH2\n" +" %[-][ANCHO][.[PREC]]{doxX}LETRA especificación estilo printf para a " +"LETRA\n" +" As LETRAs son como segue para o novo grupo, en minúsculas para o " +"vello:\n" +" F número da primeira liña\n" +" L número da derradeira liña\n" +" N número de liñas = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT pode conter:\n" +" %L contido da liña\n" +" %l contido da liña, excluíndo os saltos de liña finais\n" +" %[-][ANCHO][.[PREC]]{doxX}n especif. estilo printf do número da liña" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GFMT e LFMT poden conter:\n" +" %% %\n" +" %c'C' o carácter C\n" +" %c'\\OOO' o carácter de código octal OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Pasa-la saída por `pr' para paxinala." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Expandi-las tabulacións a espacios na saída." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab Facer que as tabulacións queden aliñadas poñendo outra\n" +" tabulación ao principio da liña." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "" +"-r --recursive Comparar recursivamente os subdirectorios que se atopen." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Trata-los ficheiros ausentes coma baleiros." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Tratar ficheiros vellos ausentes coma baleiros." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +"-s --report-identical-files Informar cando dous ficheiros son o mesmo." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x PAT --exclude=PAT Exclui-los ficheiros que coinciden co PATrón." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FICH --exclude-from=FICH Excluir ficheiros que coinciden con algún\n" +" patrón do FICHeiro." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S FICH --starting-file=FICH Comezar no FICHeiro ao comparar directorios." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FICH1 Comparar FICH1 con tódolos operandos. Pode ser directorio." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FICH2 Comparar tódolos operandos con FICH2. Pode ser un " +"directorio." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "--horizon-lines=NUM Manter NUM liñas do prefixo e sufixo comúns." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Procurar atopa-lo conxunto de cambios máis pequeno." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Asumir ficheiros longos e pequenos cambios dispersos." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"Os FICHEIROS son `FICH1 FICH2', `DIR1 DIR2', `DIR FICH...' ou `FICH... DIR'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Se se indica --from-file ou --to-file, non hai restriccións nos FICHEIROS." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Se un FICHEIRO é `-', lese da entrada estándar." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Uso: %s [OPCIÓN]... FICHEIROS\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "valor `%1$s' da opción %2$s conflictivo" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "opcións de estilo da saída conflictivas" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "ficheiro normal baleiro" + +#: src/diff.c:976 +msgid "regular file" +msgstr "ficheiro normal" + +#: src/diff.c:978 +msgid "directory" +msgstr "directorio" + +#: src/diff.c:981 +msgid "block special file" +msgstr "ficheiro especial de bloques" + +#: src/diff.c:984 +msgid "character special file" +msgstr "ficheiro especial de caracteres" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "socket" + +#: src/diff.c:994 +msgid "message queue" +msgstr "cola de mensaxes" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semáforo" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "obxecto de memoria compartida" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "obxecto de memoria con tipo" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "ficheiro raro" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Só en %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "non se pode comparar `-' cun directorio" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "A opción -D non está soportada con directorios" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Subdirectorios comúns: %s e %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "O ficheiro %s é un %s mentres que o ficheiro %s é un %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Os ficheiros %s e %s son idénticos\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Escrito por Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "opcións incompatibles" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "Especificouse `-' para máis dun ficheiro de entrada" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "fallou a lectura" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Producir cambios sen mesturar de FICHVELLO a TEUFICH en MEUFICH." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Amosar cambios sen mesturar cos conflictos entre " +"corchetes" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" +"-a --show-all Amosar tódolos cambios, cos conflictos entre corchetes." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Amosa-los cambios que se superpoñen." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Amosa-los cambios que se solapen, poñéndoos entre corchetes." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Amosar cambios non solapados e non mesturados." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Amosa-lo ficheiro mesturado no canto dun script en ed [-A]." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ETIQ --label=ETIQ Usa-la ETIQueta no canto do nome do ficheiro." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Engadi-los comandos `w' e `q' aos scripts en ed." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +"--diff-program=PROGRAMA Emprega-lo PROGRAMA para compara-los ficheiros." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Uso: %s [OPCIÓN]... MEUFICH VELLOFICH TEUFICH\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Comparar tres ficheiros liña a liña." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "erro interno: fallo no formato dos bloques diff" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff fallou: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "erro interno: tipo de diff non válido en process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "formato de diff non válido; separador de cambios non válido" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "formato de diff non válido: derradeira liña incompleta" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "o programa subsidiario `%s' non é executable" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "non se atopou o programa subsidiario `%s'" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "fallou o programa subsidiario `%s'" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "formato de diff non válido: caracteres a principio de liña incorrectos" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "erro interno_ tipo de diff non válido pasado á saída" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "o ficheiro de entrada encolleu" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "non se poden compara-los ficheiros `%s' e `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Escrito por Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o FICH --output=FICH Operar interactivamente, mandando a saída ao " +"FICHeiro." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "" +"-i --ignore-case Ignora-las diferencias entre maiúsculas e minúsculas." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignorar tódolos espacios en branco." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "-w NÚM --width=NÚM Amosar como moito NÚM [130] columnas por liña." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Amosar só a columna da esquerda nas liñas comúns." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-llines Non amosa-las liñas comúns." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Asumir ficheiros longos e pequenos cambios " +"dispersos." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Uso: %s [OPCIÓN]... FICH1 FICH2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Mestura en dúas columnas das diferencias entre os ficheiros." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "non se pode mestura-la entrada estándar interactivamente" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "ámbolos dous ficheiros a ser comparados son directorios" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tEditar e usar ámbalas dúas versións, cada unha cunha cabeceira.\n" +"eb:\tEditar e usar ámbalas dúas versións.\n" +"el:\tEditar e logo usa-la versión da esquerda.\n" +"er:\tEditar e logo usa-la versión da dereita.\n" +"e:\tEditar unha nova versión.\n" +"l:\tusa-la versión da esquerda.\n" +"r:\tusa-la versión da dereita.\n" +"e:\tEditar unha nova versión.\n" +"s:\tInclui-las liñas comúns silenciosamente.\n" +"v:\tInclui-las liñas comúns faladoramente.\n" +"q:\tSair.\n" + +#~ msgid "" +#~ "SKIP values may be followed by the following multiplicative suffixes:\n" +#~ msgstr "" +#~ "Os valores de N poden ir seguidos polos seguintes sufixos " +#~ "multiplicativos:\n" + +#~ msgid "kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +#~ msgstr "kB 1000, K 1024, MB 1.000.000, M 1.048.576,\n" + +#~ msgid "GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.\n" +#~ msgstr "GB 1.000.000.000, G 1.073.741.824 e así para T, P, E, Z e Y.\n" + +#~ msgid "Report bugs to <bug-gnu-utils@gnu.org>.\n" +#~ msgstr "Informe dos erros a <bug-gnu-utils@gnu.org>.\n" + +#~ msgid "context length specified twice" +#~ msgstr "a lonxitude do contexto especificouse dúas veces" + +#~ msgid "multiple `--from-file' options" +#~ msgstr "opcións `--from-file' múltiples" + +#~ msgid "multiple `--to-file' options" +#~ msgstr "opcións `--to-file' múltiples" + +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge Non mesturar anacos" + +#~ msgid "regular empty executable file" +#~ msgstr "ficheiro normal executable baleiro" + +#~ msgid "regular executable file" +#~ msgstr "ficheiro normal executable" + +#~ msgid "If a FILE is `-', read standard input.\n" +#~ msgstr "Se un FICHEIRO é `-', lese da entrada estándar.\n" + +#~ msgid "--ignore-initial value must be a nonnegative integer" +#~ msgstr "O valor de --ignore-initial debe ser un enteiro non negativo" + +#~ msgid ": not found\n" +#~ msgstr ": non atopado\n" + +#~ msgid "column width must be a positive integer" +#~ msgstr "o ancho da columna debe ser un enteiro positivo" + +#~ msgid "conflicting group format" +#~ msgstr "formato de grupo con conflictos" + +#~ msgid "conflicting line format" +#~ msgstr "formato de liña con conflictos" + +#~ msgid "context length must be a nonnegative integer" +#~ msgstr "a lonxitude do contexto debe ser un enteiro non negativo" + +#~ msgid "horizon must be a nonnegative integer" +#~ msgstr "o horizonte debe ser un enteiro non negativo" diff --git a/gnu/dist/diffutils/po/he.gmo b/gnu/dist/diffutils/po/he.gmo Binary files differnew file mode 100644 index 00000000000..c9cc2f33eca --- /dev/null +++ b/gnu/dist/diffutils/po/he.gmo diff --git a/gnu/dist/diffutils/po/he.po b/gnu/dist/diffutils/po/he.po new file mode 100644 index 00000000000..1f1ed4a9250 --- /dev/null +++ b/gnu/dist/diffutils/po/he.po @@ -0,0 +1,907 @@ +# Hebrew messages for GNU Diffutils -*- coding: hebrew-iso-8bit -*- +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +# Eli Zaretskii <eliz@is.elta.co.il>, 2001, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-13 20:45+0200\n" +"Last-Translator: Eli Zaretskii <eliz@gnu.org>\n" +"Language-Team: Hebrew <eliz@gnu.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "úéðëúá äøåîç äì÷ú" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "úéðñçî úùéìâ" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "ääåæî-éúìá äì÷ú" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +" .úàæ øéúî ÷åçäù äîë ãò ,àåäùìë úåéøçà áúëá äååìî äðéà åæ úéðëåú\n" +".GNU General Public License ïåéùøä éàðúì íàúäá åæ úéðëåú õéôäì íëúåëæ\n" +" .COPYING õáå÷á åðééò ,åìà íéðéðòá èåøéô øúéì" + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `%s' ïééôàî\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `--%s' ïééôàî\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `%c%s' ïééôàî\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà áééçî `%s' ïééôàî\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s úéðëú øåáò `--%s' ääåæî-éúìá ïééôàî\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s úéðëú øåáò `%c%s' ääåæî-éúìá ïééôàî\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: é÷åç-éúìá ïééôàî -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s úéðëú øåáò éåâù ïééôàî -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: èðîåâøà áééçî ïééôàî -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `-W %s' ïééôàî\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `-W %s' ïééôàî\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "äçìöä" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "äîéàúî úæåøçî äàöîð àì" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "éåâù éøìåâø éåèéá" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "òåãé-éúìá øåãéñ åú" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "íéåú úöåá÷ ìù øëåî-éúìá íù" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "`\\' éøåçà ïñëåìá íééúñî éøìåâø éåèéá" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "íãå÷ éåèéá-úúì äéåâù äééðôä" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "âåæ-ïá åì ïéàù [^ åà [" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "âåæ-ïá åì ïéàù \\( åà (" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "âåæ-ïá åì ïéàù \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "\\{\\} êåúá éåâù äðáî" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "íéåú íåçú ìù äéåâù äøãâä" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "ïåøëæä øîâð" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "íéé÷ åðéà åà éåâù íãå÷ éøìåâø éåèéá" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "éãî íã÷åî íééúñî éøìåâø éåèéá" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "éãî áëøåî åà ìåãâ éøìåâø éåèéá" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "âåæ-ïá åì ïéàù \\) åà )" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "íãå÷ éøìåâø éåèéá ïéà" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "ïåøëæä øîâð" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "äæî äæ íéðåù `%s'-å `%s' íéöá÷ä\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "äæî äæ íéðåù `%s'-å `%s' íééøðéá íéöá÷\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "õáå÷ä óåñá äùãç-äøåù åú øñç" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr ".David MacKenzie-å Torbjorn Granlund é\"ò áúëð" + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr ".øúåé áø òãéî úâöäì `%s --help' ùé÷äì äñð" + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "--ignore-initial ïééôàî øåáò `%s' éåâù êøò" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "äæ úà äæ íéøúåñ -s-å -l íéðééôàîä" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "äáéúëá äì÷ú" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "éð÷ú èìô õåøòì" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr " .íéäæ íðéàù íéúá âöä -b --print-bytes" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr " .èì÷ä ìù íéðåùàø íéúá N ìò âìã -i N --ignore-initial=N" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "" +" -i N1:N2\n" +" --ignore-initial=N1:N2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr ".éðùä õáå÷á íéúá N2 ìòå ïåùàøä õáå÷á íéúá N1 ìò âìã" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr ".íéäæ íðéàù íéúáä ìë ìù ãå÷å éøåãéñ 'ñî âöä -l --verbose" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr " .íéúá N øúåéä ìëì äååùä -n N --bytes=N" + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr " .ãáìá äàéöé ãå÷ ÷ôä ;èìô àìì -s --quiet --silent" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr " .úéðëúä úñøéâ úà âöä -v --version" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr " .äæ äøæò êñî âöä --help" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr " %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]] :ùåîéù ïôåà\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr ".úéáì úéá íéöá÷ éðù äååùä" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr " .íéöá÷äî ãçà ìëá âìãì ùé íäéìò íéúáä éøôñî íä SKIP2-å SKIP1" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +" :úåéìôë úåîåéñ íò SKIP éëøò ïééöì ïúéð\n" +" ,M 1,048,576, MB 1,000,000 ,K 1024 ,kB 1000,\n" +" .T, P, E, Z, Y øåáò äàìä ïëå ,G 1,073,741,824 ,GB 1,000,000,000" + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr " .éð÷ú èì÷ õåøòî àø÷ ,ïééåöî åðéà åà `-' åðéä FILE íà" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr ".<bug-gnu-utils@gnu.org> úáåúëì úåì÷ú ìò íéçååéã çåìùì àð" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "--bytes ïééôàî øåáò `%s' éåâù êøò" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "`%s' éøçà øñç èðîåâøà" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "`%s' éøçà øúåéî èðîåâøà" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s-å %s íéöá÷ä ïéá %s úéá ,%s äøåùî ìçä éðåù\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s-å %s íéöá÷ä ïéá %s úéá ,%s äøåùî ìçä %3o %s %3o %s éðåù\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: %s õáå÷ óåñ\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +" ,David Hayes ,Mike Haertel ,Paul Eggert é\"ò áúëð\n" +" .Len Tower-å ,Richard Stallman" + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "`%s' éåâù øù÷ä êøåà" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "åæ úëøòîá èìôä ãåîéòá äëéîú ïéà" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "íéöá÷ úéååú øåáò -L éðééôàî éãî øúåé" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "`%s' éåâù äøåù áçåø" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "íéøúåñ äøåù áçåø éðééôàî" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "--horizon-lines ïééôàîá `%s' éåâù úåøåù øôñî" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "ïùåéî åðéäù `-%ld' íå÷îá `-%c %ld'-á ùîúùäì õìîåî" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "ïùåéî åðéäù `-%ld'-á ùîúùäì àì õìîåî" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--to-file ïäå --from-file ïä úðééö" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr ".äøåù äøåù íéöá÷ éðù äååùä" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr ".íéöá÷ä ïëåúá úåðè÷î úåìåãâ úåéúåà ìéãáú ìà -i --ignore-case" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr ".íéöá÷ä úåîùá úåðè÷î úåìåãâ úåéúåà ìéãáú ìà --ignore-file-name-case" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +" .íéöá÷ä úåîùá úåðè÷î úåìåãâ úåéúåà ìéãáú --no-ignore-file-name-case" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +" .íéçååøì TAB ïéá íéìãáäî íìòúä -E --ignore-tab-expansion" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr " .íéçååø úåîëá íéìãáäî íìòúä -b --ignore-space-change" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr " .íéçååøä ìëî íìòúä -w --ignore-all-space" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr " .úå÷éø íäéúåøåùù íééåðéùî íìòúä -B --ignore-blank-lines" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +".RE úéðáúì úåîéàúî íäéúåøåùù íééåðéùî íìòúä -I RE --ignore-matching-lines=RE" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr " .èì÷ úøåù ìë óåñî CR éååú ÷ìñ --strip-trailing-cr" + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr " .éøàðéá ïôåàá áåúëå àø÷ --binary" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr " .èñ÷è éöá÷áë íéöá÷ä ìëá ìôè -a --text" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +" .÷úòåî èñ÷èðå÷ úåøåù (3 :ç\"îøá) NUM äàøä -c -C NUM --context[=NUM]\n" +" .ãçåàî èñ÷èðå÷ úåøåù (3 :ç\"îøá) NUM äàøä -u -U NUM --unified[=NUM]\n" +" .íù íå÷îá LABEL-á ùîúùä --label LABEL\n" +" .éåðéù ìë ìù C úééö÷ðåô íù äàøä -p --show-c-function\n" +" .RE úéðáúì äîéàúîù äðåøçà äøåù äàøä -F RE --show-function-line=RE" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr " .íéðåù íéöá÷ä íà øåîà ÷ø -q --brief" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr " .ed êøåò øåáò úåàøåä úîéùø ÷ôä -e --ed" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr " .ìéâø èîøåôá íééåðéù ÷ôä --normal" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr " .RCS èîøåôá íééåðéù ÷ôä -n --rcs" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +" .åæ ãöì åæ úåãåîò éúùá èìô êåøò -y --side-by-side\n" +" .íéååú (130 :ç\"îøá) NUM-ì èìô úåøåù ìáâä -W NUM --width=NUM\n" +" .úéìàîùä úà ÷ø âöä ,úåäæ úåøåùä íà --left-column\n" +" .úåäæ úåøåù ììë âéöú ìà --suppress-common-lines" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "`#ifdef NAME'-á íééåðéù ãøôä ,áìåùî õáå÷ ÷ôä -D NAME --ifdef=NAME" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"GFMT úøæòá GTYPE âåñî èì÷ úåöåá÷ èîøô êà ,ì\"ðë --GTYPE-group-format=GFMT" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr " .LFMT úøæòá úåøåù èîøô êà ,ì\"ðë --line-format=LFMT" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +".LFMT úøæòá LTYPE âåñî èì÷ úåøåù èîøô êà ,ì\"ðë --LTYPE-group-format=LFMT" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr " .`changed' åà LTYPE åîë GTYPE .`unchanged' åà `new' ,`old' àåä LTYPE" + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" :ìåìëì ìåëé GFMT\n" +" FILE1-î úåøåù %<\n" +" FILE2-î úåøåù %>\n" +" FILE2-å FILE1-ì úåôúåùî úåøåù %=\n" +" LETTER øåáò printf ïåðâñá úæåøçî %[-][WIDTH][.[PREC]]{doxX}LETTER\n" +" :(äðùé äöåá÷ øåáò úåðè÷ úåéúåà) úåàáä úåéúåàä úçà àéä LETTER\n" +" äðåùàø äøåù øôñî F\n" +" äðåøçà äøåù øôñî L\n" +" L-F+1 = úåøåùä øôñî N\n" +" F-1 E\n" +" M+1 M" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" :ìåìëì ìåëé LFMT\n" +" äøåù ïëåú %L\n" +" äøåùä óåñ åú èòîì äøåù ïëåú %l\n" +"èì÷ úøåù øåáò printf ïåðâñá úæåøçî %[-][WIDTH][.[PREC]]{doxX}n" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" :íâ ìåìëì íéìåëé LFMT åà GFMT\n" +" %% %\n" +" C ããåá åú %c'C'\n" +" OOO éìè÷åà ãå÷ ìòá åú %c'\\OOO'" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr " .ãåîéò íùì `pr' êøã èìô áúð -l --paginate" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr " .èìôá íéçååøì TAB éååú êåôä -t --expand-tabs" + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr " .äøåùä éðôì TAB \"ò íé-TAB øùé -T --initial-tab" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr " .éáéñøå÷ø ïôåàá úåé÷éú-úú äååùä -r --recursive" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr " .íé÷éø åéä åìéàë íéøñç íéöá÷á ìôè -N --new-file" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +" .íé÷éø åéä åìéàë íéøñç íéðåùàø íéöá÷á ìôè --unidirectional-new-file" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +" .íéäæ íéöá÷ ìò çååã -s --report-identical-files" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr " .PAT úéðáúì íéîéàúî íäéúåîùù íéöá÷ ìò âìã -x PAT --exclude=PAT" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"FILE-á úåéðáúì íéîéàúî íäéúåîùù íéöá÷ ìò âìã -X FILE --exclude-from=FILE" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +" .FILE õáå÷á úåé÷éú úàååùä ìçúä -S FILE --starting-file=FILE" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +".äé÷éú úåéäì ìåëé FILE1 .íéèðîåâøàä øàù ìëì FILE1 äååùä --from-file=FILE1" + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +" .äé÷éú úåéäì ìåëé FILE2 .FILE2-ì íéèðîåâøàä ìë äååùä --to-file=FILE2" + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +".íéöá÷ä íåéñå äìéçúá úåôúåùî úåøåù NUM øàùä --horizon-lines=NUM" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr " .íééåðéùä úöåá÷ úà ïéè÷äì ìãúùä -d --minimal" + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr " .íé÷çåøîå íéðè÷ íééåðéùå íéìåãâ íéöá÷ çðä --speed-large-files" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +".`FILE... DIR' åà `DIR FILE...' åà `DIR1 DIR2' åà `FILE1 FILE2' íä FILES" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +" .FILES ìò úåìáâî ïéà éæà ,--to-file åà --from-file ïééôàî ïåúð íà" + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "" +" .éð÷úä èì÷ä õøòî àø÷ ,`-' àåä FILE íà" + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "%s [OPTION]... FILES :ùåîéù ïôåà\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "%s ïééôàî ìù íãå÷ êøò øúåñ `%s' êøò" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "èìô ïåðâñ ìù íéøúåñ íéðééôàî" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "÷éø õáå÷" + +#: src/diff.c:976 +msgid "regular file" +msgstr "õáå÷" + +#: src/diff.c:978 +msgid "directory" +msgstr "äé÷éú" + +#: src/diff.c:981 +msgid "block special file" +msgstr "íé÷åìá ï÷úä õáå÷" + +#: src/diff.c:984 +msgid "character special file" +msgstr "íéåú ï÷úä õáå÷" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo õáå÷" + +#: src/diff.c:991 +msgid "socket" +msgstr "ò÷ù" + +#: src/diff.c:994 +msgid "message queue" +msgstr "úåòãåä øåú" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "øåôîñ" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "óúåùî ïåøëæ è÷ééáåà" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "âååéñ ìòá ïåøëæ è÷ééáåà" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "øæåî õáå÷" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "%s-á ÷ø àöîð %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "äé÷éúì `-' úååùäì úåøùôà ïéà" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "úåé÷éú øåáò -D ïééôàîá äëéîú ïéà" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "%s-å %s :úåäæ úåé÷éú-úú\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "%s %s-ì %s %s úååùäì ïúéð àì\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "íéäæ íðéä %s-å %s íéöá÷ä\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr ".Randy Smith é\"ò áúëð" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "íéøúåñ íéðééôàî" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "ãçà èì÷ õáå÷î øúåé øåáò `-' úðééö" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "äàéø÷á äì÷ú" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "MYFILE êåú ìà YOURFILE-ì OLDFILE-î âåæéî àìì íééåðéù -e --ed" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +" .íéè÷éìôðå÷ ïîñ ,âåæéî àìì íééåðéù âöä -E --show-overlap" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr " .íéè÷éìôðå÷ ïîñ ,íééåðéùä ìë úà âöä -A --show-all" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "" +" .íéôôåç íééåðéù âöä -x --overlap-only" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr " .íúåà ïîñå íéôôåç íééåðéù âöä -X" + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr " .âåæéî àììå íéôôåç íðéàù íééåðéù âöä -3 --easy-only" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr " .(-A ç\"îøá) ed úåàøåä íå÷îá âæåîî õáå÷ áåúë -m --merge" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "" +" .õáå÷ä íù íå÷îá LABEL-á ùîúùä -L LABEL --label=LABEL" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr " .ed úåãå÷ô íåéñá `q'-å `w' úåãå÷ô áåúë -i" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +" .íéöá÷ úàåùäì PROGRAM úéðëúá ùîúùä --diff-program=PROGRAM" + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "%s [OPTION]... MYFILE OLDFILE YOURFILE :ùåîéù ïôåà\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr ".úéáì úéá íéöá÷ äùìù äååùä" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "diff éòè÷ èîøåôá äçéøî :úéîéðô äðëú úàéâù" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s é\"ò diff úìòôäá äì÷ú :" + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "process_diff úééö÷ðåôá éåðéù ìù éåâù âåñ :úéîéðô äðëú úàéâù" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "äéåâù íééåðéù úãøôä úæåøçî :éåðéù ìù éåâù èîøåô" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "äîìù äðéà äðåøçà äøåù :éåðéù ìù éåâù èîøåô" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "òåöéá úá äðéà `%s' úéðëú-úú" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "äàöîð àì `%s' úéðëú-úú" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "`%s' úéðëú-úú úöøäá ïåìùë" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "äøåù úìéçúá íééåâù íéååú :éåðéù ìù éåâù èîøåô" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "èìô éëøöì éåðéù ìù éåâù âåñ :úéîéðô äðëú úàéâù" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "÷îèöä èì÷ õáå÷" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "`%s'-å `%s' íéöá÷ úåîù úååùäì ïúéð àì" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr ".Thomas Lord é\"ò áúëð" + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr " .FILE-ì èìô ,úéáéè÷àøèðéà äìåòô -o FILE --output=FILE" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr " .úåðè÷å úåìåãâ úåéúåà ïéá íéìãáäî íìòúä -i --ignore-case" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr " .øçà ïáì çèùå íéçååøî íìòúä -W --ignore-all-space" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr ".äøåùì (130 ç\"îøá) íéååú NUM øúåéä ìëì âöä -w NUM --width=NUM" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr " .úéìàîùä úà ÷ø âöä ,úåäæ úåøåùä íà -l --left-column" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "" +" .úåäæ úåøåù ììë âéöú ìà -s --suppress-common-lines" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr " .íé÷çåøîå íéðè÷ íééåðéùå íéìåãâ íéöá÷ çðä -H --speed-large-files" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "%s [OPTION]... FILE1 FILE2 :ùåîéù ïôåà\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr ".äæ ãöá äæ íéöá÷ ïéá íééåðéù ìù âåæéî" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "éáéè÷àøèðéà ïôåàá éð÷ú èì÷ õåøò âæîì úåøùôà ïéà" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "úåé÷éú íðéä äàååùäì íéöá÷ä éðù" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed -- äúøúåë íò úçà ìë ,úåàñøâä éúùá ùîúùä æàå ,êåøò\n" +"eb -- úåàñøâä éúùá ùîúùä æàå ,êåøò\n" +"el -- ìàîùîù àñøâá ùîúùä æàå ,êåøò\n" +"er -- ïéîéîù àñøâá ùîúùä æàå ,êåøò\n" +"e -- éøîâì äùãç àñøâ êåøò\n" +"l -- ìàîùîù àñøâá ùîúùä\n" +"r -- ïéîéîù àñøâá ùîúùä\n" +"s -- ïâéöäì éìáî úåôúåùî úåøåù ÷úòä\n" +"v -- ïúâöä êåú úåôúåùî úåøåù ÷úòä\n" +"q -- äàéöé\n" diff --git a/gnu/dist/diffutils/po/id.gmo b/gnu/dist/diffutils/po/id.gmo Binary files differnew file mode 100644 index 00000000000..9fda1b8a987 --- /dev/null +++ b/gnu/dist/diffutils/po/id.gmo diff --git a/gnu/dist/diffutils/po/id.po b/gnu/dist/diffutils/po/id.po new file mode 100644 index 00000000000..b60ceaf9349 --- /dev/null +++ b/gnu/dist/diffutils/po/id.po @@ -0,0 +1,913 @@ +# diffutils 2.7.10 (Indonesian) +# Copyright (C) 2002 Free Software Foundation, Inc. +# Tedi Heriyanto <tedi_h@gmx.net>, 2002 +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-04-02 09:35GMT+0700\n" +"Last-Translator: Tedi Heriyanto <tedi_h@gmx.net>\n" +"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.5\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "kesalahan program" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "overflow stack" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Kesalahan sistem tidak dikenal" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: option `%s' rancu\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: option `--%s' tidak mengijinkan ada argumen\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: option `%c%s' tidak mengijinkan ada argumen\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: option `%s' butuh sebuah argumen\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: option tidak dikenal `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: option tidak dikenal `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: option ilegal -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: option invalid -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: option membutuhkan sebuah argumen -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: option `-W %s' rancu\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: option `-W %s' tidak memboleh ada argumen\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Sukses" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Tidak ada kecocokan" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Ekspresi reguler tidak valid" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Karakter collation tidak valid" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Nama karakter kelas tidak valid" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Trailing backslash" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Back reference tidak valid" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Tidak cocok [ atau [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Tidak cocok ( atau \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Tidak cocok \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Isi \\\\{\\\\} tidak valid" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Batas akhir tidak valid" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Memori habis" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Ekspresi reguler terdahulu tidak valid" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Akhir ekspresi reguler prematur" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Ekspresi reguler terlalu besar" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Tidak cocok ) atau \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Tidak ada ekspresi reguler sebelumnya" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "memori habis" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "File %s dan %s berbeda\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "File biner %s dan %s berbeda\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Tidak ada newline pada akhir file" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Ditulis oleh Torbjorn Granlund dan David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Coba `%s --help' untuk informasi lebih jauh." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "tidak valid --ignore-initial value `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "option -l dan -s tidak kompatibel" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "gagal menulis" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "output standar" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Cetak byte berbeda." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i SKIP --ignore-initial=SKIP Lewati SKIP byte pertama input." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr " Lewati SKIP1 byte pertama FILE1 dan SKIP2 byte pertama FILE2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Output nomor byte dan nilai semua byte yang berbeda." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT Bandingkan paling banyak LIMIT byte." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent Tidak ada output; hanya beri status keluar." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Tampilkan info versi." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Tampilkan bantuan ini." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Penggunaan: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Bandingkan dua file byte per byte" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "SKIP1 dan SKIP2 adalah jumlah byte yang harus dilewati di tiap file." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Nilai SKIP dapat diikuti oleh suffiks perkalian berikut:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, dan seterusnya untuk T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Jika sebuah FILE adalah `-' atau tidak ada, baca input standar" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Laporkan bug ke <bug-gnu-utils@gnu.org>" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "nilai --byte tidak valid `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "tidak ada operand setelah `%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "operand ekstra `%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s berbeda: byte %s, baris %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s berbeda: byte %s, baris %s adalah %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF pada %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Ditulis oleh Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, dan Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "panjang context tidak valid `%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "paginasi tidak didukung pada host ini" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "terlalu banyak option label file" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "lebar tidak valid `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "option lebar konflik" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "panjang horizon tidak valid `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "`-%ld' option kuno; gunakan `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "`-%ld' option kuno, hilangkan saja" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--from-file dan --to-file keduanya disebutkan" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Bandingkan file baris per baris" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case Abaikan beda case dalam isi file." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case Abaikan case saat membandingkan nama file." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Pertimbangkan case saat membandingkan nama file." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "-E --ignore-tab-expansion Abaikan perubahan akibat ekspansi tab." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Abaikan perubahan sejumlah white space." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Abaikan seluruh white space." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines Abaikan perubahan baris kosong." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE Abaikan perubahan baris yang cocok dg RE." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Hapus trailing carriage return pada input." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Baca dan tulis data dalam mode biner." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Perlakukan seluruh file sebagai teks." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C NUM --context[=NUM] Output NUM (baku 3) baris isi yang disalin.\n" +"-u -U NUM --unified[=NUM] Output NUM (baku 3) baris unified context.\n" +" --label LABEL Gunakan LABEL alih-alih nama file.\n" +" -p --show-c-function Tampilkan setiap fungsi C yang berubah.\n" +" -F RE --show-function-line=RE Tampilkan baris paling akhir yang cocok " +"dengan RE." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Tampilkan hanya apakah file berbeda." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Output adalah script ed." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Output normal diff." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Output dalam format RCS diff." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Output dalam dua kolom.\n" +" -W NUM --width=NUM Output paling banyak NUM (baku 130) kolom.\n" +" --left-column Output hanya kolom kiri baris bersama.\n" +" --suppress-common-lines Jangan hasilkan baris bersama." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NAME --ifdef=NAME Output file merge untuk tampilkan `#ifdef NAME' diffs." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT Serupa, tapi format input kelompok GTYPE dg GFMT. " + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "--line-format=LFMT Serupa, tapi format seluruh baris input dg LFMT." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT Serupa, tapi format baris input LTYPE dg LFMT." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE adalah `old', `new', atau `unchanged'. GTYPE adalah LTYPE atau " +"`changed'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT dapat berisi:\n" +" %< baris dari FILE1\n" +" %> baris dari FILE2\n" +" %= baris bersama FILE1 dan FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec untuk LETTER\n" +" LETTERs adalah sebagai berikut untuk grup baru, huruf kecil untuk grup " +"tua:\n" +" F nomor baris pertama\n" +" L nomor baris terakhir\n" +" N jumlah baris = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT dapat berisi:\n" +" %L isi baris\n" +" %l isi baris, tanpa baris baru\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec untuk nomor baris input" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GFMT atau LFMT dapat berisikan:\n" +" %% %\n" +" %c'C' karakter tunggal C\n" +" %c'\\OOO' karakter dengan kode oktal OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Berikan output ke `pr' untuk di-paginate." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Ekspansi tab ke spasi dalam output." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab Buat tab beraturan dg menambahkan sebuah tab." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Membandingkan subdirektori secara rekursif." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Perlakukan tiada file sebagai kosong." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Anggap file tidak ada pertama sebagai kosong." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Laporkan ketika dua file sama." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x PAT --exclude=PAT Tanpa file yang cocok dengan PAT." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FILE --exclude-from=FILE Abaikan file yang cocok dengan pola dalam FILE" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S FILE --starting-file=FILE Mulai dengan FILE ketika membandingkan " +"direktori." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FILE1 Bandingkan FILE1 ke semua operand. FILE1 dapat berupa " +"direktori." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FILE2 Bandingkan semua operand dengan FILE2. FILE2 dapat berupa " +"direktori." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "--horizon-lines=NUM Pertahankan NUM baris prefiks dan suffiks umum." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Usahakan mencari perubahan terkecil." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "--speed-large-files Asumsikan file besar dan banyak perubahan kecil." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FILES adalah `FILE1 FILE2' atau `DIR1 DIR2' atau `DIR FILE...' atau `FILE... " +"DIR'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Bila --from-file atau --to-file diberikan, tidak ada batasan untuk FILES." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Jika sebuah file FILE adalah `-', baca standard input." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Penggunaan: %s [OPTION]... FILES\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "Nilai option %s konflik dengan `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "option gaya output konflik" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "file reguler kosong" + +#: src/diff.c:976 +msgid "regular file" +msgstr "file reguler" + +#: src/diff.c:978 +msgid "directory" +msgstr "direktori" + +#: src/diff.c:981 +msgid "block special file" +msgstr "blok file khusus" + +#: src/diff.c:984 +msgid "character special file" +msgstr "karakter file khusus" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "soket" + +#: src/diff.c:994 +msgid "message queue" +msgstr "antrian pesan" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semafor" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "obyek memori bersama" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "objek memori bertipe" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "file aneh" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Hanya dalam %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "tidak dapat membandingkan `-' dg direktori" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D option tidak didukung dg direktori" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Subdirektori sama: %s dan %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "File %s adalah %s sementara file %s adalah %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "File %s dan %s identik\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Ditulis oleh Randy Smith" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "option tidak kompatibel" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "`-' dispesifikasikan lebih dari satu file input" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "gagal membaca" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Output perubahan tanpa dimerge dari OLDFILE ke YOURFILE ke dl " +"MYFILE." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap Output perubahan unmerge, konflik dl tanda kurung." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Output seluruh perubahan, konflik dalam tanda kurung." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Tampilkan perubahan yang overlap." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Output perubahan overlap, beri tanda kurung." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Output unmerged perubahan nonoverlap." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "-m --merge Tampilkan file yang dimerge bukan script ed (baku -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L LABEL --label=LABEL Gunakan LABEL bukan nama file." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Tambah perintah `w' dan `q' ke script ed." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM Gunakan PROGRAM untuk membandingkan file." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Pemakaian: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Bandingkan tiga file baris per baris." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "kesalahan internal: kacau dalam format blok diff" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff gagal: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "kesalahan internal: tipe diff tidak valid dalam process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "format diff tidak valid; separator perubahan tidak valid" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "format diff tidak valid; baris akhir tidak lengkap" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "program subsider `%s' tidak dapat dieksekusi" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "program subsider `%s' tidak ditemukan" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "program subsider `%s' gagal" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "format diff tidak valid; karakter leading line tidak tepat" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "kesalahan internal: tipe diff tidak valid dimasukkan ke output" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "file input mengecil" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "tidak dapat membandingkan nama file `%s' dan `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Ditulis oleh Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o FILE --output=FILE Operasi secara interaktif, kirim output ke FILE." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Abaikan huruf kapital dan huruf kecil." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Abaikan seluruh white space." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w NUM --width=NUM Output paling banyak NUM (baku 130) kolom per baris." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Hanya tampilkan kolom kiri baris yang sama." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Jangan tampilkan baris yang sama." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Asumsikan file besar dan banyak sebaran perubahan " +"kecil." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Pemakaian: %s [OPTION]... FILE1 FILE2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Merge side-by-side beda file." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "tidak dapat menggabung input standar secara interaktif" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "kedua file yang dibandingkan adalah direktori" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tEdit lalu gunakan kedua versi, dekorasikan dengan header.\n" +"eb:\tEdit lalu gunakan kedua versi.\n" +"el:\tEdit lalu gunakan versi kiri.\n" +"er:\tEdit lalu gunakan versi kanan.\n" +"e:\tEdit versi baru.\n" +"l:\tGunakan versi kiri.\n" +"r:\tGunakan versi kanan.\n" +"s:\tSertakan baris bersama secara diam-diam.\n" +"v:\tSertakan baris bersama secara verbose.\n" +"q:\tKeluar.\n" diff --git a/gnu/dist/diffutils/po/insert-header.sin b/gnu/dist/diffutils/po/insert-header.sin new file mode 100644 index 00000000000..b26de01f6c8 --- /dev/null +++ b/gnu/dist/diffutils/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/gnu/dist/diffutils/po/ja.gmo b/gnu/dist/diffutils/po/ja.gmo Binary files differnew file mode 100644 index 00000000000..0ad1cef514d --- /dev/null +++ b/gnu/dist/diffutils/po/ja.gmo diff --git a/gnu/dist/diffutils/po/ja.po b/gnu/dist/diffutils/po/ja.po new file mode 100644 index 00000000000..d1d967d8709 --- /dev/null +++ b/gnu/dist/diffutils/po/ja.po @@ -0,0 +1,898 @@ +# Japanese messages GNU diffutils +# Copyright (C) 2002 Free Software Foundation, Inc. +# IIDA Yosiaki <iida@gnu.org>, 2002. +# This file is distributed under the same license as the diffutils package. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-14 12:16+0900\n" +"Last-Translator: IIDA Yosiaki <iida@gnu.org>\n" +"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-JP\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "¥×¥í¥°¥é¥à¡¦¥¨¥é¡¼" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "¥¹¥¿¥Ã¥¯¡¦¥ª¡¼¥Ð¡¼¥Õ¥í¡¼" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "̤ÃΤΥ·¥¹¥Æ¥à¡¦¥¨¥é¡¼¤Ç¤¹" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING.\n" +"-- °Ê²¼¤Ï»²¹ÍÌõ¤Ç¤¹¡£Ë¡Åª¤Ê»ö¹à¤Ë¤Ä¤¤¤Æ¤Ï¾å¤Îµ½Ò¤Ë¤·¤¿¤¬¤Ã¤Æ¤¯¤À¤µ¤¤¡£\n" +"Ë¡¤Îµö¤¹ÈϰϤˤª¤¤¤Æ¡¢°ìÀÚ¤ÎÊݾڤϤ¢¤ê¤Þ¤»¤ó¡£¤¢¤Ê¤¿¤Ï¡¢¤³¤Î¥×¥í¥°¥é¥à\n" +"¤ÎÊ£À½¤ò¡¢GNU General Public License¤Ë´ð¤Å¤¤¤ÆºÆÈÒÉۤǤ¤Þ¤¹¡£¤³¤ì¤é¤Î\n" +"»ö¹à¤Ë¤Ä¤¤¤Æ¤Î¾Ü¤·¤¤¾ðÊó¤Ï¡¢COPYING¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤ò¸«¤Æ¤¯¤À¤µ¤¤¡£" + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö%s¡×¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö--%s¡×¤Ï°ú¿ô¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö%c%s¡×¤Ï°ú¿ô¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö%s¡×¤Ë¤Ï°ú¿ô¤¬É¬ÍפǤ¹\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ǧ¼±¤Ç¤¤Ê¤¤¥ª¥×¥·¥ç¥ó¡Ö--%s¡×¤Ç¤¹\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ǧ¼±¤Ç¤¤Ê¤¤¥ª¥×¥·¥ç¥ó¡Ö%c%s¡×¤Ç¤¹\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÉÔÀµ¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹ -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ̵¸ú¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹ -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤òÍ׵ᤷ¤Þ¤¹ -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö-W %s¡×¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¡Ö-W %s¡×¤Ï¡¢°ú¿ô¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "À®¸ù" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "°ìÃפ·¤Þ¤»¤ó" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "̵¸ú¤ÊÀµµ¬É½¸½¤Ç¤¹" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "̵¸ú¤ÊÀ°Îóʸ»ú¤Ç¤¹" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "̵¸ú¤Êʸ»ú¥¯¥é¥¹Ì¾¤Ç¤¹" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "¸å³¤¹¤ëµÕ¼ÐÀþ" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "̵¸ú¤ÊµÕ»²¾È" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Äà¤ê¹ç¤ï¤Ê¤¤[¤ä[^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Äà¤ê¹ç¤ï¤Ê¤¤(¤ä\\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Äà¤ê¹ç¤ï¤Ê¤¤\\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "̵¸ú¤Ê\\{\\}¤ÎÆâÍÆ" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "̵¸ú¤ÊÈϰϽªÎ»" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "²¾ÁÛ¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·¤¿" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "̵¸ú¤ÊÀè¹ÔÀµµ¬É½¸½" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "ͽ´ü¤»¤ÌÀµµ¬É½¸½¤Î½ªÎ»" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Â礤¹¤®¤ëÀµµ¬É½¸½" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Äà¤ê¹ç¤ï¤Ê¤¤)¤ä\\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Á°¤ÎÀµµ¬É½¸½¤¬¤¢¤ê¤Þ¤»¤ó" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "²¾ÁÛ¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·¤¿" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "¥Õ¥¡¥¤¥ë%s¤È%s¤Ï°ã¤¤¤Þ¤¹\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "¥Ð¥¤¥Ê¥ê¡¼¡¦¥Õ¥¡¥¤¥ë%s¤È%s¤Ï°ã¤¤¤Þ¤¹\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "¥Õ¥¡¥¤¥ëËöÈø¤Ë²þ¹Ô¤¬¤¢¤ê¤Þ¤»¤ó" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "ºîÀ®¤Ï¡¢Torbjorn Granlund¤ÈDavid MacKenzie¡£" + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "¡Ö%s --help¡×¤Ç¡¢¤è¤ê¾ÜºÙ¤Ê¾ðÊó¤òÄ´¤Ù¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£" + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "̵¸ú¤Ê--ignore-initial¤ÎÃÍ¡Ö%s¡×" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "¥ª¥×¥·¥ç¥ó-l¤È-s¤ÏξΩ¤·¤Þ¤»¤ó" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "½ñ¹þ¤ß¼ºÇÔ" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "ɸ½à½ÐÎÏ" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes °Û¤Ê¤ë¥Ð¥¤¥È¤òɽ¼¨¡£" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i SKIP --ignore-initial=SKIP ÆþÎϤÎÀèÆ¬SKIP¥Ð¥¤¥È¤ò¥¹¥¥Ã¥×¡£" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr " FILE1¤ÎSKIP1¥Ð¥¤¥È¤ÈFILE2¤ÎSKIP2¥Ð¥¤¥È¤ò¥¹¥¥Ã¥×¡£" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose ¤¹¤Ù¤Æ¤Î°Û¤Ê¤ë¥Ð¥¤¥È¤Î»Ø¿ô¤ÈÃͤò½ÐÎÏ¡£" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT ¹â¡¹LIMIT¥Ð¥¤¥È¤òÈæ³Ó¡£" + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent ½ÐÎϤʤ·¡£½ªÎ»¥¹¥Æ¡¼¥¿¥¹¤Î¤ß¡£" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎÏ¡£" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help ¤³¤ÎÀâÌÀ¤ò½ÐÎÏ¡£" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "" +"»ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... ¥Õ¥¡¥¤¥ë1 [¥Õ¥¡¥¤¥ë2 [¥¹¥¥Ã¥×1 [¥¹¥¥Ã¥×2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "2¤Ä¤Î¥Õ¥¡¥¤¥ë¤ò¥Ð¥¤¥È¤´¤È¤ËÈæ³Ó¤·¤Þ¤¹¡£" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "¡Ö¥¹¥¥Ã¥×1¡×¤È¡Ö¥¹¥¥Ã¥×2¡×¤Ï¡¢³Æ¥Õ¥¡¥¤¥ë¤ò¥¹¥¥Ã¥×¤¹¤ë¥Ð¥¤¥È¿ô¡£" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"¥¹¥¥Ã¥×¤ÎÃͤˤϡ¢¼¡¤Î·¸¿ô¤ò³¤±¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£\n" +"kB 1000¡¢K 1024¡¢MB 1,000,000¡¢M 1,048,576¡¢\n" +"GB 1,000,000,000¡¢G 1,073,741,824¡¢¤Þ¤¿T¡¢P¡¢E¡¢Z¡¢Y¤Ë¤Ä¤¤¤Æ¤âƱÍÍ¡£" + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "¤â¤·¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤¤«¡Ö-¡×¤Î¤È¤¡¢É¸½àÆþÎϤòÆÉ¤ß¤Þ¤¹¡£" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "¥Ð¥°¤ò¸«¤Ä¤±¤¿¤é<bug-gnu-utils@gnu.org>¤ËÊó¹ð¤·¤Æ¤¯¤À¤µ¤¤¡£" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "̵¸ú¤Ê--bytes¤ÎÃÍ¡Ö%s¡×" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "¡Ö%s¡×¤Î¸å¤Î¥ª¥Ú¥é¥ó¥É¤¬¤¢¤ê¤Þ¤»¤ó" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr ";·×¤Ê¥ª¥Ú¥é¥ó¥É¡Ö%s¡×" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s °Û¤Ê¤ê¤Þ¤¹: ¥Ð¥¤¥È %s¡¢¹Ô %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s °Û¤Ê¤ê¤Þ¤¹: ¥Ð¥¤¥È %s¡¢¹Ô %s %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: ¥Õ¥¡¥¤¥ë%s¤ÎËöÈø\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"ºîÀ®¤Ï¡¢Paul Eggert¡¢Mike Haertel¡¢David Hayes¡¢\n" +"Richard Stallman¡¢Len Tower¡£" + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "̵¸ú¤ÊÁ°¸å¤ÎÉý¡Ö%s¡×" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "¤³¤Î¥Û¥¹¥È¤Ç¤Ï¥Ú¡¼¥¸³äÉÕ¤±¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "¥Õ¥¡¥¤¥ë¡¦¥é¥Ù¥ë¡¦¥ª¥×¥·¥ç¥ó¤¬Â¿¤¹¤®¤Þ¤¹" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "̵¸ú¤ÊÉý¡Ö%s¡×" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "Éý¤Î¥ª¥×¥·¥ç¥ó¤¬¾×ÆÍ¤·¤Æ¤¤¤Þ¤¹" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "̵¸ú¤Ê²£Éý¡Ö%s¡×" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "¡Ö-%ld¡×¥ª¥×¥·¥ç¥ó¤Ï¡¢»þÂåÃÙ¤ì¤Ç¤¹¡£¡Ö-%c %ld¡×¤ò»È¤¤¤Þ¤·¤ç¤¦" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "¡Ö-%ld¡×¥ª¥×¥·¥ç¥ó¤Ï¡¢»þÂåÃÙ¤ì¤Ç¤¹¡£¾Êά¤·¤Þ¤·¤ç¤¦" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "--from-file¤È--to-file¤ÎξÊý¤ò»ØÄꤷ¤Þ¤·¤¿" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "2¤Ä¤Î¥Õ¥¡¥¤¥ë¤ò¹Ô¤´¤È¤ËÈæ³Ó¤·¤Þ¤¹¡£" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case ¥Õ¥¡¥¤¥ëÆâÍÆ¤ÎÂçʸ»ú¾®Ê¸»ú¤ò̵»ë¡£" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case ¥Õ¥¡¥¤¥ë̾¤ÎÂçʸ»ú¾®Ê¸»ú¤ò̵»ë¡£" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "--no-ignore-file-name-case ¥Õ¥¡¥¤¥ë̾¤ÎÂçʸ»ú¾®Ê¸»ú¤ò¶èÊÌ¡£" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "-E --ignore-tab-expansion ¥¿¥ÖŸ³«¤Îº¹¤ò̵»ë¡£" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change ¶õÇò¿ô¤Îº¹¤ò̵»ë¡£" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Á´¶õÇò¤ò̵»ë¡£" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines ¶õÇò¤À¤±¤Î¹Ô¤Îº¹¤ò̵»ë¡£" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "-i RE --ignore-matching-lines=RE RE¤Ë°ìÃפ¹¤ë¤¹¤Ù¤Æ¤Î¹Ô¤Îº¹¤ò̵»ë¡£" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr ÆþÎϤ«¤é¹ÔËö¥¥ã¥ê¥Ã¥¸¡¦¥ê¥¿¡¼¥ó¤òºï½ü¡£" + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary ¥Ð¥¤¥Ê¥ê¡¼¡¦¥â¡¼¥É¤ÇÆÉ¤ß½ñ¤¡£" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text ¤¹¤Ù¤Æ¥Æ¥¥¹¥È¤È¤·¤Æ½èÍý¡£" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C NUM --context[=NUM] ¥³¥Ô¡¼¤·¤¿Á°¸åNUM¹Ô (´ûÄê¤Ï3) ¤ò½ÐÎÏ¡£\n" +"-u -U NUM --unified[=NUM] Åý¹ç¤·¤¿Á°¸åNUM¹Ô (´ûÄê¤Ï3) ¤ò½ÐÎÏ¡£\n" +" --label LABEL ¥Õ¥¡¥¤¥ë̾¤ÎÂå¤ï¤ê¤ËLABEL¤ò»ÈÍÑ¡£\n" +" -p --show-c-function ³ÆÊѹ¹¤ò´Þ¤àC¤Î´Ø¿ô̾¤òɽ¼¨¡£\n" +" -F RE --show-function-line=RE RE¤È°ìÃפ¹¤ëľ¶á¤Î¹Ô¤òɽ¼¨¡£" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief ¥Õ¥¡¥¤¥ë¤¬°Û¤Ê¤ë¤«¤É¤¦¤«¤À¤±¤ò½ÐÎÏ¡£" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed ed¥¹¥¯¥ê¥×¥È¤ò½ÐÎÏ¡£" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal ɸ½àŪ¤Êº¹Ê¬¤ò½ÐÎÏ¡£" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs RCS·Á¼°¤Îº¹Ê¬¤ò½ÐÎÏ¡£" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side ½ÄÎó½ÐÎÏ¡£\n" +" -W NUM --width=NUM ¹â¡¹NUM (´ûÄê¤Ï130) °õ»ú·å¤Ç½ÐÎÏ¡£\n" +" --left-column ¶¦Ä̹ԤϺ¸Îó¤À¤±½ÐÎÏ¡£\n" +" --suppress-common-lines ¶¦Ä̹ԤνÐÎϤòÍ޻ߡ£" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "-D NAME --ifdef=NAME º¹Ê¬¤ò¡Ö#ifdef NAME¡×¤Ç¼¨¤¹Ê»¹ç¥Õ¥¡¥¤¥ë¤ò½ÐÎÏ¡£" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "--GTYPE-group-format=GFMT ƱÍͤÀ¤¬¡¢GTYPE¤ÎÆþÎÏ·²¤òGFMT¤ÇÀ°·Á¡£" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "--line-format=LFMT ƱÍͤÀ¤¬¡¢Á´ÆþÎϹԤòLFMT¤ÇÀ°·Á¡£" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "--LTYPE-line-format=LFMT ƱÍͤÀ¤¬¡¢LTYPEÆþÎϹԤòLFMT¤ÇÀ°·Á¡£" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" ¤³¤³¤ÇLTYPE¤Ï¡Öold¡×¡Önew¡×¡Öunchanged¡×¡£GTYPE¤ÏLTYPE¤«¡Öchanged¡×¡£" + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT¤Ë¤Ï°Ê²¼¤ò»ØÄê¤Ç¤¤Þ¤¹:\n" +" %< FILE1¤Î¹Ô\n" +" %> FILE2¤Î¹Ô\n" +" %= FILE1¤ÈFILE2¤Î¶¦Ä̹Ô\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printfÉ÷»ØÄê¤Ç¤ÎLETTER\n" +" LETTER¤Ï¡¢°Ê²¼¤Îʸ»ú¤Ç¿·¤·¤¤Êý¡¢¾®Ê¸»ú¤Ç¸Å¤¤Êý:\n" +" F ºÇ½é¤Î¹ÔÈÖ¹æ\n" +" L ºÇ¸å¤Î¹ÔÈÖ¹æ\n" +" N ¹Ô¿ô = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT¤Ë¤Ï°Ê²¼¤ò»ØÄê¤Ç¤¤Þ¤¹:\n" +" %L ¹ÔÆâÍÆ\n" +" %l ¸å³¤¹¤ë²þ¹Ô¤ò¤Î¤¾¤¤¤¿¹ÔÆâÍÆ\n" +" %[-][WIDTH][.[PREC]]{doxX}n printfÉ÷»ØÄê¤Ç¤ÎÆþÎϹԿô" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GFMT¤äLFMT¤Ë¤Ï°Ê²¼¤ò»ØÄê¤Ç¤¤Þ¤¹:\n" +" %% %\n" +" %c'C' ʸ»úC°ìʸ»ú\n" +" %c'\\OOO' 8¿Ê¥³¡¼¥ÉOOO¤Îʸ»ú" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate ½ÐÎϤò¡Öpr¡×¤Ç¥Ú¡¼¥¸Ê¬³ä¡£" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs ½ÐÎϤΥ¿¥Ö¤ò¶õÇò¤ËŸ³«¡£" + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab ¥¿¥Ö¤Ç»Ï¤Þ¤ë¹Ô¤Ï¡¢Á°¤Ë¥¿¥Ö¤òÃÖ¤¤¤ÆÂ·¤¨¤ë¡£" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive ¸«¤Ä¤«¤Ã¤¿²¼°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼¤òºÆµ¢Åª¤ËÈæ³Ó¡£" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file ¸ºß¤·¤Ê¤¤¥Õ¥¡¥¤¥ë¤Ï¶õ¤È¤ß¤Ê¤¹¡£" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "--unidirectional-new-file ¸ºß¤·¤Ê¤¤Á°¼Ô¤Î¥Õ¥¡¥¤¥ë¤Ï¶õ¤È¤ß¤Ê¤¹¡£" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files ξ¥Õ¥¡¥¤¥ë¤¬Æ±¤¸¤È¤¤ËÊó¹ð¡£" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x PAT --exclude=PAT PAT¤È°ìÃפ¹¤ë¥Õ¥¡¥¤¥ë¤ò½ü³°¡£" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FILE --exclude-from=FILE FILEÆâ¤Î³Æ¥Ñ¥¿¡¼¥ó¤È°ìÃפ¹¤ë¥Õ¥¡¥¤¥ë¤ò½ü³°¡£" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S FILE --starting-file=FILE ¥Ç¥£¥ì¥¯¥È¥ê¡¼¤òÈæ³Ó¤¹¤ëºÝ¡¢FILE¤«¤é»Ï¤á¤ë¡£" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FILE1 Á´¥ª¥Ú¥é¥ó¥É¤ÈFILE1¤òÈæ³Ó¡£FILE1¤Ï¥Ç¥£¥ì¥¯¥È¥ê¡¼¤â²Ä¡£" + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FILE2 FILE2¤ÈÁ´¥ª¥Ú¥é¥ó¥É¤òÈæ³Ó¡£FILE2¤Ï¥Ç¥£¥ì¥¯¥È¥ê¡¼¤â²Ä¡£" + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "--horizon-lines=NUM ÀèÆ¬¤ÈËöÈø¤Ë¤¢¤ë¶¦Ä̤ÊNUM¹Ô¤ò³ÎÊÝ¡£" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal ¤Ç¤¤ë¤À¤±¤¬¤ó¤Ð¤Ã¤Æ¡¢¾®¤µ¤¤º¹Ê¬¤ò¸«¤Ä¤±¤ë¡£" + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "--speed-large-files µðÂç¤Ê¥Õ¥¡¥¤¥ë¤Ëʬ»¶¤·¤¿Êѹ¹¤¬¤¢¤ë¤È²¾Äê¡£" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "FILES¤Ï¡¢¡ÖFILE1 FILE2¡×¡ÖDIR1 DIR2¡×¡ÖDIR FILE...¡×¡ÖFILE... DIR¡×¡£" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "--from-file¤ä--to-file¤ò»ØÄꤹ¤ì¤Ð¡¢FILES¤ÎÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£" + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "¥Õ¥¡¥¤¥ë¤¬¡Ö-¡×¤Î¤È¤¡¢É¸½àÆþÎϤòÆÉ¤ß¤Þ¤¹¡£" + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "»ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... FILES\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "%s¥ª¥×¥·¥ç¥ó¤ÎÃÍ¡Ö%s¡×¤¬¾×ÆÍ¤·¤Æ¤¤¤Þ¤¹" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "½ÐÎÏ»ØÄꥪ¥×¥·¥ç¥ó¤¬¾×ÆÍ¤·¤Æ¤¤¤Þ¤¹" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "¶õ¤ÎÄ̾ï¥Õ¥¡¥¤¥ë" + +#: src/diff.c:976 +msgid "regular file" +msgstr "Ä̾ï¥Õ¥¡¥¤¥ë\"" + +#: src/diff.c:978 +msgid "directory" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¡¼" + +#: src/diff.c:981 +msgid "block special file" +msgstr "¥Ö¥í¥Ã¥¯ÆÃ¼ì¥Õ¥¡¥¤¥ë" + +#: src/diff.c:984 +msgid "character special file" +msgstr "¥¥ã¥é¥¯¥¿ÆÃ¼ì¥Õ¥¡¥¤¥ë" + +#: src/diff.c:987 +msgid "fifo" +msgstr "̾Á°¤Ä¤¥Ñ¥¤¥×" + +#: src/diff.c:991 +msgid "socket" +msgstr "¥½¥±¥Ã¥È" + +#: src/diff.c:994 +msgid "message queue" +msgstr "¥á¥Ã¥»¡¼¥¸¡¦¥¥å¡¼" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "¥»¥Þ¥Õ¥©¡¼" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "¶¦Í¥á¥â¥ê¡¼¡¦¥ª¥Ö¥¸¥§¥¯¥È" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "·¿¤Ä¤¥á¥â¥ê¡¼¡¦¥ª¥Ö¥¸¥§¥¯¥È" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "¤¢¤ä¤·¤²¤Ê¥Õ¥¡¥¤¥ë" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "%s¤À¤±¤Ëȯ¸«: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "¡Ö-¡×¤Ï¥Ç¥£¥ì¥¯¥È¥ê¡¼¤ÈÈæ³Ó¤Ç¤¤Þ¤»¤ó" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥£¥ì¥¯¥È¥ê¡¼¤Ç¤Î¥µ¥Ý¡¼¥È¤ò¤·¤Æ¤¤¤Þ¤»¤ó" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "¶¦Ä̤β¼°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼: %s¤È%s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "¥Õ¥¡¥¤¥ë%s¤Ï%s¡¢¥Õ¥¡¥¤¥ë%s¤Ï%s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "¥Õ¥¡¥¤¥ë%s¤È%s¤ÏƱ°ì\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "ºîÀ®¤Ï¡¢Randy Smith¡£" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "ξΩ¤·¤Ê¤¤¥ª¥×¥·¥ç¥ó" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¡Ö-¡×¤¬Ê£¿ô²ó»ØÄꤵ¤ì¤Þ¤·¤¿" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "ÆÉ¹þ¤ß¼ºÇÔ" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "-e --ed OLDFILE¤«¤éYOURFILE¤Ø¤ÎMYFILE¤Ë¤¿¤¤¤¹¤ë̤ʻ¹ç¤ÎÊѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap ¾×ÆÍ¤ò¤¯¤¯¤ê¡¢Ì¤Ê»¹ç¤ÎÊѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all ¾×ÆÍ¤ò¤¯¤¯¤ê¡¢Á´Êѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only ½ÅÊ£¤·¤¿Êѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X ¾×ÆÍ¤ò¤¯¤¯¤ê¤Ê¤¬¤é¡¢Êѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only ¾×ÆÍ¤·¤Æ¤¤¤Ê¤¤¡¢Ì¤Ê»¹ç¤ÎÊѹ¹¤ò½ÐÎÏ¡£" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge ed¥¹¥¯¥ê¥×¥È¤ÎÂå¤ï¤ê¤Ë¡¢Ê»¹ç¤·¤¿¥Õ¥¡¥¤¥ë¤ò½ÐÎÏ (´ûÄê¤Ï-A)¡£" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L LABEL --label=LABEL ¥Õ¥¡¥¤¥ë̾¤ÎÂå¤ï¤ê¤ËLABEL¤ò»ÈÍÑ¡£" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i ed¥¹¥¯¥ê¥×¥È¤Î¸å¤Ë¡Öw¡×¤È¡Öq¡×¥³¥Þ¥ó¥É¤òÄɲá£" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM ¥Õ¥¡¥¤¥ë¤ÎÈæ³Ó¤ËPROGRAM¤ò»ÈÍÑ¡£" + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "»ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... MYFILE OLDFILE YOURFILE\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "3¤Ä¤Î¥Õ¥¡¥¤¥ë¤ò¹Ô¤´¤È¤ËÈæ³Ó¤·¤Þ¤¹¡£" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "ÆâÉô¥¨¥é¡¼: º¹Ê¬¥Ö¥í¥Ã¥¯¤Î·Á¼°¤Ë¥Ï¥Þ¤ë" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff¼ºÇÔ: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "ÆâÉô¥¨¥é¡¼: process_diffÆâ¤Ç̵¸ú¤Êº¹Ê¬·¿" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "̵¸ú¤Êº¹Ê¬·Á¼°; ̵¸ú¤ÊÊѹ¹¶èÀÚ¤ê" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "̵¸ú¤Êº¹Ê¬·Á¼°; ºÇ½ª¹Ô¤¬Ì¤½ªÃ¼" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "²¼°Ì¥×¥í¥°¥é¥à¡Ö%s¡×¤¬¼Â¹ÔÉÔǽ¤Ç¤¹" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "²¼°Ì¥×¥í¥°¥é¥à¡Ö%s¡×¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "²¼°Ì¥×¥í¥°¥é¥à¡Ö%s¡×¤¬¼ºÇÔ" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "̵¸ú¤Êº¹Ê¬·Á¼°; ÉÔÀµ¤Ê¹ÔƬʸ»ú·²" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "ÆâÉô¥¨¥é¡¼: ½ÐÎϤËÅϤµ¤ì¤ë̵¸ú¤Êº¹Ê¬·¿" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "ÆþÎÏ¥Õ¥¡¥¤¥ë¤¬½Ì¤ó¤À" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "¥Õ¥¡¥¤¥ë̾¡Ö%s¡×¤È¡Ö%s¡×¤òÈæ³Ó¤Ç¤¤Þ¤»¤ó" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "ºîÀ®¤Ï¡¢Thomas Lord¡£" + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o FILE --output=FILE ÂÐÏÃŪ¤ËÁàºî¤·¡¢½ÐÎϤÏFILE¤Ø¡£" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case ¥Õ¥¡¥¤¥ëÆâÍÆ¤ÎÂçʸ»ú¾®Ê¸»ú¤òƱ°ì»ë¡£" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Á´¶õÇò¤ò̵»ë¡£" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "-w NUM --width=NUM ¹ÔÅö¤ê¹â¡¹NUM (´ûÄê¤Ï130) ·å¤Ç½ÐÎÏ¡£" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column ¶¦Ä̹ԤϺ¸Îó¤À¤±½ÐÎÏ¡£" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines ¶¦Ä̹ԤνÐÎϤòÍ޻ߡ£" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "-H --speed-large-files µðÂç¤Ê¥Õ¥¡¥¤¥ë¤Ëʬ»¶¤·¤¿Êѹ¹¤¬¤¢¤ë¤È²¾Äê¡£" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "»ÈÍÑË¡: %s [¥ª¥×¥·¥ç¥ó]... ¥Õ¥¡¥¤¥ë1 ¥Õ¥¡¥¤¥ë2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "¥Õ¥¡¥¤¥ëº¹Ê¬¤Î2ÃÊÁÈÊ»¹ç" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "ɸ½à½ÐÎϤÏÂÐÏÃŪ¤ËÊ»¹ç¤Ç¤¤Þ¤»¤ó" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "Èæ³ÓÂоݤÏξÊý¤È¤â¥Ç¥£¥ì¥¯¥È¥ê¡¼" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tξÊý¤ÎÈǤ˥إåÀ¡¼¤Ç¾þ¤Ã¤Æ¡¢ÍøÍѤ·¡¢ÊÔ½¸¡£\n" +"eb:\tÎÈǤò»ÈÍѤ·¤ÆÊÔ½¸¡£\n" +"el:\tº¸Â¦¤ÎÈǤò»ÈÍѤ·¤ÆÊÔ½¸¡£\n" +"er:\t±¦Â¦¤ÎÈǤò»ÈÍѤ·¤ÆÊÔ½¸¡£\n" +"e:\t¿·ÈǤòÊÔ½¸¡£\n" +"l:\tº¸Â¦¤ÎÈǤò»ÈÍÑ¡£\n" +"r:\t±¦Â¦¤ÎÈǤò»ÈÍÑ¡£\n" +"s:\t¶¦Ä̹Ԥò²ÉÌۤ˴ޤࡣ\n" +"v:\t¶¦Ä̹ԤòñÁÀå¤Ë´Þ¤à¡£\n" +"q:\t½ªÎ»¡£\n" diff --git a/gnu/dist/diffutils/po/pl.gmo b/gnu/dist/diffutils/po/pl.gmo Binary files differnew file mode 100644 index 00000000000..72a5bb98246 --- /dev/null +++ b/gnu/dist/diffutils/po/pl.gmo diff --git a/gnu/dist/diffutils/po/pl.po b/gnu/dist/diffutils/po/pl.po new file mode 100644 index 00000000000..c764af984d9 --- /dev/null +++ b/gnu/dist/diffutils/po/pl.po @@ -0,0 +1,930 @@ +# Polish translations for the GNU diffutils messages +# Copyright (C) 1996, 2002 Free Software Foundation, Inc. +# Rafa³ Maszkowski <rzm@icm.edu.pl>, 1996, 2002. +# corrections: Pawe³ Krawczyk <kravietz@pipeta.chemia.pk.edu.pl>, 1996 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-12 15:00+0100\n" +"Last-Translator: Rafa³ Maszkowski <rzm@icm.edu.pl>\n" +"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8-bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "b³±d programu" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "przepe³nienie stosu" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Niezany b³±d systemu" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Autorzy nie daj± ¯ADNYCH gwarancji, do granic, na które zezwala prawo.\n" +"Program mo¿e byæ rozpowszechniany na warunkach Ogólnej Licencji Publicznej\n" +"GNU; szczególy s± opisane w pliku COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcja `%s' is ambiguous\n" + +#: lib/getopt.c:718 +#, 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:723 +#, 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:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opcja `%s' wymaga argumentu\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: nierozpoznana opcja `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: unrecognized option `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nielegalna opcja -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: b³êdna opcja -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcja wymaga argumentu -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcja `-W %s' jest niejednoznaczna\n" + +#: lib/getopt.c:898 +#, 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/regex.c:1367 +msgid "Success" +msgstr "Powodzenie" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Nie pasuje" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Z³e wyra¿enie regularne" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Zly znak zbiorczy" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Z³a nazwa klasy znaków" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Koñcowy uko¶nik odwrotny" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Z³y odno¶nik wstecz" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Nie sparowany [ lub [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Nie sparowany ( lub \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Nie sparowany \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Z³a zawarto¶æ \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Z³y koniec zakresu" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Brak pamiêci" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Z³e poprzedzj±ce wyra¿enie regularne" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Przedwczesny koniec wyra¿enia regularnego" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Wyra¿enia regularne jest za du¿e" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Nie sparowany ) lub \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Brak porzedniego wyra¿enia regularnego" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "brak pamiêci" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Pliki %s i %s ró¿ni± siê\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Pliki binarne %s i %s siê ró¿ni±\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Brak znaku nowej linii na koñcu pliku" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Napisany przez Torbjorna Gralunda i Davida MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Napisz `%s --help' ¿eby dowiedzieæ siê wiêcej." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "b³êdna warto¶æ --ignore-initial `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "sprzeczne opcje -l i -s" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "zapis nieudany" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "standardowe wyj¶cie" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-chars Wypisanie ró¿ni±cych siê bajtów." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i OMIÑ --ignore-initial=OMIÑ PRzeskoczenie pierwszych OMIÑ bajtów." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SKOK1:SKOK2--ignore-initial=SKOK1:SKOK2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr " Przeskoczenie pierwszych SKOK1 bajtów PLIKU1 i SKOK2 bajtów PLIKU2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" +"-I --verbose Wypisanie po³o¿eñ i kodów wszystkich ró¿ni±cych siê bajtów." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT Porównanie najwy¿ej LIMIT bajtów." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" +"-s --quiet --silnet Bez wypisania wyników; tylko przekazanie statusu." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Wypisanie informacji o wersji." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Wypisanie tego helpu." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "U¿ycie: %s [OPCJA]... PLIK1 [PLIK2 [SKOK1 [SKOK2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Porównanie plików bajt po bajcie." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "SKOK1 i SKOK2 to liczby bajtów do pominiêcia w ka¿dym z plików." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"Po warto¶ci SKOKU mog± byæ dodane nastêpuj±ce przyrostki:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, i tak dalej dla T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Je¿eli PLIK to `-' lub go brak, czytane jest standardowe wej¶cie." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "Inofmracje o b³êdach: bug-gnu-utils@gnu.org ." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "b³êdna warto¶æ --bytes `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "brakuj±cy argument po `%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "nadmiarowy argument `%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s ró¿ni± siê: bajt %s, linia %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s ró¿ni± siê: bajt %s, linia %s zawiera %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF przy %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Napisany przez Paula Eggerta, Mike'a Haertela, Davida Hayesa,\n" +"Richarda Stallmana i Lena Towera." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "b³êdna d³ugo¶æ kontekstu `%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "stronicowanie nie jest mo¿liwe na tej maszynie" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "za du¿o opcji etykietowania plików" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "b³êdna szeroko¶æ `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "sprzeczne opcje szeroko¶ci" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "b³êdna d³ugo¶æ horyzontu `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "opcja `-%ld' jest przestarza³a, u¿yj `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "opcja `-%ld' jest przestarza³a, opu¶æ j±" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "równocze¶nie podane --from-file i --to-file" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Porównanie plików kolejnymi liniami." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case Ignorowanie ró¿nic miêdzy wielkimi i ma³ymi literami." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-space-change Zignorowanie wielko¶ci liter przy porównywaniu\n" +" nazw plików." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Uwzglêdnianie wielko¶ci liter przy porównywaniu\n" +" nazw plików." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Zignorowanie zmian spowodowanych rozwiniêciem\n" +" TABów." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Zignorowanie zmian ilo¶ci znaków odstêpu." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Zignorowanie znaków odstêpu." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines Zignorowanie zmian ilo¶ci pustych linii." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE Zignorowanie zmian w liniach pasuj±cych\n" +" do RE." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Pominiêcie znaków nowej linii na wej¶ciu." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Czytanie i zapisywanie danych binarnie." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Traktowanie plików jako tekstowych." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C ILE --context[=ILE] Skopiowanie ILE (domy¶lnie 2) linii kontekstu.\n" +"-u -U ILE --unified[=ILE] ILE (domy¶lnie 2) linii zunifikowanego " +"kontekstu.\n" +" --label ETYKIETA U¿ycie ETYKIETY zamiast nazwy pilku.\n" +" -p --show-c-function Wskazanie funkcji C, w których s± zmiany.\n" +" -F RE --show-function-line=RE Pokazanie ostatniej linii pasuj±cej do RE." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Wypisanie wyniku tylko gdy pliki siê ró¿ni±." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Wynik w postaci komend ed-a" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Wynik w postaci zwyk³ego diff-a." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Wynik w postaci diff-a z RCS." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Wynik w dwóch kolumnach.\n" +" -W ILE --width=ILE Wypisanie najwy¿ej ILE (domy¶nie 130) znaków w " +"linii.\n" +" --left-column Wypisanie tylko lewej kolumny dla wspólnych linii.\n" +" --suppress-common-lines Bez wypisywania wspólnych linii." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NAZWA --ifdef=NAZWA Wypisanie po³±czonego pliu dla pokazania ró¿nic\n" +" w `#ifdef NAZWA'." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--TYPG-group-format=GFMT Podobnie, ale z u¿yciem GFMT do sformatowania " +"grup\n" +" wej¶ciowych type TYPG" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LFMT Podobnie, ale z u¿yciem LFMT do sformatowania linii\n" +" wej¶ciowych." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--TYPL-group-format=LFMT Podobnie, ale z u¿yciem LFMT do sformatowania " +"grup\n" +" wej¶ciowych typu TYPL" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "TYPL to `old', `news' lub `unchanged'. TYPG to TYPL lub `changed'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT mo¿e zawieraæ:\n" +" %< linie z PLIKU1\n" +" %> linie z PLIKU2\n" +" %= linie wspólne dla PLIKU1 i PLIKU2\n" +" %[-][SZER][.[DOK£]]{doxX}LITERA specyfikacja w stylu printf dla LITERY\n" +" LITERY s± nastêpuj±ce dla nowej grupy (ma³e dla starej grupy):\n" +" F numer pierwszej linii\n" +" L numer ostatniej linii\n" +" N ilo¶æ linii = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT mo¿e zawieraæ:\n" +" %L zawarto¶æ linii\n" +" %l zawarto¶c linii, z wy³±czeniem znaku nowej linii\n" +" %[-][SZER][.[DOK£]]{doxX}n specyfikacjê numeru linii w stylu printf" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GFMT i LFMT mog± zawieraæ:\n" +" %% %\n" +" %c'C' pojedyñczy znak C\n" +" %c'\\OOO' znak o kodzie ósemkowym OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-I --paginate Przepuszczenie wyniku przez `pr' ¿eby go stronnicowaæ." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Rozwiniêcie TABów w spacje w wyniku." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab Wyrównanie linii przez u¿ycie TABów." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Porównanie podkatalogów rekurencyjnie." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Traktowanie brakuj±cych plików jak pustych." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file Traktowanie brakuj±cych pierwszych plików\n" +" w pierwszym zestawie jako pustych." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +"-s --report-identical-files Informowanie gdy dwa pliki s± takie same." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x WZÓR --exclude=WZÓR Wykluczenie plików pasuj±cych do WZORu." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X PLIK --exclude-from=PLIK Pominiêcie plików pasuj±cych do wzorców w " +"PLIKu." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S PLIK --starting-file=PLIK Zacznij od PLIKu przy porównywaniu katalogów." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=PLIK1 Porównanie PLIKU1 z wszystkimi argumentami.\n" +" PLIK1 mo¿e byæ katalogiem." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=PLIK2 Porównanie wszystkich argumentów z PLIKIEM2.\n" +" PLIK2 mo¿e byæ katalogiem." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=ILE Zostawienie ILE linii wspólnego przedrostka i " +"przyrostka." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Usi³owanie znalezienia mniejszego zbioru zmian." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "--speed-large-files Du¿e pliki i rozrzucone ma³e zmiany." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"PLIKI to `PLIK1 PLIK2' albo `KATALOG1 KATALOG2' albo `KATALOG PLIK...' albo\n" +"PLIK... KATALOG'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Je¿eli u¿yta jest opcja --from-file albo --to-file, nie ma ograniczeñ co do\n" +"PLIKÓW." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Je¿eli PLIK to `-', czytane jest standardowe wej¶cie." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "U¿ycie: %s [OPCJA]... PLIKI\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "sprzeczna warto¶æ opcji %s: `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "sprzeczne opcje stylu wyniku" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "zwyk³y pusty plik" + +#: src/diff.c:976 +msgid "regular file" +msgstr "zwyk³y plik" + +#: src/diff.c:978 +msgid "directory" +msgstr "katalog" + +#: src/diff.c:981 +msgid "block special file" +msgstr "specjalny plik blokowy" + +#: src/diff.c:984 +msgid "character special file" +msgstr "specjalny plik znakowy" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "gniazdo" + +#: src/diff.c:994 +msgid "message queue" +msgstr "kolejka komunikatów" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semafor" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "obiekt w pamiêci dzielonej" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "obiekt w pamiêci z okre¶leniem typu" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "dziwny plik" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Tylko w %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "nie mo¿na porównaæ `-' z katalogiem" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D opcja nie dzia³a dla katalogów" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Wspólne podkatalogi: %s i %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Plik %s jest %s, podczas gdy plik %s jest %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Pliki %s i %s s± identyczne\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Napisany przez Randiego Smitha." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "niezgodne opcje" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "`-' podany dla wiêcej ni¿ jednego pliku wej¶ciowego" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "nieudany odczyt" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Wypisanie niez³±czonych zmian miêdzy STARY_PLIK a NOWY_PLIK do\n" +" MÓJ_PLIK." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Wypisanie niez³±czonych zmian, konflikty w nawiasach." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Wypisanie wszystkich zmian, konflikty w nawiasach." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Wypisanie nachodz±cych zmian." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Wypisanie nachodz±cych zmian w nawiasach." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Wypisanie niez³±czonych nienachodz±cych zmian." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m -merge Wypisanie po³±czonych plików zamiast komend ed-a (domy¶lnie -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ETYKIETA --label=ETYKIETA U¿ycie ETYKIETY zamiast nazwy pliku." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Dodanie komendy `w' i `q' do komend ed-a." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM U¿ycie PROGRAMU do porównania plików." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "U¿ycie: %s [OPCJA]... MÓJ_PLIK STARY_PLIK TWÓJ_PLIK\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Porównanie trzech plików linia po linii." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "b³ad wewnêtrzny: spieprzony format bloków diff" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff nie zadzia³a³: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "b³±d wewnêtrzny: b³êdny typ diff w process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "b³êdny format diff; b³êdny separator zmian" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "b³êdny format diff; niekompletna ostatnia linia" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "program pomocniczy `%s' nie jest wykonywalny" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "nie znaleziono programu pomocniczego `%s'" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "nie zadzia³a³ program pomocniczy `%s'" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "b³êdny format diff; nieprawid³owe znaki na pocz±tku linii" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "b³±d wenwêtrzny: b³êdny typ diff-a przekazany na wyj¶cie" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "plik wej¶ciowy siê zmiejszy³" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "nie mo¿na porównaæ nazw plików `%s' i `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Napisany przez Thomasa Lorda." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o PLIK --output=PLIK Tryb interakcyjny, wyniki wysy³ane do PLIKu." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Traktowanie ma³ych i wielkich liter tak samo." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignorowanie wszystkich znaków odstêpu." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w ILE --width=ILE Wypisanie najwy¿ej ILE (domy¶nie 130) znaków w linii." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-I --left-column Wypisanie tylko lewej kolumny dla wspólnych linii." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Bez wypisania wspólnych linii." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "-H --speed-large-files Du¿e pliki i rozrzucone ma³e zmiany." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "U¿ycie: %s [OPCJA]... PLIK1 PLIK2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Interaktywne po³±czenie plików." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "nie mogê interakcyjnie ³±czyæ standardowego wej¶cia" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "oba maj±ce byæ porównane pliki to katalogi" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tEdycja i u¿ycie obu wersji, ka¿dej z nag³ówkiem.\n" +"eb:\tEdycja i u¿ycie obu wersji.\n" +"el:\tiU¿ycie wersji po lewej.\n" +"er:\tEdycja i u¿ycie wersji po prawej.\n" +"e:\tEdycja nowej wersji.\n" +"l:\tU¿ycie wersji po lewej.\n" +"r:\tU¿ycie wersji po prawej.\n" +"s:\tDo³±czenie wspólnych linii bez informoawania o tym.\n" +"v:\tDo³±czenie wspólnych linii z podaniem informacji.\n" +"q:\tZakoñczenie.\n" diff --git a/gnu/dist/diffutils/po/quot.sed b/gnu/dist/diffutils/po/quot.sed new file mode 100644 index 00000000000..0122c46318d --- /dev/null +++ b/gnu/dist/diffutils/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/gnu/dist/diffutils/po/remove-potcdate.sin b/gnu/dist/diffutils/po/remove-potcdate.sin new file mode 100644 index 00000000000..2436c49e786 --- /dev/null +++ b/gnu/dist/diffutils/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/gnu/dist/diffutils/po/ru.gmo b/gnu/dist/diffutils/po/ru.gmo Binary files differnew file mode 100644 index 00000000000..3c67e6d2a83 --- /dev/null +++ b/gnu/dist/diffutils/po/ru.gmo diff --git a/gnu/dist/diffutils/po/ru.po b/gnu/dist/diffutils/po/ru.po new file mode 100644 index 00000000000..d76daabb28f --- /dev/null +++ b/gnu/dist/diffutils/po/ru.po @@ -0,0 +1,942 @@ +# ðÅÒÅ×ÏÄ ÓÏÏÂÝÅÎÉÊ diffutils +# Copyright (C) 1998 Free Software Foundation, Inc. +# Oleg S. Tihonov <tihonov@ffke-campus.mipt.ru>, 1998, 2001, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.8\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-04-03 14:06+0400\n" +"Last-Translator: Oleg S. Tihonov <tihonov@ffke-campus.mipt.ru>\n" +"Language-Team: Russian <ru@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8-r\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "ÐÅÒÅÐÏÌÎÅÎÉÅ ÓÔÅËÁ" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÓÉÓÔÅÍÎÁÑ ÏÛÉÂËÁ" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Copyright (C) %s Free Software Foundation, Inc.\n" +"íÙ îå ÐÒÅÄÏÓÔÁ×ÌÑÅÍ ÇÁÒÁÎÔÉÊ, × ÔÏÊ ÍÅÒÅ, ËÏÔÏÒÁÑ ÄÏÐÕÓÔÉÍÁ ÚÁËÏÎÏÍ.\n" +"÷Ù ÍÏÖÅÔÅ ÒÁÓÐÒÏÓÔÒÁÎÑÔØ ÜÔÉ ÐÒÏÇÒÁÍÍÙ ÐÒÉ ÓÏÂÌÀÄÅÎÉÉ\n" +"ÕÓÌÏ×ÉÊ õÎÉ×ÅÒÓÁÌØÎÏÊ ïÂÝÅÓÔ×ÅÎÎÏÊ ìÉÃÅÎÚÉÉ GNU.\n" +"äÌÑ ÐÏÌÕÞÅÎÉÑ ÐÏÄÒÏÂÎÏÊ ÉÎÆÏÒÍÁÃÉÉ Ï ×ÏÚÍÏÖÎÏÓÔÉ ÒÁÓÐÒÏÓÔÒÁÎÅÎÉÑ ÓÍÏÔÒÉÔÅ\n" +"ÆÁÊÌ COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ÎÅÏÄÎÏÚÎÁÞÎÙÊ ËÌÀÞ `%s'\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `--%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `%c%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ËÌÀÞ `%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ c ÁÒÇÕÍÅÎÔÏÍ\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ËÌÀÞ `--%s'\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ËÌÀÞ `%c%s'\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÙÊ ËÌÀÞ -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ÎÅ×ÅÒÎÙÊ ËÌÀÞ -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ËÌÀÞ %c ÄÏÌÖÅÎ ÂÙ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ c ÁÒÇÕÍÅÎÔÏÍ\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ÎÅÏÄÎÏÚÎÁÞÎÙÊ ËÌÀÞ `-W %s'\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `-W %s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "õÓÐÅÈ" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "óÏ×ÐÁÄÅÎÉÊ ÎÅÔ" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "îÅ×ÅÒÎÏÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "îÅÄÏÐÕÓÔÉÍÙÊ ÄÌÑ ÓÏÒÔÉÒÏ×ËÉ ÓÉÍ×ÏÌ" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "îÅ×ÅÒÎÏÅ ÉÍÑ ËÌÁÓÓÁ ÓÉÍ×ÏÌÁ" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "ïÂÒÁÔÎÁÑ ËÏÓÁÑ ÞÅÒÔÁ ÓÔÏÉÔ ÐÏÓÌÅÄÎÅÊ" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "îÅ×ÅÒÎÁÑ ÓÓÙÌËÁ" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "îÅÐÁÒÎÁÑ [ ÉÌÉ [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "îÅÐÁÒÎÁÑ ( ÉÌÉ \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "îÅÐÁÒÎÁÑ \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "îÅ×ÅÒÎÏÅ ÓÏÄÅÒÖÉÍÏÅ \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "îÅ×ÅÒÎÙÊ ÎÉÖÎÉÊ ÐÒÅÄÅÌ" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "ïÐÅÒÁÔÉ×ÎÁÑ ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "îÅ×ÅÒÎÏÅ ÐÒÅÄÛÅÓÔ×ÕÀÝÅÅ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "ðÒÅÖÄÅ×ÒÅÍÅÎÎÙÊ ËÏÎÅà ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "òÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ ÓÌÉÛËÏÍ ×ÅÌÉËÏ" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "îÅÐÁÒÎÁÑ ) ÉÌÉ \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "òÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ ÎÅ ÂÙÌÏ ÚÁÄÁÎÏ ÒÁÎØÛÅ" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "æÁÊÌÙ %s É %s ÒÁÚÌÉÞÁÀÔÓÑ\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "ä×ÏÉÞÎÙÅ ÆÁÊÌÙ %s É %s ÒÁÚÌÉÞÁÀÔÓÑ\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "÷ ËÏÎÃÅ ÆÁÊÌÁ ÎÅÔ ÎÏ×ÏÊ ÓÔÒÏËÉ" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "á×ÔÏÒÙ Torbjorn Granlund É David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "ðÏÐÒÏÂÕÊÔÅ `%s --help' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ --ignore-initial `%s'" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "ËÌÀÞÉ -l É -s ÎÅÓÏ×ÍÅÓÔÉÍÙ" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "ÚÁÐÉÓØ ÎÅÕÓÐÅÛÎÁ" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes ÷Ù×ÏÄÉÔØ ÒÁÚÌÉÞÁÀÝÉÅÓÑ ÂÁÊÔÙ." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i î --ignore-initial=î éÇÎÏÒÉÒÏ×ÁÔØ ÒÁÚÌÉÞÉÑ × ÐÅÒ×ÙÈ î ÂÁÊÔÁÈ ××ÏÄÁ." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i î1:î2 --ignore-initial=î1:î2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "ðÒÏÐÕÓÔÉÔØ ÐÅÒ×ÙÅ î1 ÂÁÊÔ ÆÁÊÌÁ æáêì1 É ÐÅÒ×ÙÅ î2 ÂÁÊÔ ÆÁÊÌÁ æáêì2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose ÷Ù×ÏÄÉÔØ ÎÏÍÅÒÁ É ÚÎÁÞÅÎÉÑ ×ÓÅÈ ÒÁÚÌÉÞÁÀÝÉÈÓÑ ÂÁÊÔ." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n ðòåäåì --bytes=ðòåäåì óÒÁ×ÎÉ×ÁÔØ ÎÅ ÂÏÌÅÅ ÕËÁÚÁÎÎÏÇÏ ÞÉÓÌÁ ÂÁÊÔ." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" +"-s --quiet --silent îÅ ×Ù×ÏÄÉÔØ, ÔÏÌØËÏ ÓÏÏÂÝÉÔØ ×ÏÚ×ÒÁÝÁÅÍÏÅ ÚÎÁÞÅÎÉÅ." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version ðÏËÁÚÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ É ×ÙÊÔÉ." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help ðÏËÁÚÁÔØ ÜÔÕ ÓÐÒÁ×ËÕ É ×ÙÊÔÉ." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ëìàþ]... æáêì1 [æáêì2 [î1 [î2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "ðÏÂÁÊÔÏ×Ï ÓÒÁ×ÎÉ×ÁÅÔ Ä×Á ÆÁÊÌÁ." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "î1 É î2 -- ÜÔÏ ÞÉÓÌÏ ÂÁÊÔ, ËÏÔÏÒÙÅ ÓÌÅÄÕÅÔ ÐÒÏÐÕÓÔÉÔØ × ËÁÖÄÏÍ ÆÁÊÌÅ." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"ë ÚÎÁÞÅÎÉÑÍ î ÍÏÖÎÏ ÐÒÉÐÉÓÙ×ÁÔØ ÏÄÉÎ ÉÚ ÓÌÅÄÕÀÝÉÈ ÍÎÏÖÉÔÅÌØÎÙÈ ÓÕÆÆÉËÓÏ×:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, É ÔÁË ÄÁÌÅÅ ÄÌÑ T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "åÓÌÉ æáêì ÎÅ ÚÁÄÁÎ ÉÌÉ ÚÁÄÁÎ ËÁË `-', ÞÉÔÁÅÔ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "ï ÏÛÉÂËÁÈ ÓÏÏÂÝÁÊÔÅ <bug-gnu-utils@gnu.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ --bytes `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "ÐÒÏÐÕÝÅÎ ÏÐÅÒÁÎÄ ÐÏÓÌÅ `%s'" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "ÉÚÌÉÛÎÉÊ ÏÐÅÒÁÎÄ `%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s ÒÁÚÌÉÞÁÀÔÓÑ: ÂÁÊÔ %s, ÓÔÒÏËÁ %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s ÒÁÚÌÉÞÁÀÔÓÑ: ÂÁÊÔ %s, ÓÔÒÏËÁ %s ÒÁ×ÅÎ %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: ËÏÎÅÊ ÆÁÊÌÁ × %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"á×ÔÏÒÙ Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, É Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ÄÌÉÎÁ ËÏÎÔÅËÓÔÁ `%s'" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "ÒÁÚÂÉÅÎÉÅ ÎÁ ÓÔÒÁÎÉÃÙ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÎÁ ÄÁÎÎÏÊ ÍÁÛÉÎÅ" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ËÌÀÞÅÊ ÚÁÄÁÀÝÉÈ ÍÅÔËÉ ÆÁÊÌÏ×" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ÛÉÒÉÎÁ `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÙÅ ËÌÀÞÉ ÚÁÄÁÎÉÑ ÛÉÒÉÎÙ" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ÄÌÉÎÁ ÇÏÒÉÚÏÎÔÁ `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "ËÌÀÞ `-%ld' ÕÓÔÁÒÅÌ; ÉÓÐÏÌØÚÕÊÔÅ `-%c %ld'" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "ËÌÀÞ `-%ld' ÕÓÔÁÒÅÌ; ÏÐÕÓËÁÊÔÅ ÅÇÏ" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "ÎÅÏÂÈÏÄÉÍÏ ÚÁÄÁÔØ ËÁË --from-file, ÔÁË É --to-file" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "ðÏÓÔÒÏÞÎÏ ÓÒÁ×ÎÉ×ÁÅÔ Ä×Á ÆÁÊÌÁ." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case éÇÎÏÒÉÒÏ×ÁÔØ ÒÅÇÉÓÔÒ ÂÕË× × ÓÏÄÅÒÖÉÍÏÍ ÆÁÊÌÏ×." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case éÇÎÏÒÉÒÏ×ÁÔØ ÒÅÇÉÓÔÒ ÂÕË× × ÉÍÅÎÁÈ ÆÁÊÌÏ×." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "--no-ignore-file-name-case õÞÉÔÙ×ÁÔØ ÒÅÇÉÓÔÒ ÂÕË× × ÉÍÅÎÁÈ ÆÁÊÌÏ×." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion éÇÎÏÒÉÒÏ×ÁÔØ ÉÚÍÅÎÅÎÉÑ, ×ÙÚ×ÁÎÎÙÅ ÒÁÓËÒÙÔÉÅÍ " +"ÔÁÂÕÌÑÃÉÉ." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" +"-b --ignore-space-change éÇÎÏÒÉÒÏ×ÁÔØ ÉÚÍÅÎÅÎÉÑ ÞÉÓÌÁ ÐÒÏÂÅÌØÎÙÈ ÓÉÍ×ÏÌÏ×." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space éÇÎÏÒÉÒÏ×ÁÔØ ×ÓÅ ÐÒÏÂÅÌØÎÙÅ ÓÉÍ×ÏÌÙ." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines éÇÎÏÒÉÒÏ×ÁÔØ ÉÚÍÅÎÅÎÉÑ ÞÉÓÌÁ ÐÕÓÔÙÈ ÓÔÒÏË." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I ò÷ --ignore-matching-lines=ò÷ éÇÎÏÒÉÒÏ×ÁÔØ ÉÚÍÅÎÅÎÉÑ, ÓÔÒÏËÉ ËÏÔÏÒÙÈ\n" +" ÐÏÌÎÏÓÔØÀ ÓÏÏÔ×ÅÔÓÔ×ÕÀÔ ÚÁÄÁÎÎÏÍÕ ÒÅÇÕÌÑÒÎÏÍÕ " +"×ÙÒÁÖÅÎÉÀ" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr õÄÁÌÉÔØ ÎÁ ×Ù×ÏÄÅ ÚÁ×ÅÒÛÁÀÝÉÊ ×ÏÚ×ÒÁÔ ËÁÒÅÔËÉ." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary þÉÔÁÔØ É ÚÁÐÉÓÙ×ÁÔØ ÆÁÊÌÙ × Ä×ÏÉÞÎÏÊ ÆÏÒÍÅ." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text óÞÉÔÁÔØ ×ÓÅ ÆÁÊÌÙ ÔÅËÓÔÏ×ÙÍÉ." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C þéóìï --context[=þéóìï] ëÏÐÉÒÏ×ÁÔØ þéóìï (ÐÏ ÕÍÏÌÞÁÎÉÀ 3) ÓÔÒÏË " +"ËÏÎÔÅËÓÔÁ.\n" +"-u -U þéóìï --unified[=þéóìï] ÷Ù×ÏÄÉÔØ þéóìï (ÐÏ ÕÍÏÌÞÁÎÉÀ 3) ÓÔÒÏË\n" +" ÏÂßÅÄÉÎÅÎÎÏÇÏ ËÏÎÔÅËÓÔÁ.\n" +" -L íåôëá --label íåôëá éÓÐÏÌØÚÏ×ÁÔØ íåôëõ ×ÍÅÓÔÏ ÉÍÅÎÉ ÆÁÊÌÁ.\n" +" -p --show-c-function ðÏËÁÚÙ×ÁÔØ C-ÆÕÎËÃÉÀ, ÓÏÄÅÒÖÁÝÕÀ ÉÚÍÅÎÅÎÉÅ.\n" +" -F ò÷ --show-function-line=ò÷ ðÏËÁÚÙ×ÁÔØ ÐÒÅÄÛÅÓÔ×ÕÀÝÕÀ ÓÔÒÏËÕ, " +"ÓÏ×ÐÁÄÁÀÝÕÀ\n" +" Ó ÚÁÄÁÎÎÙÍ ÒÅÇÕÌÑÒÎÙÍ ×ÙÒÁÖÅÎÉÅÍ." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief îÁÐÅÞÁÔÁÔØ ÔÏÌØËÏ ÒÁÚÌÉÞÁÀÔÓÑ ÌÉ ÆÁÊÌÙ." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed ÷Ù×ÏÄÉÔØ ÓÃÅÎÁÒÉÊ ed." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal ÷Ù×ÏÄÉÔØ × ÏÂÙÞÎÏÍ ÆÏÒÍÁÔÅ diff." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs ÷Ù×ÏÄÉÔØ × ÆÏÒÍÁÔÅ RCS." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side ÷Ù×ÏÄÉÔØ × Ä×Å ËÏÌÏÎËÉ.\n" +" -W þéóìï --width=þéóìï ÷Ù×ÏÄÉÔØ ÍÁËÓÉÍÕÍ ÚÁÄÁÎÎÏÅ þéóìï ÚÎÁËÏ× × " +"ÓÔÒÏËÅ.\n" +" (ÐÏ ÕÍÏÌÞÁÎÉÀ 130)\n" +" --left-column ÷Ù×ÏÄÉÔØ ÔÏÌØËÏ ÌÅ×ÕÀ ËÏÌÏÎËÕ ÏÂÝÉÈ ÓÔÒÏË.\n" +" --suppress-common-lines îÅ ×Ù×ÏÄÉÔØ ÏÂÝÉÅ ÓÔÒÏËÉ." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D éíñ --ifdef=éíñ ÷Ù×ÏÄÉÔØ ÚÁÐÌÁÔÙ, ÉÓÐÏÌØÚÕÀÝÉÅ ËÏÎÓÔÒÕËÃÉÀ `#ifdef éíñ'." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--çôéð-group-format=çæíô áÎÁÌÏÇÉÞÎÏ, ÎÏ ÆÏÒÍÁÔÉÒÏ×ÁÔØ ×ÈÏÄÎÙÅ ÇÒÕÐÐÙ ÔÉÐÁ " +"çôéð\n" +" × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÆÏÒÍÁÔÏÍ çæíô." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=óæíô áÎÁÌÏÇÉÞÎÏ, ÎÏ ÆÏÒÍÁÔÉÒÏ×ÁÔØ ×ÓÅ ×ÈÏÄÎÙÅ ÓÔÒÏËÉ Ó óæíô." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--óôéð-group-format=óæíô áÎÁÌÏÇÉÞÎÏ, ÎÏ ÆÏÒÍÁÔÉÒÏ×ÁÔØ ×ÈÏÄÎÙÅ ÓÔÒÏËÉ ÔÉÐÁ " +"óôéð\n" +" × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÆÏÒÍÁÔÏÍ óæíô." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" óôéð ÍÏÖÅÔ ÂÙÔØ `old', `new', ÉÌÉ `unchanged', çôéð -- ÔÏ ÖÅ É `changed'." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" çæíô ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ:\n" +" %< ÓÔÒÏËÉ ÉÚ æáêìá1\n" +" %> ÓÔÒÏËÉ ÉÚ æáêìá2\n" +" %= ÓÔÒÏËÉ, ÏÂÝÉÅ ÄÌÑ æáêìá1 É æáêìá2\n" +" %[-][ûéòéîá][.[ôïþî]]{doxX}âõë÷á ÆÏÒÍÁÔ ÄÌÑ âõë÷ù × ÓÔÉÌÅ printf\n" +" âõë÷á ÐÒÉÎÉÍÁÅÔ ÓÌÅÄÕÀÝÉÅ ÚÎÁÞÅÎÉÑ ÄÌÑ ÎÏ×ÙÈ ÇÒÕÐÐ, ÄÌÑ ÓÔÁÒÙÈ " +"ÓÔÒÏÞÎÙÅ:\n" +" F ÎÏÍÅÒ ÐÅÒ×ÏÊ ÓÔÒÏËÉ\n" +" L ÎÏÍÅÒ ÐÏÓÌÅÄÎÅÊ ÓÔÒÏËÉ\n" +" N ÞÉÓÌÏ ÓÔÒÏË = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" óæíô ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ:\n" +" %L ÓÏÄÅÒÖÉÍÏÅ ÓÔÒÏËÉ\n" +" %l ÓÏÄÅÒÖÉÍÏÅ ÓÔÒÏËÉ, ÉÓËÌÀÞÁÑ ×ÓÅ ÎÏ×ÙÅ ÓÔÒÏËÉ × ËÏÎÃÅ\n" +" %[-][ûéòéîá][.[ôïþî]]{doxX}n ÆÏÒÍÁÔ ÎÏÍÅÒÁ ×ÈÏÄÎÏÊ ÓÔÒÏËÉ × ÓÔÉÌÅ printf" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" ïÂÁ çæíô É óæíô ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ:\n" +" %% %\n" +" %c'ó' ÏÄÉÎ ÓÉÍ×ÏÌ ó\n" +" %c'\\OOO' ÏÄÉÎ ÓÉÍ×ÏÌ Ó ×ÏÓØÍÅÒÉÞÎÙÍ ËÏÄÏÍ OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "" +"-l --paginate îÁÐÒÁ×ÉÔØ ×Ù×ÏÄ ÐÒÏÇÒÁÍÍÅ `pr' ÄÌÑ ÒÁÚÂÉÅÎÉÑ ÎÁ ÓÔÒÁÎÉÃÙ." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs òÁÓËÒÙ×ÁÔØ ÐÒÉ ×Ù×ÏÄÅ ÓÉÍ×ÏÌÙ ÔÁÂÕÌÑÃÉÉ × ÐÒÏÂÅÌÙ." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab ÷ÙÒÁ×ÎÉ×ÁÔØ ÔÁÂÕÌÑÃÉÀ ÄÏÂÁ×ÌÑÑ × ÎÁÞÁÌÏ ÓÉÍ×ÏÌ ÔÁÂÕÌÑÃÉÉ." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive òÅËÕÒÓÉ×ÎÏ ÓÒÁ×ÎÉ×ÁÔØ ÐÏÄËÁÔÁÌÏÇÉ." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file ÷ÏÓÐÒÉÎÉÍÁÔØ ÎÅÓÕÝÅÓÔ×ÕÀÝÉÅ ÆÁÊÌÙ ËÁË ÐÕÓÔÙÅ." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "" +"--unidirectional-new-file ÷ÏÓÐÒÉÎÉÍÁÔØ ÎÅÓÕÝÅÓÔ×ÕÀÝÉÅ ÐÅÒ×ÙÅ ÆÁÊÌÙ ËÁË " +"ÐÕÓÔÙÅ." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files óÏÏÂÝÁÔØ Ï ÏÄÉÎÁËÏ×ÙÈ ÆÁÊÌÁÈ." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "" +"-x ïâòáúåã --exclude=ïâòáúåã éÓËÌÀÞÉÔØ ÆÁÊÌÙ, ÞØÉ ÉÍÅÎÁ ÓÏ×ÐÁÄÁÀÔ Ó " +"ïâòáúãïí." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X æáêì --exclude-from=æáêì éÓËÌÀÞÉÔØ ÆÁÊÌÙ, ÞØÉ ÉÍÅÎÁ ÓÏ×ÐÁÄÁÀÔ Ó ËÁËÉÍ-" +"ÌÉÂÏ\n" +" ÏÂÒÁÚÃÏÍ ÉÚ ÚÁÐÉÓÁÎÎÙÈ × æáêìå." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "-S æáêì --starting-file=æáêì ðÒÉ ÓÒÁ×ÎÅÎÉÉ ËÁÔÁÌÏÇÏ× ÎÁÞÁÔØ Ó æáêìá." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=æáêì1 óÒÁ×ÎÉÔØ æáêì1 ÓÏ ×ÓÅÍÉ ÏÐÅÒÁÎÄÁÍÉ.\n" +" æáêì1 ÍÏÖÅÔ ÂÙÔØ ËÁÔÁÌÏÇÏÍ." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=æáêì2 óÒÁ×ÎÉÔØ ×ÓÅ ÏÐÅÒÁÎÄÙ Ó æáêìïí2. æáêì2 ÍÏÖÅÔ ÂÙÔØ " +"ËÁÔÁÌÏÇÏÍ." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=þéóìï ÷Ù×ÏÄÉÔØ þéóìï ÏÂÝÉÈ ÓÔÒÏË ÄÏ É ÐÏÓÌÅ ÒÁÚÌÉÞÁÀÝÉÈÓÑ." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal ðÙÔÁÔØÓÑ ÎÁÊÔÉ ÎÁÉÍÅÎØÛÉÊ ÎÁÂÏÒ ÉÚÍÅÎÅÎÉÊ." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ÆÁÊÌÙ ÂÏÌØÛÉÅ ÓÏ ÍÎÏÇÉÍÉ\n" +" ÒÁÚÂÒÏÓÁÎÎÙÍÉ ÍÅÌËÉÍÉ ÉÚÍÅÎÅÎÉÑÍÉ." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"æáêìù ÜÔÏ `æáêì1 æáêì2', ÉÌÉ `ëáôáìïç1 ëáôáìïç2', ÉÌÉ `ëáôáìïç æáêì...',\n" +"ÉÌÉ `æáêì... ëáôáìïç'." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "åÓÌÉ ÚÁÄÁÎ --from-file ÉÌÉ --to-file, ÎÁ æáêìù ÎÅÔ ÏÇÒÁÎÉÞÅÎÉÊ." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "åÓÌÉ æáêì ÚÁÄÁÎ ËÁË `-', ÞÉÔÁÅÔ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ëìàþ]... æáêìù\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÏÅ ÚÎÁÞÅÎÉÅ %s ÄÌÑ ËÌÀÞÁ `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÙÅ ËÌÀÞÉ ÚÁÄÁÎÉÑ ÓÔÉÌÑ ×Ù×ÏÄÁ" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "ÏÂÙÞÎÙÊ ÐÕÓÔÏÊ ÆÁÊÌ" + +#: src/diff.c:976 +msgid "regular file" +msgstr "ÏÂÙÞÎÙÊ ÆÁÊÌ" + +#: src/diff.c:978 +msgid "directory" +msgstr "ËÁÔÁÌÏÇ" + +#: src/diff.c:981 +msgid "block special file" +msgstr "ÓÐÅÃÉÁÌØÎÙÊ ÆÁÊÌ Ó ÐÏÂÌÏÞÎÙÍ ÄÏÓÔÕÐÏÍ" + +#: src/diff.c:984 +msgid "character special file" +msgstr "ÓÐÅÃÉÁÌØÎÙÊ ÆÁÊÌ Ó ÐÏÓÉÍ×ÏÌØÎÙÍ ÄÏÓÔÕÐÏÍ" + +#: src/diff.c:987 +msgid "fifo" +msgstr "ÏÞÅÒÅÄØ" + +#: src/diff.c:991 +msgid "socket" +msgstr "ÓÏËÅÔ" + +#: src/diff.c:994 +msgid "message queue" +msgstr "ÏÞÅÒÅÄØ ÓÏÏÂÝÅÎÉÊ" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "ÓÅÍÁÆÏÒ" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "ÒÁÚÄÅÌÑÅÍÙÊ ÏÂßÅËÔ" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "ÓÔÒÁÎÎÙÊ ÆÁÊÌ" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "ôÏÌØËÏ × %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÒÁ×ÎÉÔØ `-' Ó ËÁÔÁÌÏÇÏÍ" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D option not supported with directories" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "ïÂÝÉÅ ÐÏÄËÁÔÁÌÏÇÉ: %s É %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "æÁÊÌ %s ÜÔÏ %s, ÔÏÇÄÁ ËÁË ÆÁÊÌ %s -- %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "æÁÊÌÙ %s É %s ÉÄÅÎÔÉÞÎÙ\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "á×ÔÏÒ Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "ÎÅÓÏ×ÍÅÓÔÉÍÙÅ ËÌÀÞÉ" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "`-' ÚÁÄÁÎ ÄÌÑ ÂÏÌÅÅ ÏÄÎÏÇÏ ×ÈÏÄÎÏÇÏ ÆÁÊÌÁ" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "ÞÔÅÎÉÅ ÎÅÕÓÐÅÛÎÏ" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed ÷Ù×ÏÄÉÔØ ÎÅ ÏÂßÅÄÉÎÅÎÎÙÅ ÉÚÍÅÎÅÎÉÑ × óôïòïí-æáêìå ÉÚ ÷áûåçï-æáêìá\n" +" × íïê-æáêì." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap ÷Ù×ÏÄÉÔØ ÎÅ ÏÂßÅÄÉÎÅÎÎÙÅ ÉÚÍÅÎÅÎÉÑ,\n" +" ÚÁËÌÀÞÁÑ ËÏÎÆÌÉËÔÎÙÅ ÍÅÓÔÁ × ÓËÏÂËÉ." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" +"-A --show-all ÷Ù×ÏÄÉÔØ ×ÓÅ ÉÚÍÅÎÅÎÉÑ, ÚÁËÌÀÞÁÑ ËÏÎÆÌÉËÔÎÙÅ ÍÅÓÔÁ × ÓËÏÂËÉ." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only ÷Ù×ÏÄÉÔØ ÐÅÒÅËÒÙ×ÁÀÝÉÅÓÑ ÉÚÍÅÎÅÎÉÑ." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X ÷Ù×ÏÄÉÔØ ÐÅÒÅÓÅËÁÀÝÉÅÓÑ ÉÚÍÅÎÅÎÉÑ, ÚÁËÌÀÞÁÑ ÉÈ × ÓËÏÂËÉ." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only ÷Ù×ÏÄÉÔØ ÎÅ ÏÂßÅÄÉÎÅÎÎÙÅ ÎÅÐÅÒÅÓÅËÁÀÝÉÅÓÑ ÉÚÍÅÎÅÎÉÑ." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge ÷Ù×ÏÄÉÔØ ÏÂßÅÄÉÎÅÎÎÙÊ ÆÁÊÌ ×ÍÅÓÔÏ ÓÃÅÎÁÒÉÑ ed (ÐÏ ÕÍÏÌÞÁÎÉÀ -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L íåôëá --label=íåôëá éÓÐÏÌØÚÏ×ÁÔØ íåôëõ ×ÍÅÓÔÏ ÉÍÅÎÉ ÆÁÊÌÁ." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i äÏÂÁ×ÉÔØ ËÏÍÁÎÄÙ `w' É `q' × ËÏÎÅà ÓÃÅÎÁÒÉÑ ed." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +"--diff-program=ðòïçòáííá éÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÓÒÁ×ÎÉÑ ÆÁÊÌÏ× ÕËÁÚÁÎÎÕÀ " +"ðòïçòáííõ." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ëìàþ]... íïê-æáêì óôáòùê-æáêì ÷áû-æáêì\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "ðÏÓÔÒÏÞÎÏ ÓÒÁ×ÎÉ×ÁÅÔ ÔÒÉ ÆÁÊÌÁ." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ: ÐÏ×ÒÅÖÄÅÎÎÙÊ ÆÏÒÍÁÔ ÂÌÏËÏ× ÚÁÐÌÁÔÙ" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: ÐÏÉÓË ÒÁÚÌÉÞÉÊ ÎÅÕÓÐÅÛÅÎ: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ: ÎÅ×ÅÒÎÙÊ ÔÉÐ ÚÁÐÌÁÔÙ × ÆÕÎËÃÉÉ `process_diff'" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "ÎÅ×ÅÒÎÙÊ ÆÏÒÍÁÔ ÚÁÐÌÁÔÙ; ÎÅ×ÅÒÎÙÊ ÒÁÚÄÅÌÉÔÅÌØ ÉÚÍÅÎÅÎÉÑ" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "ÎÅ×ÅÒÎÙÊ ÆÏÒÍÁÔ ÚÁÐÌÁÔÙ; ÎÅÐÏÌÎÁÑ ÐÏÓÌÅÄÎÑÑ ÓÔÒÏËÁ" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ×ÙÐÏÌÎÉÔØ ×ÓÐÏÍÏÇÁÔÅÌØÎÕÀ ÐÒÏÇÒÁÍÍÁ `%s'" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "ÎÅ ÎÁÊÄÅÎÁ ×ÓÐÏÍÏÇÁÔÅÌØÎÁÑ ÐÒÏÇÒÁÍÍÁ `%s'" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "ÄÏÞÅÒÎÑÑ ÐÒÏÇÒÁÍÍÁ `%s' ÚÁ×ÅÒÛÉÌÁÓØ ÎÅÕÓÐÅÛÎÏ" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "ÎÅ×ÅÒÎÙÊ ÆÏÒÍÁÔ ÚÁÐÌÁÔÙ; ÎÅÐÒÁ×ÌØÎÙÅ ÐÅÒ×ÙÅ ÓÉÍ×ÏÌÙ ÓÔÒÏËÉ" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ: ÎÁ ×ÙÈÏÄ ÐÅÒÅÄÁÎ ÎÅ×ÅÒÎÙÊ ÔÉÐ ÚÁÐÌÁÔÙ" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "×ÈÏÄÎÏÊ ÆÁÊÌ ÕÍÅÎØÛÉÌÓÑ" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÓÒÁ×ÎÉÔØ ÉÍÅÎÁ ÆÁÊÌÏ× `%s' É `%s'" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "á×ÔÏÒ ôÏÍÁÓ ìÏÒÄ." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o æáêì --output=æáêì òÁÂÏÔÁÔØ ÉÎÔÅÒÁËÔÉ×ÎÏ, ÚÁÐÉÓÙ×ÁÑ ×Ù×ÏÄ × æáêì." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case éÇÎÏÒÉÒÏ×ÁÔØ ÒÅÇÉÓÔÒ ÂÕË×." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space éÇÎÏÒÉÒÏ×ÁÔØ ×ÓÅ ÐÒÏÂÅÌØÎÙÅ ÓÉÍ×ÏÌÙ." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w þéóìï --width=þéóìï ÷Ù×ÏÄÉÔØ ÍÁËÓÉÍÕÍ ÚÁÄÁÎÎÏÅ þéóìï ÚÎÁËÏ× × ÓÔÒÏËÅ.\n" +" (ÐÏ ÕÍÏÌÞÁÎÉÀ 130)" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column ÷Ù×ÏÄÉÔØ ÔÏÌØËÏ ÌÅ×ÕÀ ËÏÌÏÎËÕ ÏÂÝÉÈ ÓÔÒÏË." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines îÅ ×Ù×ÏÄÉÔØ ÏÂÝÉÅ ÓÔÒÏËÉ." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ÆÁÊÌÙ ÂÏÌØÛÉÅ ÓÏ ÍÎÏÇÉÍÉ\n" +" ÒÁÚÂÒÏÓÁÎÎÙÍÉ ÍÅÌËÉÍÉ ÉÚÍÅÎÅÎÉÑÍÉ." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ëìàþ]... æáêì1 æáêì2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "éÎÔÅÒÁËÔÉ×ÎÏ ÓÌÉ×ÁÅÔ ÒÁÚÌÉÞÉÑ ÆÁÊÌÏ×." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "ÎÅ×ÏÚÍÏÖÎÏ ÉÎÔÅÒÁËÔÉ×ÎÏ ÓÌÉ×ÁÔØ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "ÏÂÁ ÓÒÁ×ÎÉ×ÁÅÍÙÈ ÆÁÊÌÁ -- ËÁÔÁÌÏÇÉ" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tòÅÄÁËÔÉÒÏ×ÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ÏÂÅ ×ÅÒÓÉÉ, ×ËÌÀÞÉ× × ËÁÖÄÕÀ ÚÁÇÏÌÏ×ÏË.\n" +"eb:\tòÅÄÁËÔÉÒÏ×ÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ÏÂÅ ×ÅÒÓÉÉ.\n" +"el:\tòÅÄÁËÔÉÒÏ×ÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ÌÅ×ÕÀ ×ÅÒÓÉÀ.\n" +"er:\tòÅÄÁËÔÉÒÏ×ÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ÐÒÁ×ÕÀ ×ÅÒÓÉÀ.\n" +"e:\téÓÐÏÌØÚÏ×ÁÔØ ÎÏ×ÕÀ ×ÅÒÓÉÀ.\n" +"l:\téÓÐÏÌØÚÏ×ÁÔØ ÐÒÁ×ÕÀ ×ÅÒÓÉÀ.\n" +"r:\téÓÐÏÌØÚÏ×ÁÔØ ÐÒÁ×ÕÀ ×ÅÒÓÉÀ.\n" +"s:\t÷ËÌÀÞÁÔØ ÏÂÝÉÅ ÓÔÒÏËÉ, ÎÅ ×ÙÄÁ×ÁÑ ÓÏÏÂÝÅÎÉÑ.\n" +"v:\t÷ËÌÀÞÁÔØ ÏÂÝÉÅ ÓÔÒÏËÉ, ×ÙÄÁ×ÁÑ ÓÏÏÂÝÅÎÉÅ.\n" +"q:\t÷ÙÊÔÉ.\n" diff --git a/gnu/dist/diffutils/po/sv.gmo b/gnu/dist/diffutils/po/sv.gmo Binary files differnew file mode 100644 index 00000000000..e17c11372b2 --- /dev/null +++ b/gnu/dist/diffutils/po/sv.gmo diff --git a/gnu/dist/diffutils/po/sv.po b/gnu/dist/diffutils/po/sv.po new file mode 100644 index 00000000000..cfd18c3a398 --- /dev/null +++ b/gnu/dist/diffutils/po/sv.po @@ -0,0 +1,921 @@ +# Swedish messages for diffutils. +# Copyright © 1996, 2001, 2002 Free Software Foundation, Inc. +# Göran Uddeborg <goeran@uddeborg.pp.se>, 1996, 2001, 2002. +# Revision: 1.21 +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-12 17:03+0100\n" +"Last-Translator: Göran Uddeborg <goeran@uddeborg.pp.se>\n" +"Language-Team: Swedish <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "programfel" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "stackspill" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Okänt systemfel" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Detta program kommer UTAN GARANTI, så långt lagen tillåter. Du kan\n" +"distribuera kopior av detta program i enlighet med villkoren i GNU\n" +"General Public License. För mer information om detta, se filen som\n" +"heter COPYING." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flaggan \"%s\" är tvetydig\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"--%s\" tar inget argument\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"%c%s\" tar inget argument\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flaggan \"%s\" behöver ett argument\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: okänd flagga \"--%s\"\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: okänd flagga \"%c%s\"\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillåten flagga -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaggan behöver ett argument -- %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flaggan \"-W %s\" är tvetydig\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flaggan \"-W %s\" tar inget argument\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "Lyckades" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "Ingen match" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Ogiltigt reguljäruttryck" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Ogiltigt sorteringstecken" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Ogiltigt namn på teckenklass" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "Avslutande omvänt snedstreck" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Ogiltig bakåtreferens" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "Oparad [ eller [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "Oparad ( eller \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "Oparad \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "Ogiltigt innehåll i \\{\\}" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Ogiltigt intervallslut" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Minnet slut" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Föregående reguljäruttryck ogiltigt" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Förtida slut på reguljäruttryck" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "För stort reguljäruttryck" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "Oparad ) eller \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Inget föregående reguljäruttryck" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "minnet slut" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "Filerna %s och %s skiljer\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "Binärfilerna %s och %s skiljer\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Ingen nyrad vid filslut" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Skrivet av Torbjörn Granlund och David MacKenzie." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Försök med \"%s --help\" för mer information." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "ogiltigt --ignore-initial-värde \"%s\"" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "flaggorna -l och -s är motstridiga" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "skrivning misslyckades" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "standard ut" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Skriv ut byte som skiljer." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "" +"-i HOPP --ignore-initial=HOPP Hoppa över de HOPP första byten i indata." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i HOPP1:HOPP2 --ignore-initial=HOPP1:HOPP2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr "" +" Hoppa över de HOPP1 första byten i FIL1 och de HOPP2 första byten i FIL2." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Skriv ut bytenummer och värde för alla skiljande byte." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n GRÄNS --bytes=GRÄNS Jämför högst GRÄNS byte." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent Skriv inget; ge endast en slutstatus." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Visa versionsinformation." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Visa detta hjälpmeddelande." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Användning: %s [FLAGGA]... FIL1 [FIL2 [HOPP1 [HOPP2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "Jämför två filer byte för byte." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "HOPP1 och HOPP2 är antalet byte att hoppa över i varje fil." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"HOPP-värden kan följas av följande mutiplikativa suffix:\n" +"kB 1000, K 1024, MB 1 000 000, M 1 048 576\n" +"GB 1 000 000 000, G 1 073 741 824, och så vidare för T, P, E, Z, Y." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "Om FIL är \"-\" eller utelämnats, läs standard in." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" +"Rapportera fel till <bug-gnu-utils@gnu.org>.\n" +"Rapportera synpunkter på den svenska översättningen till <sv@li.org>." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "ogiltigt --bytes-värde \"%s\"" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "saknad operand efter \"%s\"" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "extra operand \"%s\"" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s skiljer: byte %s, rad %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s skiljer: byte %s, rad %s är %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: EOF i %s\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Skrivet av Paul Eggert, Mike Haertel, DAvid Hayes,\n" +"Richard Stallman och Len Tower." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "ogiltig omgivningslängd \"%s\"" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "sidvisning stödjs ej på denna värd" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "för många etikettflaggor" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "ogiltig bredd \"%s\"" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "konflikt mellan breddflaggor" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "ogiltig horisontlängd \"%s\"" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "flaggan \"-%ld\" är föråldrad; använd \"-%c %ld\"" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "flaggan \"-%ld\" är föråldrad; använd den inte" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "både --from-file och --to-file angavs" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Jämför filer rad för rad." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case Bortse från skiftläge i filinnehåll." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case Bortse från skiftläge när filnamn jämförs." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Ta hänsyn till skiftläge när filnamn jämförs." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Ignorera ändringar på grund av " +"tabulatorexpansion." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change Bortse från ändringar i antalet blanka." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Ignorera alla blanktecken." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines Ignorera ändringar i form av enbart blanka rader." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RU --ignore-matching-lines=RU Ignorera ändringar vars rader matchar RU." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Tag bort avslutande vagnreturer i indata." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Läs och skriv data binärt." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Betrakta alla filer som text." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C ANT --context[=ANT] Skriv ut ANT (normalt 3) rader kopierad " +"omgivning.\n" +"-u -U ANT --unified[=ANT] Skriv ut ANT (normalt 3) rader sammanslagen\n" +" omgivning.\n" +" --label ETIKETT Använd ETIKETT istället för filnamn.\n" +" -p --show-c-function Visa vilken C-funktion varje ändring finns i.\n" +" -F RU --show-function-line=RU Visa den senaste raden som matchar RU." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Skriv ut endast huruvida filer skiljer sig." + +# Finns det någon bättre översättning av "script" än "program"? +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Skriv ut ett ed-program." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Skriv ut en normal diff." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs Skriv ut skillnader i RCS-format." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side Skriv ut i två kolumner.\n" +" -W ANT --width=ANT Skriv ut högst ANT (130 om inget anges) kolumner.\n" +" --left-column Skriv ut endast vänstra kolumnen av gemensamma rader.\n" +" --suppress-common-lines Skriv inte ut gemensamma rader." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D NAMN --ifdef=NAMN Skriv ut sammanslagen fil med skillnader inom " +"\"#ifdef NAMN\"." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "--GTYP-group-format=GFMT Dito, men formatera GTYP ingrupper med GFMT." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "--line-format=RFMT Dito, men formatera alla inrader med RFMT." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "--RTYP-line-format=RFMT Dito, men formatera RTYP inrader med RFMT." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" RTYP är \"old\", \"new\" eller \"unchanged\". GTYP är RTYP eller \"changed" +"\"." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT kan innehålla:\n" +" %< rader från FIL1\n" +" %> rader från FIL2\n" +" %= gemensamma rader i FIL1 och FIL2\n" +" %[-][BREDD][.[PREC]]{doxX}BOKSTAV printf-lik spec. för BOKSTAV\n" +" BOKSTÄVER är enligt följande för ny grupp, gemen för gammal grupp:\n" +" F första radnumret\n" +" L sista radnumret\n" +" N antal rader = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" RFMT kan innehålla:\n" +" %L radinnehåll\n" +" %l radinnehåll exklusive avslutande nyrad\n" +" %[-][BREDD][.[PREC]]{doxX}n printf-stil spec. för inradnummer" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" Både GFMT eller RFMT kan innehålla:\n" +" %% %\n" +" %c'C' det ensamma tecknet C\n" +" %c'\\OOO' tecknet med oktalkod OOO" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Skicka utdata till \"pr\" för paginering." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Expandera tabulatorer till blanksteg." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab Justera tabulatorer genom att skjuta in en tabulator " +"först." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive Jämför underkataloger rekursivt." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Betrakta saknade filer som tomma." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "--unidirectional-new-file Behandla saknade förstafiler som tomma." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files Rapportera om två filer är lika." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x MNS --exclude=MNS Ta inte med filer som matchar MNS." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X FIL --exclude-from=FIL Ta inte med filer med namn som matchar mönstren " +"i FIL." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "-S FIL --starting-file=FIL Börja med FIL när kataloger jämförs." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FIL1 Jämför FIL1 medd alla operander. FIL1 kan vara en " +"katalog." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FIL2 Jämför alla operander med FIL2. FIL2 kan vara en katalog." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "" +"--horizon-lines=ANT Spara ANT rader av det gemensamma prefixet och suffixet." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Arbeta hårt för att hitta en mindre mängd av ändringar." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "--speed-large-files Antag stora filer och små spridda ändringar." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FILER är \"FIL1 FIL2\" eller \"KAT1 KAT2\" eller \"KAT FIL...\" eller " +"\"FIL... KAT\"." + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"Om --from-file eller --to-file är angivet, finns det inga begränsningar på\n" +"FILER." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "Om FIL är \"-\", läs standard in." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Användning: %s [FLAGGA]... FILER\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "motstridigt %s-flaggsvärde \"%s\"" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "motstridig utmatningsstilsflagga" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "tom normal fil" + +#: src/diff.c:976 +msgid "regular file" +msgstr "normal fil" + +#: src/diff.c:978 +msgid "directory" +msgstr "katalog" + +#: src/diff.c:981 +msgid "block special file" +msgstr "blockspecialfil" + +#: src/diff.c:984 +msgid "character special file" +msgstr "teckenspecialfil" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "uttag (socket)" + +#: src/diff.c:994 +msgid "message queue" +msgstr "meddelandekö" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semafor" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "delatminneobjekt" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "typat minnes-objekt" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "konstig fil" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Endast i %s: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "kan inte jämföra \"-\" med en katalog" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D flaggan stödjs ej för kataloger" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Lika underkataloger: %s och %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "Fil %s är en %s medan fil %s är en %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "Filerna %s och %s är lika\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Skrivet av Randy Smith." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "oförenliga flaggor" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "\"-\" angivet för mer än en infil" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "läsning misslyckades" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed Skriv ut separata ändringar från GAMMALFIL till DINFIL i MINFIL." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Skriv ut ändringar separat med markeringar runt " +"konflikter." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Skriv ut alla ändringar med markering runt konflikter." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Skriv ut överlappande ändringar." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Skriv ut ändringar separat, markerade." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Skriv ut ej överlappande ändringar separat." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Skriv ut sammanslagen fil istället för ed-program (normalt -A)." + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ETIKETT --label=ETIKETT Använd ETIKETT istället för filnamn." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Lägg till \"w\"- och \"q\"-kommandon till ed-program." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=PROGRAM Använd PROGRAM för att jämföra filer." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Användning: %s [FLAGGA]... MINFIL GAMMALFIL DINFIL\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Jämför tre filer rad för rad." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "internt fel: trasigt format i diff-block" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff misslyckades: " + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "internt fel: ogiltig diff-typ i process_diff" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "ogiltigt diff-format; ogiltig ändringsseparator" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "ogiltigt diff-format; ofullständig sista rad" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "underprogram \"%s\" inte körbart" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "underprogram \"%s\" hittades inte" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "underprogram \"%s\" misslyckades" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "ogiltigt diff-format; felaktiga starttecken på rad" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "internt fel: ogiltig diff-typ utskickad" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "infilen krympte" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "kan inte jämföra filnamn \"%s\" och \"%s\"" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Skrivet av Thomas Lord." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o FIL --output=FIL Kör interaktivt, med utdata till FIL." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Betrakta versaler och gemena som lika." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Ignorera alla blanktecken." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w ANT --width=ANT Skriv ut högst ANT (130 om inget anges) tecken per rad." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "" +"-l --left-column Skriv ut endast vänstra kolumnen av gemensamma rader." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Skriv inte ut gemensamma rader." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "-H --speed-large-files Antag stora filer och små spridda ändringar." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Användning: %s [FLAGGA]... FIL1 FIL2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Sammanslagning sida-vid-sida av filskillnader." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "kan inte slå samman standard in interaktivt" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "båda filerna som skall jämföras är kataloger" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tRedigera och använd sedan båda versioner, dekorerade med huvuden.\n" +"eb:\tRedigera och använd sedan båda versioner.\n" +"el:\tRedigera och använd sedan vänstra versionen.\n" +"er:\tRedigera och använd sedan högra versionen.\n" +"e:\tRedigera en ny version.\n" +"l:\tAnvänd vänstra versionen.\n" +"r:\tAnvänd högra versionen.\n" +"s:\tInkludera tyst gemensamma rader.\n" +"v:\tInkludera och tillkännage gemensamma rader.\n" +"q:\tAvsluta.\n" diff --git a/gnu/dist/diffutils/po/tr.gmo b/gnu/dist/diffutils/po/tr.gmo Binary files differnew file mode 100644 index 00000000000..2e9abdaeea0 --- /dev/null +++ b/gnu/dist/diffutils/po/tr.gmo diff --git a/gnu/dist/diffutils/po/tr.po b/gnu/dist/diffutils/po/tr.po new file mode 100644 index 00000000000..976f6948df0 --- /dev/null +++ b/gnu/dist/diffutils/po/tr.po @@ -0,0 +1,956 @@ +# Diffutils Turkish translation +# Copyright (C) 2001 Free Software Foundation, Inc. +# Deniz Akkus Kanca <deniz@arayan.com>, 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.8\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-04-03 07:35EET\n" +"Last-Translator: Deniz Akkus Kanca <deniz@arayan.com>\n" +"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 0.9.5\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "yazılım hatası" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "yığıt taÅŸması" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "Bilinmeyen sistem hatası" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"Bu yazılım, kanunun izin verdiÄŸi ölçüde, HİÇ BİR GARANTİ içermez.\n" +"Bu yazılımın kopyalarını GNU Genel Kamu Lisansı'nın koÅŸulları altında\n" +"dağıtabilirsiniz. Bu konular ile ilgili daha fazla bilgi için lütfen " +"COPYING\n" +"adındaki dosyaya bakın." + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' seçeneÄŸi belirsiz\n" + +#: lib/getopt.c:718 +#, 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:723 +#, 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:741 lib/getopt.c:914 +#, 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:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: `--%s' seçeneÄŸi bilinmiyor\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: `%c%s' seçeneÄŸi bilinmiyor\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kuraldışı seçenek -- %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, 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:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneÄŸi belirsiz\n" + +#: lib/getopt.c:898 +#, 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/regex.c:1367 +msgid "Success" +msgstr "BaÅŸarılı" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "EÅŸleme yok" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "Düzenli ifade geçersiz" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "Harmanlama karakteri geçersiz" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "Karakter sınıf ismi geçersiz" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "İzleyen ters kesme" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "Geriye baÅŸvuru geçersiz" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "[ ya da [^ eÅŸleÅŸmiyor" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "( ya da \\( eÅŸleÅŸmiyor" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "\\{ eÅŸleÅŸmiyor" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "\\{\\} içeriÄŸi geçersiz" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "Kapsam sonu geçersiz" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "Bellek tükendi" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "Önceki düzenli ifade geçersiz" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "Düzenli ifadenin sonu eksik kalmış" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "Düzenli ifade çok büyük" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr ") ya da \\) eÅŸleÅŸmiyor" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "Daha önce düzenli ifade yok" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "bellek tükendi" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "%s ve %s dosyaları birbirinden farklı\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "İkilik dosyalar %s ve %s birbirinden farklı\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "Dosya sonunda yenisatır yok." + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "Torbjorn Granlund ve David MacKenzie tarafından yazılmıştır." + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "Daha fazla bilgi için `%s --help' komutunu kullanın." + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "geçersiz -- ilk deÄŸer `%s' yoksayılmış" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "-l ve -s seçenekleri beraber kullanılamaz" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "yazma baÅŸarısız oldu" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "standart çıktı" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes Bayt farklarını çıktılar." + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i ATLA --ignore-initial=ATLA Girdinin ilk ATLA baytını atlar." + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i ATLA1:ATLA2 --ignore-initial=ATLA1:ATLA2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr " DOSYA1'in ilk ATLA1 baytını ve DOSYA2'nin ilk ATLA2 baytını atlar." + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "" +"-l --verbose Bütün farklı baytların numaralarını ve deÄŸerlerini gösterir." + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LİMİT --bytes=LİMİT En fazla LİMİT baytı karşılaÅŸtırır." + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "" +"-s --quiet --silent Hiç bir ÅŸey çıktılamaz, yalnızca çıkış durumunu " +"bildirir." + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Sürüm bilgisini gösterir." + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Bu yardımı gösterir." + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "Kullanım: %s [SEÇENEK]... DOSYA1 [DOSYA2 [ATLA1 [ATLA2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "İki dosyayı bayt bayt karşılaÅŸtırır." + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "ATLA1 ve ATLA2 her dosyada atlanacak bayt sayısını gösterir." + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"ATLA deÄŸerleri aÅŸağıdaki çarpanlarla sonlanabilir:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, ve T, P, E, Z, Y için devam eder." + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "EÄŸer DOSYA `-' ise veya yoksa, standart girdi okunur." + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "" +"Yazılım hatalarını <bug-gnu-utils@gnu.org> adresine, \n" +"çeviri hatalarını <gnu-tr-u12a@lists.sourceforge.net> adresine bildirin." + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "geçersiz --bytes deÄŸeri `%s'" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "`%s'den sonra iÅŸlenen eksik" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "fazla iÅŸlenen `%s'" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s farklı: bayt %s, satır %s\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s farklı: bayt %s, satır %s: %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp: %s'da EOF (dosyasonu)\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, ve Len Tower\n" +"tarafından yazılmıştır." + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "`%s' içerik uzunluÄŸu geçersiz" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "sayfalama bu makina üzerinde desteklenmiyor" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "çok fazla dosya etiket seçeneÄŸi" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "geçersiz geniÅŸlik `%s'" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "çeliÅŸkili geniÅŸlik seçenekleri" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "geçersiz ufuk uzunluÄŸu `%s'" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "`-%ld' seçeneÄŸi kullanımdan kalktı; `-%c %ld' kullanın" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "`-%ld' seçeneÄŸi kullanımdan kalktı; kullanmayın" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "hem --from-file hem de --to-file belirtilmiÅŸ" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "Dosyaları satır satır karşılaÅŸtırır." + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "" +"-i --ignore-case Dosya içeriÄŸinde büyük/küçük harf farklarını yoksayar." + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "" +"--ignore-file-name-case Dosya isimlerinde büyük/küçük harf farklarını " +"yoksayar." + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "" +"--no-ignore-file-name-case Dosya isimlerinde büyük/küçük harf farkı gözetir." + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "" +"-E --ignore-tab-expansion Sekmelerin açılmasından doÄŸan farkları yoksayar." + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "" +"-b --ignore-space-change BoÅŸluk miktarındaki deÄŸiÅŸiklikleri yoksayar." + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space Bütün boÅŸlukları yoksayar." + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "" +"-B --ignore-blank-lines Satırları boÅŸ olan deÄŸiÅŸiklikleri dikkate almaz." + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I DÜZİF --ignore-matching-lines=DÜZİF Satırları DÜZİF kalıbına uyan\n" +" farkları yok sayar." + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr Girdiden en sonda sarkan satır başını soyar." + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary Datayı ikilik kipte yazar ve okur." + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text Bütün dosyaları metin imiÅŸcesine iÅŸler." + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C SAYI --context[=SAYI] SAYI kadar baÄŸlam satırı kopyalar (öntanımlı " +"3)\n" +"-u -U SAYI --unified[=SAYI] SAYI kadar birleÅŸmiÅŸ baÄŸlam satırı kopyalar\n" +" (öntanımlı 3)\n" +" --label ETİKET Dosya adı yerine ETİKET'i kullanır.\n" +" -p --show-c-function Her farkın hangi C iÅŸlevi içinde olduÄŸunu " +"gösterir.\n" +" -F DÜZİF --show-function-line=DÜZİF DÜZİF düzenli ifade kalıbına uygun " +"olan\n" +" en son satırı gösterir." + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief Yalnızca dosyaların farklı olup olmadığını gösterir." + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed Bir ed betiÄŸi çıktılar." + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal Normal bir diff çıktılar." + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs RCS biçeminde diff çıktılar." + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side İki sütun halinde çıktı verir.\n" +" -w SAYI --width=SAYI Satır başına en fazla SAYI kadar karakter çıktılar\n" +" (öntanımlı 130).\n" +" --left-column Ortak satırlarda yalnız sol sütunu gösterir.\n" +" --suppress-common-lines Ortak satırları göstermez." + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "" +"-D İSİM --ifdef=İSİM #ifdef İSİM farklarını gösteren harmanlanmış\n" +" dosya çıktılar." + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTÜR-group-format=GBÇ Benzer, fakat GTÜR biçeminde girdi grupları\n" +" GBÇ ile biçemlendirilir." + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "" +"--line-format=LBÇ Benzer, fakat bütün girdi satırları LBÇ ile " +"biçemlendirilir." + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTÜR-line-format=LBÇ Benzer, fakat LTÜR girdi satırları \n" +" LBÇ ile biçemlendirilir." + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTÜR, `old' (eski), `new' (yeni) veya `unchanged' (deÄŸiÅŸmemiÅŸ) olabilir. \n" +" GTÜR, LTÜR veya `changed' (deÄŸiÅŸmiÅŸ) olabilir." + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GBÇ aÅŸağıdakileri içerebilir:\n" +" %< DOSYA1'den satırlar\n" +" %> DOSYA2'den satırlar\n" +" %= DOSYA1 ve DOSYA2'de ortak olan satırlar\n" +" %[-][GENİŞLİK][.[KESİNLİK]]{doxX}HARF HARF için printf tarzı biçem\n" +" HARF'ler yeni grup için aÅŸağıdaki gibi, eski grup için ise\n" +" küçük harf olurlar:\n" +" F ilk satır numarası\n" +" L son satır numarası\n" +" N satır sayısı = L-F+1\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LBÇ aÅŸağıdakileri içerebilir:\n" +" %L satırın içeriÄŸi\n" +" %l sonlayan yenisatır karakteri hariç, satırın içeriÄŸi\n" +" %[-][GENİŞLİK][.[KESİNLİK]]{doxX}n girdi satır sayısı için printf\n" +" tarzı biçem" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GBÇ veya LBÇ aÅŸağıdakileri içerebilir:\n" +" %% %\n" +" %c'C' tekli karakter C\n" +" %c'\\OOO' Sekizlik kodu OOO olan karakter" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate Çıktıyı `pr' komutundan geçirerek sayfalar." + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs Çıktıda sekmeleri boÅŸluk haline getirir." + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "" +"-T --initial-tab BaÅŸlarına bir sekme ilave ederek sekmelerin " +"hizalanmasını\n" +" saÄŸlar." + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "" +"-r --recursive Çevrimli olarak bulunan bütün alt dizinleri karşılaÅŸtırır." + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file Var olmayan dosyaları boÅŸ varsayar." + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "--unidirectional-new-file Var olmayan birinci dosyayı boÅŸ varsayar." + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "" +"-s --report-identical-files iki dosyanın birbirinin aynısı olup " +"olmadığını\n" +" bildirir." + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x KALIP --exclude=KALIP KALIP'a uyan dosyaları iÅŸleme dahil etmez." + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "" +"-X DOSYA --exclude-from=DOSYA DOSYA'da bulunan kalıplara uyan dosyaları\n" +" iÅŸlem dışı tutar." + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "" +"-S DOSYA --starting-file=DOSYA Dizinleri karşılaÅŸtırırken DOSYA'dan baÅŸlar." + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=DOSYA1 DOSYA1'i bütün iÅŸlenenlerle karşılaÅŸtırır. DOSYA1 dizin\n" +" olabilir." + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=DOSYA2 Bütün iÅŸlenenleri DOSYA2 ile karşılaÅŸtırı. DOSYA2 dizin\n" +" olabilir." + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "--horizon-lines=SAYI ortak ilkek ve soneklerin SAYI satırını tutar." + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal Daha küçük bir fark kümesi bulmaya çalışır." + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "" +"--speed-large-files Büyük dosyalar ve çok sayıda dağınık küçük \n" +" farklar olduÄŸunu farzeder." + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"DOSYAlar: `DOSYA1 DOSYA2' veya `DİZİN1 DİZİN2' veya `DİZİN DOSYA...' \n" +" veya `DOSYA...DİZİN';" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "" +"eÄŸer --from-file veya --to-file kullanılmışsa, DOSYAlar üzerinde \n" +"kısıtlama yoktur." + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "EÄŸer bir DOSYA `-' ise, standart girdi okunur." + +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "Kullanım: %s [SEÇENEK]... DOSYAlar\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "çeliÅŸkili %s seçeneÄŸi deÄŸeri: `%s'" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "çeliÅŸkili çıktı tarz seçenekleri" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "normal boÅŸ dosya" + +#: src/diff.c:976 +msgid "regular file" +msgstr "normal dosya" + +#: src/diff.c:978 +msgid "directory" +msgstr "dizin" + +#: src/diff.c:981 +msgid "block special file" +msgstr "blok özel dosyası" + +#: src/diff.c:984 +msgid "character special file" +msgstr "karakter özel dosyası" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "soket" + +#: src/diff.c:994 +msgid "message queue" +msgstr "ileti kuyruÄŸu" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semafor" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "ortak bellek nesnesi" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "türlenmiÅŸ bellek nesnesi" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "dosya garip" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "Yalnızca %s'da: %s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "`-', bir dizinle karşılaÅŸtırılamaz" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D seçenek dizinler için kullanılamaz." + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "Ortak alt dizinler: %s ve %s\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "%s dosyası, bir %s, halbuki %s dosyası bir %s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "%s ve %s dosyaları birbirinin aynı\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "Randy Smith tarafından yazılmıştır." + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "uyumsuz seçenekler" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "`-' birden fazla girdi dosyası için belirtilmiÅŸ" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "okuma baÅŸarısız oldu" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed ESKİDOSYA ile SİZİNDOSYA arasındaki harmanlanmamış farkları\n" +" BENİMDOSYA'ya çıktılar." + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "" +"-E --show-overlap Harmanlanmamış deÄŸiÅŸiklikleri çıktılar, ihtilafları \n" +" köşeli parantez içinde gösterir." + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "" +"-A --show-all Bütün deÄŸiÅŸiklikleri çıktılar, ihtilafları köşeli parantez\n" +" içine alır." + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only Birbiri ile örtüşen farkları gösterir." + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "" +"-X Birbiriyle örtüşen farkları köşeli parantez içinde göstererek çıktılar." + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "" +"-3 --easy-only Harmanlanmamış, tekrarlanmayan deÄŸiÅŸiklikleri çıktılar." + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "" +"-m --merge Ed betiÄŸi yerine harmanlanmış dosya çıktılar. (öntanımlı -A)" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ETİKET --label=ETİKET Dosya adı yerine ETİKET'i kullanır." + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i Ed betiklerinin sonuna `w' ve `q' komutlarını ekler." + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "" +"--diff-program=YAZILIM Dosyaları karşılaÅŸtırmak için YAZILIM'ı kullanır." + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "Kullanım: %s [SEÇENEK]... BENİMDOSYA ESKİDOSYA SİZİNDOSYA\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "Üç dosyayı satır satır karşılaÅŸtırır." + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "iç hata: diff blokları biçemlemesinde hata oluÅŸtu" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s: diff baÅŸarısız oldu:" + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "iç hata: process_diff iÅŸlevi içinde geçersiz diff türü" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "geçersiz diff biçemi; geçersiz fark ayracı" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "geçersiz diff biçemi; tamamlanmamış son satır" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "alt yazılım `%s' çalışır deÄŸil" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "alt yazılım `%s' bulunamadı" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "alt yazılım `%s' baÅŸarısız oldu" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "geçersiz diff biçemi; geçersiz satır başı karakterleri" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "iç hata: çıktıya geçersiz diff türü geçirildi" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "girdi dosyası küçüldü" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "dosya isimleri `%s' ve `%s' karşılaÅŸtırılamıyor" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "Thomas Lord tarafından yazılmıştır." + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "" +"-o DOSYA --output=DOSYA Interaktif olarak çalışır, çıktıyı DOSYA'ya\n" +" yönlendirir." + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case Büyük harf/küçük harf farkı gözetmez." + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space Bütün boÅŸlukları yok sayar." + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "" +"-w SAYI --width=SAYI Satır başına en fazla SAYI kadar karakter çıktılar\n" +" (öntanımlı 130)." + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column Ortak satırları yalnızca sol sütunda çıktılar." + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines Ortak satırları göstermez." + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "" +"-H --speed-large-files Büyük dosyalar ve çok sayıda dağınık küçük \n" +" farklar olduÄŸunu farzeder." + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "Kullanım: %s [SEÇENEK]... DOSYA1 DOSYA2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "Dosya farklarının yanyana katıştırılması." + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "interaktif olarak standart girdi harmanlanamaz" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "karşılaÅŸtırılacak her iki dosya da dizin" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed:\tDüzenler, sonra iki tarafı da kullanır, bir baÅŸlıkla süsler.\n" +"eb:\tDüzenler, sonra iki tarafı da kullanır.\n" +"el:\tDüzenler, sonra sol tarafı kullanır.\n" +"er:\tDüzenler, sonra saÄŸ tarafı kullanır.\n" +"e:\tYeni bir sürüm düzenler.\n" +"l:\tSol tarafı kullanır.\n" +"r:\tSaÄŸ tarafı kullanır.\n" +"s:\tOrtak satırları sessizce dahil eder.\n" +"v:\tOrtak satırları bilgi vererek dahil eder.\n" +"q:\tÇıkar.\n" diff --git a/gnu/dist/diffutils/po/zh_TW.gmo b/gnu/dist/diffutils/po/zh_TW.gmo Binary files differnew file mode 100644 index 00000000000..c09ca46a577 --- /dev/null +++ b/gnu/dist/diffutils/po/zh_TW.gmo diff --git a/gnu/dist/diffutils/po/zh_TW.po b/gnu/dist/diffutils/po/zh_TW.po new file mode 100644 index 00000000000..aff39f96028 --- /dev/null +++ b/gnu/dist/diffutils/po/zh_TW.po @@ -0,0 +1,922 @@ +# traditional Chinese translation for diffutils. +# Copyright (C) 2002 Free Software Foundation, Inc. +# Abel Cheung <maddog@linux.org.hk>, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: diffutils 2.7.10\n" +"POT-Creation-Date: 2002-04-05 14:10-0800\n" +"PO-Revision-Date: 2002-03-13 06:06+0800\n" +"Last-Translator: Abel Cheung <maddog@linux.org.hk>\n" +"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=Big5\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/c-stack.c:188 +msgid "program error" +msgstr "µ{¦¡¿ù»~" + +#: lib/c-stack.c:189 +msgid "stack overflow" +msgstr "°ïÅ|·¸¦ì" + +#: lib/error.c:128 lib/error.c:156 +msgid "Unknown system error" +msgstr "¤£©úªº¨t²Î¿ù»~" + +#: lib/freesoft.c:27 +msgid "" +"This program comes with NO WARRANTY, to the extent permitted by law.\n" +"You may redistribute copies of this program\n" +"under the terms of the GNU General Public License.\n" +"For more information about these matters, see the file named COPYING." +msgstr "" +"¦¹³nÅé¦bªk«ß¤¹³\ªº«×¤§¤U¤£ªþ±a¥ô¦ó«OÃÒ¡C§A¥i¥H®Ú¾Ú GNU General Public\n" +"License ¤¤ªº±ø´Ú«·s´²§G¦¹³nÅé¡C¸Ô½Ð½Ð°Ñ¦ÒÀÉ®× COPYING¡C" + +#: lib/getopt.c:693 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s¡G¿ï¶µ¡¥%s¡¦¬O¤£©ú½Tªº\n" + +#: lib/getopt.c:718 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s¡G¿ï¶µ¡¥--%s¡¦¤£¥i°t¦X°Ñ¼Æ¨Ï¥Î\n" + +#: lib/getopt.c:723 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s¡G¿ï¶µ¡¥%c%s¡¦¤£¥i°t¦X°Ñ¼Æ¨Ï¥Î\n" + +#: lib/getopt.c:741 lib/getopt.c:914 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s¡G¿ï¶µ¡¥%s¡¦»Ýn°Ñ¼Æ\n" + +#: lib/getopt.c:770 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s¡GµLªkÃѧOªº¿ï¶µ¡¥--%s¡¦\n" + +#: lib/getopt.c:774 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s¡GµLªkÃѧOªº¿ï¶µ¡¥%c%s¡¦\n" + +#: lib/getopt.c:800 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s¡G¤£¦Xªkªº¿ï¶µ ¢w %c\n" + +#: lib/getopt.c:803 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s¡GµL®Äªº¿ï¶µ ¢w %c\n" + +#: lib/getopt.c:833 lib/getopt.c:963 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s¡G¿ï¶µ»Ýn°Ñ¼Æ ¢w %c\n" + +#: lib/getopt.c:880 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s¡G¿ï¶µ¡¥-W %s¡¦¬O¤£©ú½Tªº\n" + +#: lib/getopt.c:898 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s¡G¿ï¶µ¡¥-W %s¡¦¤£¥i°t¦X°Ñ¼Æ¨Ï¥Î\n" + +#: lib/regex.c:1367 +msgid "Success" +msgstr "¦¨¥\" + +#: lib/regex.c:1370 +msgid "No match" +msgstr "¨S¦³²Å¦Xªº¦r¦ê" + +#: lib/regex.c:1373 +msgid "Invalid regular expression" +msgstr "¤£¥¿½Tªº¥¿³Wªí¥Ü¦¡" + +#: lib/regex.c:1376 +msgid "Invalid collation character" +msgstr "µL®Äªº collation ¦r¤¸" + +#: lib/regex.c:1379 +msgid "Invalid character class name" +msgstr "µL®Äªº¦r¤¸ºØÃþ¦WºÙ" + +#: lib/regex.c:1382 +msgid "Trailing backslash" +msgstr "¥½ºÝ¦³¦h¾lªº¤Ï±×¸¹" + +#: lib/regex.c:1385 +msgid "Invalid back reference" +msgstr "µL®Äªº back reference" + +#: lib/regex.c:1388 +msgid "Unmatched [ or [^" +msgstr "¨S¦³¹ïÀ³ªº [ ©Î [^" + +#: lib/regex.c:1391 +msgid "Unmatched ( or \\(" +msgstr "¨S¦³¹ïÀ³ªº ( ©Î \\(" + +#: lib/regex.c:1394 +msgid "Unmatched \\{" +msgstr "¨S¦³¹ïÀ³ªº \\{" + +#: lib/regex.c:1397 +msgid "Invalid content of \\{\\}" +msgstr "\\{\\} ¤¤ªº¤º®eµL®Ä" + +#: lib/regex.c:1400 +msgid "Invalid range end" +msgstr "½d³ò¥½ºÝ¦r¤¸µL®Ä" + +#: lib/regex.c:1403 +msgid "Memory exhausted" +msgstr "°O¾ÐÅé¯ÓºÉ" + +#: lib/regex.c:1406 +msgid "Invalid preceding regular expression" +msgstr "¤§«eªº¥¿³Wªí¥Ü¦¡µL®Ä" + +#: lib/regex.c:1409 +msgid "Premature end of regular expression" +msgstr "¥¿³Wªí¥Ü¦¡¹L¦µ²§ô" + +#: lib/regex.c:1412 +msgid "Regular expression too big" +msgstr "¥¿³Wªí¥Ü¦¡¹Lªø" + +#: lib/regex.c:1415 +msgid "Unmatched ) or \\)" +msgstr "¨S¦³¹ïÀ³ªº ) ©Î \\)" + +#: lib/regex.c:8034 +msgid "No previous regular expression" +msgstr "¤§«e¨S¦³¥ô¦ó¥¿³Wªí¥Ü¦¡" + +#: lib/xmalloc.c:63 +msgid "memory exhausted" +msgstr "°O¾ÐÅé¯ÓºÉ" + +#: src/analyze.c:809 src/diff.c:1283 +#, c-format +msgid "Files %s and %s differ\n" +msgstr "ÀÉ®× %s »P %s ¤£¦P\n" + +#: src/analyze.c:812 +#, c-format +msgid "Binary files %s and %s differ\n" +msgstr "¤G¤¸½XÀÉ %s »P %s ¤£¦P\n" + +#: src/analyze.c:1058 src/diff3.c:1413 src/util.c:526 +msgid "No newline at end of file" +msgstr "ÀÉ®×¥½¨S¦³ newline ¦r¤¸" + +#: src/cmp.c:43 +msgid "Written by Torbjorn Granlund and David MacKenzie." +msgstr "¥Ñ Torbjorn Granlund ¤Î David MacKenzie ½s¼g¡C" + +#: src/cmp.c:118 src/diff.c:817 src/diff3.c:427 src/sdiff.c:168 +#, c-format +msgid "Try `%s --help' for more information." +msgstr "½Ð¹Á¸Õ¡¥%s --help¡¦¨ÓÀò¨ú§ó¦h¸ê°T¡C" + +#: src/cmp.c:137 +#, c-format +msgid "invalid --ignore-initial value `%s'" +msgstr "µL®Äªº --ignore-initial È¡¥%s¡¦" + +#: src/cmp.c:146 +msgid "options -l and -s are incompatible" +msgstr "-l ©M -s ¿ï¶µ¤£Ý®e" + +#: src/cmp.c:154 src/diff.c:826 src/diff3.c:435 src/sdiff.c:177 +#: src/sdiff.c:313 src/sdiff.c:320 src/sdiff.c:910 src/util.c:194 +#: src/util.c:286 src/util.c:293 +msgid "write failed" +msgstr "¼g¤J¥¢±Ñ" + +#: src/cmp.c:156 src/diff.c:828 src/diff.c:1354 src/diff3.c:437 +#: src/sdiff.c:179 +msgid "standard output" +msgstr "¼Ð·Ç¿é¥X" + +#: src/cmp.c:160 +msgid "-b --print-bytes Print differing bytes." +msgstr "-b --print-bytes ¦L¥X¬Û²§¦ì¸mªº¦ì¤¸²Õ¡C" + +#: src/cmp.c:161 +msgid "-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input." +msgstr "-i SKIP --ignore-initial=SKIP ²¤¹L¿é¤J¸ê®Æªº³Ìªì SKIP Ӧ줸²Õ¡C" + +#: src/cmp.c:162 +msgid "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" +msgstr "-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2" + +#: src/cmp.c:163 +msgid "" +" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2." +msgstr " ²¤¹L FILE1 ªº³Ìªì SKIP1 Ӧ줸²Õ©M FILE2 ªº³Ìªì SKIP2 Ӧ줸²Õ¡C" + +#: src/cmp.c:164 +msgid "-l --verbose Output byte numbers and values of all differing bytes." +msgstr "-l --verbose Åã¥Ü¨âªÌ©Ò¦³¬Û²§ªº¦ì¸m©M¥¦Ìªº¦ì¤¸²Õ¼ÆÈ¡C" + +#: src/cmp.c:165 +msgid "-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes." +msgstr "-n LIMIT --bytes=LIMIT ³Ì¦h¤ñ¸û LIMIT Ӧ줸²Õ¡C" + +#: src/cmp.c:166 +msgid "-s --quiet --silent Output nothing; yield exit status only." +msgstr "-s --quiet --silent ¤£¿é¥X¥ô¦ó¸ê°T¡F¥u²£¥Í¦^¶ÇÈ¡C" + +#: src/cmp.c:167 src/diff.c:904 src/diff3.c:455 src/sdiff.c:204 +msgid "-v --version Output version info." +msgstr "-v --version Åã¥Üª©¥»¸ê°T¡C" + +#: src/cmp.c:168 src/diff.c:905 src/diff3.c:456 src/sdiff.c:205 +msgid "--help Output this help." +msgstr "--help Åã¥Ü¦¹¨D§U»¡©ú¡C" + +#: src/cmp.c:177 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n" +msgstr "¥Îªk¡G%s [¿ï¶µ]... ÀÉ®×1 [ÀÉ®×2 [SKIP1 [SKIP2]]]\n" + +#: src/cmp.c:179 +msgid "Compare two files byte by byte." +msgstr "¤ñ¸û¨âÓÀɮתº¨C¤@Ӧ줸²Õ¡C" + +#: src/cmp.c:183 +msgid "SKIP1 and SKIP2 are the number of bytes to skip in each file." +msgstr "SKIP1 ©M SKIP2 ¬O¨CÓÀÉ®×·|²¤¹Lªº¦ì¤¸²Õ¼Æ¥Ø¡C" + +#: src/cmp.c:184 +msgid "" +"SKIP values may be followed by the following multiplicative suffixes:\n" +"kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +"GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y." +msgstr "" +"SKIP È¥i¥H¥[¤W¥H¤Uªº³æ¦ì¡G\n" +"kB=1000¡BK=1024¡BMB=1000000¡BM=1048576¡BGB=1000000000¡BG=1073741824¡A\n" +"ÁÙ¦³ T¡BP¡BE¡BZ¡BY ¦p¦¹Ãþ±À¡C" + +#: src/cmp.c:187 +msgid "If a FILE is `-' or missing, read standard input." +msgstr "¦pªGÀɮ׬O¡¥-¡¦©Î¨S¦³«ü©w¡A«h¥Ñ¼Ð·Ç¿é¤JŪ¤J¸ê®Æ¡C" + +#: src/cmp.c:188 src/diff.c:911 src/diff3.c:475 src/sdiff.c:223 +msgid "Report bugs to <bug-gnu-utils@gnu.org>." +msgstr "½Ð¦V <bug-gnu-utils@gnu.org> ¦^³ø¿ù»~¡C" + +#: src/cmp.c:231 +#, c-format +msgid "invalid --bytes value `%s'" +msgstr "µL®Äªº --bytes È¡¥%s¡¦" + +#: src/cmp.c:258 src/diff.c:734 src/diff3.c:333 src/sdiff.c:558 +#, c-format +msgid "missing operand after `%s'" +msgstr "¡¥%s¡¦«á¯Ê¤Ö¤F°Ñ¼Æ" + +#: src/cmp.c:270 src/diff.c:736 src/diff3.c:335 src/sdiff.c:560 +#, c-format +msgid "extra operand `%s'" +msgstr "¦h¾lªº°Ñ¼Æ¡¥%s¡¦" + +#: src/cmp.c:477 +#, c-format +msgid "%s %s differ: byte %s, line %s\n" +msgstr "%s %s ¤£¦P¡G²Ä %s ¦ì¤¸²Õ¡A²Ä %s ¦æ\n" + +#: src/cmp.c:495 +#, c-format +msgid "%s %s differ: byte %s, line %s is %3o %s %3o %s\n" +msgstr "%s %s ¤£¦P¡G²Ä %s ¦æ¡A²Ä %s ¦ì¤¸²Õ¬° %3o %s %3o %s\n" + +#: src/cmp.c:543 +#, c-format +msgid "cmp: EOF on %s\n" +msgstr "cmp¡G%s ¤wµ²§ô\n" + +#: src/diff.c:41 +msgid "" +"Written by Paul Eggert, Mike Haertel, David Hayes,\n" +"Richard Stallman, and Len Tower." +msgstr "" +"¥Ñ Paul Eggert¡BMike Haertel¡BDavid Hayes¡B\n" +"Richard Stallman ©M Len Tower ½s¼g¡C" + +#: src/diff.c:322 +#, c-format +msgid "invalid context length `%s'" +msgstr "µL®Äªº¤W¤U¤å¦æ¼Æ¡¥%s¡¦" + +#: src/diff.c:405 +msgid "pagination not supported on this host" +msgstr "¦¹¨t²Î¤£¤ä´©¤À¶" + +#: src/diff.c:420 src/diff3.c:315 +msgid "too many file label options" +msgstr "¤Ó¦h¦³ÃöÀɮ׼лxªº¿ï¶µ" + +#: src/diff.c:498 +#, c-format +msgid "invalid width `%s'" +msgstr "µL®Äªº¼e«×¡¥%s¡¦" + +#: src/diff.c:502 +msgid "conflicting width options" +msgstr "¤¬¬Û©èIJªº¼e«×¿ï¶µ" + +#: src/diff.c:526 +#, c-format +msgid "invalid horizon length `%s'" +msgstr "µL®Äªº¤ô¥ªø«×¡¥%s¡¦" + +#: src/diff.c:629 +#, c-format +msgid "`-%ld' option is obsolete; use `-%c %ld'" +msgstr "¡¥-%ld¡¦¿ï¶µ¤w¹L®É¡F½Ð¨Ï¥Î¡¥-%c %ld¡¦" + +#: src/diff.c:641 +#, c-format +msgid "`-%ld' option is obsolete; omit it" +msgstr "¡¥-%ld¡¦¿ï¶µ¤w¹L®É¡F·|©¿²¤¦¹¿ï¶µ" + +#: src/diff.c:709 +msgid "--from-file and --to-file both specified" +msgstr "¦P®É«ü©w¤F --from-file ¤Î --to-file ¿ï¶µ" + +#: src/diff.c:832 +msgid "Compare files line by line." +msgstr "¤ñ¸û¨âÓÀɮתº¨C¤@¦æ¡C" + +#: src/diff.c:834 +msgid "-i --ignore-case Ignore case differences in file contents." +msgstr "-i --ignore-case ¤£¤À¿ëÀɮפº®e¤¤ªº¤j¤p¼g¡C" + +#: src/diff.c:835 +msgid "--ignore-file-name-case Ignore case when comparing file names." +msgstr "--ignore-file-name-case ·í¤ñ¸ûÀɮצWºÙ®É¤£¤À¿ë¤j¤p¼g¡C" + +#: src/diff.c:836 +msgid "--no-ignore-file-name-case Consider case when comparing file names." +msgstr "--no-ignore-file-name-case ·í¤ñ¸ûÀɮצWºÙ®É·|¤À¿ë¤j¤p¼g¡C" + +#: src/diff.c:837 src/sdiff.c:186 +msgid "-E --ignore-tab-expansion Ignore changes due to tab expansion." +msgstr "-E --ignore-tab-expansion ©¿²¤¦]±N tab Âà´«¬°ªÅ®æ¦Ó³y¦¨ªº®t²§¡C" + +#: src/diff.c:838 src/sdiff.c:187 +msgid "-b --ignore-space-change Ignore changes in the amount of white space." +msgstr "-b --ignore-space-change ©¿²¤¦]ªÅ¥Õ¦r¤¸¼Æ¥Ø¤£¦P¦Ó³y¦¨ªº®t²§¡C" + +#: src/diff.c:839 +msgid "-w --ignore-all-space Ignore all white space." +msgstr "-w --ignore-all-space ©¿²¤©Ò¦³ªÅ¥Õ¦r¤¸¡C" + +#: src/diff.c:840 src/sdiff.c:189 +msgid "-B --ignore-blank-lines Ignore changes whose lines are all blank." +msgstr "-B --ignore-blank-lines ©¿²¤¥ô¦ó¦]ªÅ¦æ¦Ó³y¦¨ªº®t²§¡C" + +#: src/diff.c:841 src/sdiff.c:190 +msgid "" +"-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE." +msgstr "" +"-I RE --ignore-matching-lines=RE ©¿²¤¥ô¦ó²Å¦X«ü©wªº<¥¿³Wªí¥Ü¦¡>ªº¦a¤è¡C" + +#: src/diff.c:842 src/sdiff.c:191 +msgid "--strip-trailing-cr Strip trailing carriage return on input." +msgstr "--strip-trailing-cr ¥h°£¿é¤J¸ê®Æ¨C¦æ¥½ºÝªº carriage return ¦r¤¸¡C" + +#: src/diff.c:844 +msgid "--binary Read and write data in binary mode." +msgstr "--binary ¥H¤G¤¸½XÀɼҦ¡Åª¼g¸ê®Æ¡C" + +#: src/diff.c:846 src/diff3.c:451 src/sdiff.c:192 +msgid "-a --text Treat all files as text." +msgstr "-a --text ©Ò¦³Àɮ׳£¥H¤å¦rÀɤ覡³B²z¡C" + +#: src/diff.c:848 +msgid "" +"-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied " +"context.\n" +"-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified " +"context.\n" +" --label LABEL Use LABEL instead of file name.\n" +" -p --show-c-function Show which C function each change is in.\n" +" -F RE --show-function-line=RE Show the most recent line matching RE." +msgstr "" +"-c -C ¦æ¼Æ --context[=¦æ¼Æ] Åã¥Ü«ü©w<¦æ¼Æ>(¹w³] 3 ¦æ)copied ®æ¦¡ªº¤W¤U¤å\n" +"-u -U ¦æ¼Æ --unified[=¦æ¼Æ] Åã¥Ü«ü©w<¦æ¼Æ>(¹w³] 3 ¦æ)unified ®æ¦¡ªº¤W¤U" +"¤å\n" +" --label ¼Ð»x ¨Ï¥Î<¼Ð»x>¥N´ÀÀɮצWºÙ¡C\n" +" -p --show-c-function Åã¥Ü©M¨CÓ®t²§¦³Ãöªº C ¨ç¦¡¦WºÙ¡C\n" +" -F RE --show-function-line=RE Åã¥Ü³Ì±µªñ¦Ó²Å¦X<¥¿³Wªí¥Ü¦¡>ªº¤@¦æ¡C" + +#: src/diff.c:853 +msgid "-q --brief Output only whether files differ." +msgstr "-q --brief ¥uÅã¥ÜÀɮ׬O§_¤£¦P¡C" + +#: src/diff.c:854 +msgid "-e --ed Output an ed script." +msgstr "-e --ed ¥H ed script ¤è¦¡¿é¥X¡C" + +#: src/diff.c:855 +msgid "--normal Output a normal diff." +msgstr "--normal ¥H¥¿±`ªº diff ¤è¦¡¿é¥X¡C" + +#: src/diff.c:856 +msgid "-n --rcs Output an RCS format diff." +msgstr "-n --rcs ¥H RCS diff ®æ¦¡¿é¥X¡C" + +#: src/diff.c:857 +msgid "" +"-y --side-by-side Output in two columns.\n" +" -W NUM --width=NUM Output at most NUM (default 130) print columns.\n" +" --left-column Output only the left column of common lines.\n" +" --suppress-common-lines Do not output common lines." +msgstr "" +"-y --side-by-side ¥H¨â¦C¨Ã±Æªº¤è¦¡Åã¥Ü¡C\n" +" -W NUM --width=NUM ¨C¦æÅã¥Ü³Ì¦h NUM (¹w³] 130) Ó¦r¤¸¡C\n" +" --left-column ·í¦³¨â¦æ¬Û¦P®É¥uÅã¥Ü¥ªÃ䪺¤@¦æ¡C\n" +" --suppress-common-lines ·í¦³¨â¦æ¬Û¦P®É¤£·|Åã¥Ü¡C" + +#: src/diff.c:861 +msgid "-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs." +msgstr "-D NAME --ifdef=NAME ¿é¥Xªº¸ê®Æ¥H¡¥#ifdef NAME¡¦¤è¦¡¼Ð©ú®t²§¡C" + +#: src/diff.c:862 +msgid "" +"--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT." +msgstr "" +"--GTYPE-group-format=GFMT ®ÄªGÃþ¦ü¡A¦ý·|¥H GFMT ®æ¦¡³B²z GTYPE ¿é¤J¦æ²Õ¡C" + +#: src/diff.c:863 +msgid "--line-format=LFMT Similar, but format all input lines with LFMT." +msgstr "--line-format=LFMT ®ÄªGÃþ¦ü¡A¦ý·|¥H LFMT ®æ¦¡³B²z¨C¤@¦æ¸ê®Æ¡C" + +#: src/diff.c:864 +msgid "" +"--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT." +msgstr "" +"--LTYPE-line-format=LFMT ®ÄªGÃþ¦ü¡A¦ý·|¥H LFMT ®æ¦¡³B²z LTYPE ¿é¤J¦æ²Õ¡C" + +#: src/diff.c:865 +msgid " LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'." +msgstr "" +" LTYPE ¥i¥H¬O¡¥old¡¦¡B¡¥new¡¦©Î¡¥unchanged¡¦¡CGTYPE ¥i¥H¬O LTYPE ªº¿ï¾Ü\n" +" ©Î¬O¡¥changed¡¦¡C" + +#: src/diff.c:866 +msgid "" +" GFMT may contain:\n" +" %< lines from FILE1\n" +" %> lines from FILE2\n" +" %= lines common to FILE1 and FILE2\n" +" %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n" +" LETTERs are as follows for new group, lower case for old group:\n" +" F first line number\n" +" L last line number\n" +" N number of lines = L-F+1\n" +" E F-1\n" +" M L+1" +msgstr "" +" GFMT ¥i¥]¬A¡G\n" +" %< ¸Ó²Õ¤¤¨C¦æÄÝ©ó FILE1 ªº®t²§\n" +" %> ¸Ó²Õ¤¤¨C¦æÄÝ©ó FILE2 ªº®t²§\n" +" %= ¸Ó²Õ¤¤¦P®É¦b FILE1 ©M FILE2 ¥X²{ªº¨C¤@¦æ\n" +" %[-][¼e«×][.[ºë½T«×]]{doxX}¦r¤¸ ¥H printf ®æ¦¡ªí¥Ü¸Ó<¦r¤¸>¥Nªíªº¸ê®Æ\n" +" ¤j¼g<¦r¤¸>ªí¥ÜÄÝ©ó·sªºÀɮסA¤p¼gªí¥ÜÄÝ©óªºÀɮסC<¦r¤¸>ªº·N¸q¦p¤U¡G\n" +" F ¦æ²Õ¤¤²Ä¤@¦æªº¦æ¸¹\n" +" L ¦æ²Õ¤¤³Ì«á¤@¦æªº¦æ¸¹\n" +" N ¦æ¼Æ ( =L-F+1 )\n" +" E F-1\n" +" M L+1" + +#: src/diff.c:877 +msgid "" +" LFMT may contain:\n" +" %L contents of line\n" +" %l contents of line, excluding any trailing newline\n" +" %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number" +msgstr "" +" LFMT ¥i¥]¬A¡G\n" +" %L ¸Ó¦æªº¤º®e\n" +" %l ¸Ó¦æªº¤º®e¡A¦ý¤£¥]¬Aµ²§ôªº newline ¦r¤¸\n" +" %[-][¼e«×][.[ºë½T«×]]{doxX}n ¥H printf ®æ¦¡ªí¥Üªº¿é¤J¸ê®Æ¦æ¸¹" + +#: src/diff.c:881 +msgid "" +" Either GFMT or LFMT may contain:\n" +" %% %\n" +" %c'C' the single character C\n" +" %c'\\OOO' the character with octal code OOO" +msgstr "" +" GFMT ©Î LFMT ¥i¥]¬A¡G\n" +" %% %\n" +" %c'C' ¦r¤¸ C\n" +" %c'\\OOO' ¤K¶i¦ì¼Æ¦r OOO ©Ò¥Nªíªº¦r¤¸" + +#: src/diff.c:886 +msgid "-l --paginate Pass the output through `pr' to paginate it." +msgstr "-l --paginate ±N¿é¥X°e¦Ü¡¥pr¡¦«ü¥O¨Ó¤À¶¡C" + +#: src/diff.c:887 src/sdiff.c:198 +msgid "-t --expand-tabs Expand tabs to spaces in output." +msgstr "-t --expand-tabs ±N¿é¥X¤¤ªº tab ´«¦¨ªÅ®æ¡C" + +#: src/diff.c:888 src/diff3.c:452 +msgid "-T --initial-tab Make tabs line up by prepending a tab." +msgstr "-T --initial-tab ¨C¦æ¥ý¥[¤W tab ¦r¤¸¡A¨Ï tab ¦r¤¸¥i¥H¹ï»ô¡C" + +#: src/diff.c:890 +msgid "-r --recursive Recursively compare any subdirectories found." +msgstr "-r --recursive ³s¦P©Ò¦³°Æ¥Ø¿ý¤@°_¤ñ¸û¡C" + +#: src/diff.c:891 +msgid "-N --new-file Treat absent files as empty." +msgstr "-N --new-file ¤£¦s¦bªºÀÉ®×¥HªÅ¥ÕÀɮפ覡³B²z¡C" + +#: src/diff.c:892 +msgid "--unidirectional-new-file Treat absent first files as empty." +msgstr "--unidirectional-new-file Y²Ä¤@ÓÀɮפ£¦s¦b¡A¥HªÅ¥ÕÀɮ׳B²z¡C" + +#: src/diff.c:893 +msgid "-s --report-identical-files Report when two files are the same." +msgstr "-s --report-identical-files ·í¨âÓÀɮפ@¼Ë®É¤´µMÅã¥Üµ²ªG¡C" + +#: src/diff.c:894 +msgid "-x PAT --exclude=PAT Exclude files that match PAT." +msgstr "-x PAT --exclude=PAT ±Æ°£¼Ë¦¡¬° PAT ªºÀɮסC" + +#: src/diff.c:895 +msgid "" +"-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE." +msgstr "-X FILE --exclude-from=FILE ±Æ°£©Ò¦³¦b FILE ¤¤¦C¥Xªº¼Ë¦¡ªºÀɮסC" + +#: src/diff.c:896 +msgid "" +"-S FILE --starting-file=FILE Start with FILE when comparing directories." +msgstr "-S FILE --starting-file=FILE ·í¤ñ¸û¥Ø¿ý®É¡A¥Ñ FILE ¶}©l¤ñ¸û¡C" + +#: src/diff.c:897 +msgid "" +"--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory." +msgstr "" +"--from-file=FILE1 ±N FILE1 ©M°Ñ¼Æ¤¤ªº©Ò¦³ÀÉ®×/¥Ø¿ý§@¤ñ¸û¡CFILE1 ¥i¥H¬O¥Ø¿ý¡C" + +#: src/diff.c:898 +msgid "" +"--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory." +msgstr "" +"--to-file=FILE2 ±N°Ñ¼Æ¤¤ªº©Ò¦³ÀÉ®×/¥Ø¿ý©M FILE2 §@¤ñ¸û¡CFILE2 ¥i¥H¬O¥Ø¿ý¡C" + +#: src/diff.c:900 +msgid "--horizon-lines=NUM Keep NUM lines of the common prefix and suffix." +msgstr "--horizon-lines=NUM (¦¹¿ï¶µ¤£§@³B²z)" + +#: src/diff.c:901 src/sdiff.c:200 +msgid "-d --minimal Try hard to find a smaller set of changes." +msgstr "-d --minimal ºÉ¥i¯à§ä¥X³Ì¤pªº®t²§¡C" + +#: src/diff.c:902 +msgid "" +"--speed-large-files Assume large files and many scattered small changes." +msgstr "--speed-large-files °²³]ÀɮפQ¤À¤j¦Ó¥B·í¤¤§t¦³³\¦h¨Ç·Lªº®t²§¡C" + +#: src/diff.c:907 +msgid "" +"FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'." +msgstr "" +"FILES ªº®æ¦¡¥i¥H¬O¡¥FILE1 FILE2¡¦¡B¡¥DIR1 DIR2¡¦¡B¡¥DIR FILE...¡¦©Î\n" +" ¡¥FILE... DIR¡¦¡C" + +#: src/diff.c:908 +msgid "" +"If --from-file or --to-file is given, there are no restrictions on FILES." +msgstr "¦pªG¨Ï¥Î --from-file ©Î --to-file ¿ï¶µ¡AFILES ªº®æ¦¡«h¤£¨ü¨î¡C" + +#: src/diff.c:909 src/diff3.c:474 src/sdiff.c:222 +msgid "If a FILE is `-', read standard input." +msgstr "¦pªG FILE ¬O¡¥-¡¦¡A«h¥Ñ¼Ð·Ç¿é¤JŪ¨ú¸ê®Æ¡C" + +# It is intentional *not* to translate FILES -- maddog +#: src/diff.c:920 +#, c-format +msgid "Usage: %s [OPTION]... FILES\n" +msgstr "¥Îªk¡G%s [¿ï¶µ]... FILES\n" + +#: src/diff.c:949 +#, c-format +msgid "conflicting %s option value `%s'" +msgstr "¤¬¬Û¥Ù¬Þªº %s ¿ï¶µ¡A°Ñ¼ÆÈ¬°¡¥%s¡¦" + +#: src/diff.c:962 +msgid "conflicting output style options" +msgstr "¤¬¬Û¥Ù¬Þªº¿é¥X¼Ò¦¡¿ï¶µ" + +#: src/diff.c:976 +msgid "regular empty file" +msgstr "´¶³qªÅ¥ÕÀÉ®×" + +#: src/diff.c:976 +msgid "regular file" +msgstr "´¶³qÀÉ®×" + +#: src/diff.c:978 +msgid "directory" +msgstr "¥Ø¿ý" + +#: src/diff.c:981 +msgid "block special file" +msgstr "°Ï¶ô¯S®íÀÉ®×" + +#: src/diff.c:984 +msgid "character special file" +msgstr "¦r¤¸¯S®íÀÉ®×" + +#: src/diff.c:987 +msgid "fifo" +msgstr "fifo" + +#: src/diff.c:991 +msgid "socket" +msgstr "socket" + +#: src/diff.c:994 +msgid "message queue" +msgstr "°T®§¦î¦C" + +#: src/diff.c:997 +msgid "semaphore" +msgstr "semaphore" + +#: src/diff.c:1000 +msgid "shared memory object" +msgstr "¤À¨É°O¾Ðª«¥ó" + +#: src/diff.c:1003 +msgid "typed memory object" +msgstr "¤ÀÃþ°O¾Ðª«¥ó" + +#: src/diff.c:1006 +msgid "weird file" +msgstr "¤£´M±`ªºÀÉ®×" + +#: src/diff.c:1070 src/diff.c:1256 +#, c-format +msgid "Only in %s: %s\n" +msgstr "¥u¦b %s ¦s¦b¡G%s\n" + +#: src/diff.c:1193 +msgid "cannot compare `-' to a directory" +msgstr "¡¥-¡¦µLªk»P¥Ø¿ý§@¤ñ¸û" + +#: src/diff.c:1220 +msgid "-D option not supported with directories" +msgstr "-D ¿ï¶µ¤£¥i°t¦X¥Ø¿ý¨Ï¥Î" + +#: src/diff.c:1229 +#, c-format +msgid "Common subdirectories: %s and %s\n" +msgstr "%s ©M %s ¦³¦@¦Pªº°Æ¥Ø¿ý\n" + +#: src/diff.c:1266 +#, c-format +msgid "File %s is a %s while file %s is a %s\n" +msgstr "ÀÉ®× %s ¬O%s¦ÓÀÉ®× %s ¬O%s\n" + +#: src/diff.c:1345 +#, c-format +msgid "Files %s and %s are identical\n" +msgstr "ÀÉ®× %s ©M %s ¬Û¦P\n" + +#: src/diff3.c:26 +msgid "Written by Randy Smith." +msgstr "¥Ñ Randy Smith ½s¼g¡C" + +#: src/diff3.c:328 +msgid "incompatible options" +msgstr "¤£Ý®eªº¿ï¶µ" + +#: src/diff3.c:368 +msgid "`-' specified for more than one input file" +msgstr "¦h©ó¤@Óªº¿é¤JÀɬO¡¥-¡¦" + +#: src/diff3.c:408 src/diff3.c:1232 src/diff3.c:1645 src/diff3.c:1700 +#: src/sdiff.c:305 src/sdiff.c:879 src/sdiff.c:890 +msgid "read failed" +msgstr "Ū¨ú¸ê®Æ¥¢±Ñ" + +#: src/diff3.c:441 +msgid "-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE." +msgstr "" +"-e --ed ¨ú¥X¥Ñ OLDFILE ¦Ü YOURFILE ªº§ó§ï³¡¥÷¡A¨Ã¿é¥X¥i±N¦¹\n" +" §ïÅÜ®M¥Î¦Ü MYFILE ªº ed script¡C" + +#: src/diff3.c:442 +msgid "-E --show-overlap Output unmerged changes, bracketing conflicts." +msgstr "-E --show-overlap Åã¥Ü¥¼¦X¨Öªº§ó§ï³¡¥÷¡A¨Ã¬A¤W¤¬¬Û©èIJªº¦a¤è¡C" + +#: src/diff3.c:443 +msgid "-A --show-all Output all changes, bracketing conflicts." +msgstr "-A --show-all Åã¥Ü©Ò¦³n§ó§ïªº³¡¥÷¡A¨Ã¬A¤W¤¬¬Û©èIJªº¦a¤è¡C" + +#: src/diff3.c:444 +msgid "-x --overlap-only Output overlapping changes." +msgstr "-x --overlap-only ¥uÅã¥Ü«Å|ªº§ó§ï³¡¥÷¡C" + +#: src/diff3.c:445 +msgid "-X Output overlapping changes, bracketing them." +msgstr "-X Åã¥Ü«Å|ªº§ó§ï³¡¥÷¡A¨Ã¬A¤W°O¸¹¡C" + +#: src/diff3.c:446 +msgid "-3 --easy-only Output unmerged nonoverlapping changes." +msgstr "-3 --easy-only Åã¥Ü¥¼¦X¨Ö¦Ó¥B¤£«Å|ªº§ó§ï³¡¥÷¡C" + +#: src/diff3.c:448 +msgid "-m --merge Output merged file instead of ed script (default -A)." +msgstr "-m --merge Åã¥Ü¦X¨Ö«áªºÀɮצӤ£¬O ed script (¹w³]¥[¤W -A)¡C" + +#: src/diff3.c:449 +msgid "-L LABEL --label=LABEL Use LABEL instead of file name." +msgstr "-L ¼Ð»x --label=¼Ð»x ¥H<¼Ð»x>¥N´ÀÀɮצWºÙ¡C" + +#: src/diff3.c:450 +msgid "-i Append `w' and `q' commands to ed scripts." +msgstr "-i ¦b ed script ¤¤ªþ¥[¡¥w¡¦©M¡¥q¡¦«ü¥O¡C" + +#: src/diff3.c:453 src/sdiff.c:202 +msgid "--diff-program=PROGRAM Use PROGRAM to compare files." +msgstr "--diff-program=µ{¦¡ ¨Ï¥Î<µ{¦¡>¨Ó¤ñ¸ûÀɮסC" + +#: src/diff3.c:465 +#, c-format +msgid "Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n" +msgstr "¥Îªk¡G%s [¿ï¶µ]... MYFILE OLDFILE YOURFILE\n" + +#: src/diff3.c:467 +msgid "Compare three files line by line." +msgstr "¤ñ¸û¤TÓÀɮתº¨C¤@¦æ¡C" + +#: src/diff3.c:673 +msgid "internal error: screwup in format of diff blocks" +msgstr "¤º³¡¿ù»~¡Gdiff °Ï¬qªº®æ¦¡¥X¿ù" + +#: src/diff3.c:971 +#, c-format +msgid "%s: diff failed: " +msgstr "%s¡Gdiff ¥¢±Ñ¡G" + +#: src/diff3.c:993 +msgid "internal error: invalid diff type in process_diff" +msgstr "¤º³¡¿ù»~¡Gprocess_diff ¤¤ªº diff Ãþ«¬µL®Ä" + +#: src/diff3.c:1018 +msgid "invalid diff format; invalid change separator" +msgstr "µL®Äªº diff ®æ¦¡¡Fªí¥Ü¸ê®ÆÅܧ󪺤À¹j¦r¦êµL®Ä" + +#: src/diff3.c:1242 +msgid "invalid diff format; incomplete last line" +msgstr "µL®Äªº diff ®æ¦¡¡F³Ì«á¤@¦æ¤£§¹¾ã" + +#: src/diff3.c:1265 src/sdiff.c:273 +#, c-format +msgid "subsidiary program `%s' not executable" +msgstr "©Ò»Ýªºµ{¦¡¡¥%s¡¦µLªk°õ¦æ" + +#: src/diff3.c:1268 src/sdiff.c:276 src/util.c:298 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "§ä¤£¨ì©Ò»Ýªºµ{¦¡¡¥%s¡¦" + +#: src/diff3.c:1272 src/sdiff.c:268 src/util.c:301 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "µ{¦¡¡¥%s¡¦¦^¶Ç¿ù»~" + +#: src/diff3.c:1294 +msgid "invalid diff format; incorrect leading line chars" +msgstr "diff ®æ¦¡µL®Ä¡F¬Y¦æªº²Ä¤@Ó¦r¤¸¤£¥¿½T" + +#: src/diff3.c:1370 +msgid "internal error: invalid diff type passed to output" +msgstr "¤º³¡¿ù»~¡G·Ç³Æ¿é¥Xªº diff ¸ê®ÆÃþ«¬µL®Ä" + +#: src/diff3.c:1647 src/diff3.c:1704 +msgid "input file shrank" +msgstr "¿é¤JÀÉÁY¤p" + +#: src/dir.c:162 +#, c-format +msgid "cannot compare file names `%s' and `%s'" +msgstr "µLªk¤ñ¸ûÀɮצWºÙ¡¥%s¡¦©M¡¥%s¡¦" + +#: src/sdiff.c:35 +msgid "Written by Thomas Lord." +msgstr "¥Ñ Thomas Lord ½s¼g¡C" + +#: src/sdiff.c:183 +msgid "-o FILE --output=FILE Operate interactively, sending output to FILE." +msgstr "-o ÀÉ®× --output=ÀÉ®× ¤¬°Ê¦¡¾Þ§@¡A¨Ã±Nµ²ªG¼g¤J¦Ü<ÀÉ®×>¡C" + +#: src/sdiff.c:185 +msgid "-i --ignore-case Consider upper- and lower-case to be the same." +msgstr "-i --ignore-case ¤£¤À¿ëÀɮפº®e¤¤ªº¤j¤p¼g¡C" + +#: src/sdiff.c:188 +msgid "-W --ignore-all-space Ignore all white space." +msgstr "-W --ignore-all-space ©¿²¤©Ò¦³ªÅ¥Õ¦r¤¸¡C" + +#: src/sdiff.c:194 +msgid "-w NUM --width=NUM Output at most NUM (default 130) columns per line." +msgstr "-w NUM --width=NUM ¨C¦æÅã¥Ü³Ì¦h NUM¡]¹w³] 130¡^Ó¦r¤¸¡C" + +#: src/sdiff.c:195 +msgid "-l --left-column Output only the left column of common lines." +msgstr "-l --left-column ·í¦³¨â¦æ¬Û¦P®É¥uÅã¥Ü¥ªÃ䪺¤@¦æ¡C" + +#: src/sdiff.c:196 +msgid "-s --suppress-common-lines Do not output common lines." +msgstr "-s --suppress-common-lines ·í¦³¨â¦æ¬Û¦P®É¤£·|Åã¥Ü¡C" + +#: src/sdiff.c:201 +msgid "" +"-H --speed-large-files Assume large files and many scattered small changes." +msgstr "-H --speed-large-files °²³]ÀɮפQ¤À¤j¦Ó¥B·í¤¤§t¦³³\¦h¨Ç·Lªº®t²§¡C" + +#: src/sdiff.c:214 +#, c-format +msgid "Usage: %s [OPTION]... FILE1 FILE2\n" +msgstr "¥Îªk¡G%s [¿ï¶µ]... ÀÉ®×1 ÀÉ®×2\n" + +#: src/sdiff.c:215 +msgid "Side-by-side merge of file differences." +msgstr "¥H¨Ã±Æ¤è¦¡¦X¨ÖÀɮפ§¶¡ªº®t²§¡C" + +#: src/sdiff.c:327 +msgid "cannot interactively merge standard input" +msgstr "¤£¤¹³\¥H¤¬°Ê¤è¦¡¦X¨Ö¼Ð·Ç¿é¤Jªº¸ê®Æ" + +#: src/sdiff.c:588 +msgid "both files to be compared are directories" +msgstr "¨âÓn¤ñ¸ûªº³£¬O¥Ø¿ý" + +#: src/sdiff.c:853 +msgid "" +"ed:\tEdit then use both versions, each decorated with a header.\n" +"eb:\tEdit then use both versions.\n" +"el:\tEdit then use the left version.\n" +"er:\tEdit then use the right version.\n" +"e:\tEdit a new version.\n" +"l:\tUse the left version.\n" +"r:\tUse the right version.\n" +"s:\tSilently include common lines.\n" +"v:\tVerbosely include common lines.\n" +"q:\tQuit.\n" +msgstr "" +"ed¡G\t½s¿è¨âÃ䪺ª©¥»¦X¨Ö«áªº¸ê®Æ¡A¦Uª©¥»¤À§O¥[¤W¼ÐÀY¥H¸êÃѧO¡C\n" +"eb¡G\t½s¿è¨âÃ䪺ª©¥»¦X¨Ö«áªº¸ê®Æ¡C\n" +"el¡G\t¨Ï¥Î¥ªÃ䪺ª©¥»¨Ó¶i¦æ½s¿è¡C\n" +"er¡G\t¨Ï¥Î¥kÃ䪺ª©¥»¨Ó¶i¦æ½s¿è¡C\n" +"e ¡G\t½s¿è·sªºª©¥»¡C\n" +"l ¡G\t¨Ï¥Î¥ªÃ䪺ª©¥»¡C\n" +"r ¡G\t¨Ï¥Î¥kÃ䪺ª©¥»¡C\n" +"s ¡G\t¥[¤W¨âÃä¤@¼Ëªº¦æ²Õ®É¤£¦bµe±Åã¥Ü¡C\n" +"v ¡G\t¥[¤W¨âÃä¤@¼Ëªº¦æ²Õ®É·|¦bµe±Åã¥Ü¡C\n" +"q ¡G\tÂ÷¶}¡C\n" + +#~ msgid "--inhibit-hunk-merge Do not merge hunks." +#~ msgstr "--inhibit-hunk-merge (¦¹¿ï¶µ¤£§@³B²z)" + +#~ msgid "" +#~ "SKIP values may be followed by the following multiplicative suffixes:\n" +#~ msgstr "SKIP È¥i¥H¥[¤W¥H¤Uªº³æ¦ì¡G\n" + +#~ msgid "kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n" +#~ msgstr "kB 1000¡BK 1024¡BMB 1,000,000¡BM 1,048,576¡B\n" + +#~ msgid "GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y.\n" +#~ msgstr "GB 1,000,000,000¡BG 1,073,741,824¡BÁÙ¦³ T¡BP¡BE¡BZ¡BY ¦p¦¹Ãþ±À¡C\n" + +#~ msgid "multiple `--from-file' options" +#~ msgstr "¡¥--from-file¡¦¿ï¶µ¤£¥i¨Ï¥Î¦h©ó¤@¦¸" + +#~ msgid "multiple `--to-file' options" +#~ msgstr "¡¥--to-file¡¦¿ï¶µ¤£¥i¨Ï¥Î¦h©ó¤@¦¸" + +#~ msgid "regular executable file" +#~ msgstr "¥¿±`¥i°õ¦æÀÉ" + +#~ msgid "If a FILE is `-', read standard input.\n" +#~ msgstr "¦pªGÀɮ׬O¡¥-¡¦¡A«h¥Ñ¼Ð·Ç¿é¤JŪ¤J¸ê®Æ¡C\n" diff --git a/gnu/dist/diffutils/src/Makefile.am b/gnu/dist/diffutils/src/Makefile.am new file mode 100644 index 00000000000..9d382a5af0e --- /dev/null +++ b/gnu/dist/diffutils/src/Makefile.am @@ -0,0 +1,44 @@ +# Automakefile for GNU diffutils programs. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +bin_PROGRAMS = cmp diff diff3 sdiff + +noinst_HEADERS = diff.h system.h + +localedir = $(datadir)/locale + +AM_CPPFLAGS = -I../lib -I$(top_srcdir)/lib +DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ + +LDADD = ../lib/libdiffutils.a @LIBINTL@ +diff_LDADD = $(LDADD) @LIB_CLOCK_GETTIME@ + +cmp_SOURCES = cmp.c version.c +diff3_SOURCES = diff3.c version.c +sdiff_SOURCES = sdiff.c version.c +diff_SOURCES = \ + analyze.c context.c diff.c dir.c ed.c ifdef.c io.c \ + normal.c side.c util.c version.c + +MAINTAINERCLEANFILES = $(srcdir)/version.c + +$(srcdir)/version.c: $(top_srcdir)/configure.ac + (echo '#include <config.h>' && \ + echo 'char const version_string[] = "(GNU $(PACKAGE)) $(VERSION)";') \ + >$@ diff --git a/gnu/dist/diffutils/src/Makefile.in b/gnu/dist/diffutils/src/Makefile.in new file mode 100644 index 00000000000..287f368da82 --- /dev/null +++ b/gnu/dist/diffutils/src/Makefile.in @@ -0,0 +1,418 @@ +# Makefile.in generated by automake 1.6 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# 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@ + +# Automakefile for GNU diffutils programs. + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CPP = @CPP@ +DATADIRNAME = @DATADIRNAME@ +DEPDIR = @DEPDIR@ +GENCAT = @GENCAT@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +HAVE_LIB = @HAVE_LIB@ +HELP2MAN = @HELP2MAN@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +LIB = @LIB@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ +LTLIB = @LTLIB@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +PACKAGE = @PACKAGE@ +POSUB = @POSUB@ +PR_PROGRAM = @PR_PROGRAM@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +U = @U@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ + +bin_PROGRAMS = cmp diff diff3 sdiff + +noinst_HEADERS = diff.h system.h + +localedir = $(datadir)/locale + +AM_CPPFLAGS = -I../lib -I$(top_srcdir)/lib +DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ + +LDADD = ../lib/libdiffutils.a @LIBINTL@ +diff_LDADD = $(LDADD) @LIB_CLOCK_GETTIME@ + +cmp_SOURCES = cmp.c version.c +diff3_SOURCES = diff3.c version.c +sdiff_SOURCES = sdiff.c version.c +diff_SOURCES = \ + analyze.c context.c diff.c dir.c ed.c ifdef.c io.c \ + normal.c side.c util.c version.c + + +MAINTAINERCLEANFILES = $(srcdir)/version.c +subdir = src +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = cmp$(EXEEXT) diff$(EXEEXT) diff3$(EXEEXT) sdiff$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +am_cmp_OBJECTS = cmp.$(OBJEXT) version.$(OBJEXT) +cmp_OBJECTS = $(am_cmp_OBJECTS) +cmp_LDADD = $(LDADD) +cmp_DEPENDENCIES = ../lib/libdiffutils.a +cmp_LDFLAGS = +am_diff_OBJECTS = analyze.$(OBJEXT) context.$(OBJEXT) diff.$(OBJEXT) \ + dir.$(OBJEXT) ed.$(OBJEXT) ifdef.$(OBJEXT) io.$(OBJEXT) \ + normal.$(OBJEXT) side.$(OBJEXT) util.$(OBJEXT) \ + version.$(OBJEXT) +diff_OBJECTS = $(am_diff_OBJECTS) +diff_DEPENDENCIES = ../lib/libdiffutils.a +diff_LDFLAGS = +am_diff3_OBJECTS = diff3.$(OBJEXT) version.$(OBJEXT) +diff3_OBJECTS = $(am_diff3_OBJECTS) +diff3_LDADD = $(LDADD) +diff3_DEPENDENCIES = ../lib/libdiffutils.a +diff3_LDFLAGS = +am_sdiff_OBJECTS = sdiff.$(OBJEXT) version.$(OBJEXT) +sdiff_OBJECTS = $(am_sdiff_OBJECTS) +sdiff_LDADD = $(LDADD) +sdiff_DEPENDENCIES = ../lib/libdiffutils.a +sdiff_LDFLAGS = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/analyze.Po ./$(DEPDIR)/cmp.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/context.Po ./$(DEPDIR)/diff.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/diff3.Po ./$(DEPDIR)/dir.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ed.Po ./$(DEPDIR)/ifdef.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/io.Po ./$(DEPDIR)/normal.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/sdiff.Po ./$(DEPDIR)/side.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/util.Po ./$(DEPDIR)/version.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +DIST_SOURCES = $(cmp_SOURCES) $(diff_SOURCES) $(diff3_SOURCES) \ + $(sdiff_SOURCES) +HEADERS = $(noinst_HEADERS) + +DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in +SOURCES = $(cmp_SOURCES) $(diff_SOURCES) $(diff3_SOURCES) $(sdiff_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnits src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + p1=`echo "$$p1" | sed -e 's,^.*/,,'`; \ + f=`echo $$p1|sed '$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + f=`echo "$$f" | sed -e 's,^.*/,,'`; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +cmp$(EXEEXT): $(cmp_OBJECTS) $(cmp_DEPENDENCIES) + @rm -f cmp$(EXEEXT) + $(LINK) $(cmp_LDFLAGS) $(cmp_OBJECTS) $(cmp_LDADD) $(LIBS) +diff$(EXEEXT): $(diff_OBJECTS) $(diff_DEPENDENCIES) + @rm -f diff$(EXEEXT) + $(LINK) $(diff_LDFLAGS) $(diff_OBJECTS) $(diff_LDADD) $(LIBS) +diff3$(EXEEXT): $(diff3_OBJECTS) $(diff3_DEPENDENCIES) + @rm -f diff3$(EXEEXT) + $(LINK) $(diff3_LDFLAGS) $(diff3_OBJECTS) $(diff3_LDADD) $(LIBS) +sdiff$(EXEEXT): $(sdiff_OBJECTS) $(sdiff_DEPENDENCIES) + @rm -f sdiff$(EXEEXT) + $(LINK) $(sdiff_LDFLAGS) $(sdiff_OBJECTS) $(sdiff_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/analyze.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifdef.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdiff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/side.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ + +distclean-depend: + -rm -rf ./$(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f $< || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` +CCDEPMODE = @CCDEPMODE@ +uninstall-info-am: + +ETAGS = etags +ETAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_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 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + 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: + $(mkinstalldirs) $(DESTDIR)$(bindir) + +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_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) stamp-h stamp-h[0-9]* + +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-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic distclean distclean-compile distclean-depend \ + distclean-generic distclean-tags distdir dvi dvi-am info \ + info-am install install-am install-binPROGRAMS install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-info-am + + +$(srcdir)/version.c: $(top_srcdir)/configure.ac + (echo '#include <config.h>' && \ + echo 'char const version_string[] = "(GNU $(PACKAGE)) $(VERSION)";') \ + >$@ +# 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/gnu/dist/diffutils/src/analyze.c b/gnu/dist/diffutils/src/analyze.c new file mode 100644 index 00000000000..4271d23bf2f --- /dev/null +++ b/gnu/dist/diffutils/src/analyze.c @@ -0,0 +1,1070 @@ +/* $NetBSD: analyze.c,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* Analyze file differences for GNU DIFF. + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* The basic algorithm is described in: + "An O(ND) Difference Algorithm and its Variations", Eugene Myers, + Algorithmica Vol. 1 No. 2, 1986, pp. 251-266; + see especially section 4.2, which describes the variation used below. + Unless the --minimal option is specified, this code uses the TOO_EXPENSIVE + heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N) + at the price of producing suboptimal output for large inputs with + many differences. + + The basic algorithm was independently discovered as described in: + "Algorithms for Approximate String Matching", E. Ukkonen, + Information and Control Vol. 64, 1985, pp. 100-118. */ + +#include "diff.h" +#include <cmpbuf.h> +#include <error.h> +#include <regex.h> +#include <xalloc.h> + +static lin *xvec, *yvec; /* Vectors being compared. */ +static lin *fdiag; /* Vector, indexed by diagonal, containing + 1 + the X coordinate of the point furthest + along the given diagonal in the forward + search of the edit matrix. */ +static lin *bdiag; /* Vector, indexed by diagonal, containing + the X coordinate of the point furthest + along the given diagonal in the backward + search of the edit matrix. */ +static lin too_expensive; /* Edit scripts longer than this are too + expensive to compute. */ + +#define SNAKE_LIMIT 20 /* Snakes bigger than this are considered `big'. */ + +struct partition +{ + lin xmid, ymid; /* Midpoints of this partition. */ + bool lo_minimal; /* Nonzero if low half will be analyzed minimally. */ + bool hi_minimal; /* Likewise for high half. */ +}; + +/* Find the midpoint of the shortest edit script for a specified + portion of the two files. + + Scan from the beginnings of the files, and simultaneously from the ends, + doing a breadth-first search through the space of edit-sequence. + When the two searches meet, we have found the midpoint of the shortest + edit sequence. + + If FIND_MINIMAL is nonzero, find the minimal edit script regardless + of expense. Otherwise, if the search is too expensive, use + heuristics to stop the search and report a suboptimal answer. + + Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number + XMID - YMID equals the number of inserted lines minus the number + of deleted lines (counting only lines before the midpoint). + Return the approximate edit cost; this is the total number of + lines inserted or deleted (counting only lines before the midpoint), + unless a heuristic is used to terminate the search prematurely. + + Set PART->lo_minimal to true iff the minimal edit script for the + left half of the partition is known; similarly for PART->hi_minimal. + + This function assumes that the first lines of the specified portions + of the two files do not match, and likewise that the last lines do not + match. The caller must trim matching lines from the beginning and end + of the portions it is going to specify. + + If we return the "wrong" partitions, + the worst this can do is cause suboptimal diff output. + It cannot cause incorrect diff output. */ + +static lin +diag (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal, + struct partition *part) +{ + lin *const fd = fdiag; /* Give the compiler a chance. */ + lin *const bd = bdiag; /* Additional help for the compiler. */ + lin const *const xv = xvec; /* Still more help for the compiler. */ + lin const *const yv = yvec; /* And more and more . . . */ + lin const dmin = xoff - ylim; /* Minimum valid diagonal. */ + lin const dmax = xlim - yoff; /* Maximum valid diagonal. */ + lin const fmid = xoff - yoff; /* Center diagonal of top-down search. */ + lin const bmid = xlim - ylim; /* Center diagonal of bottom-up search. */ + lin fmin = fmid, fmax = fmid; /* Limits of top-down search. */ + lin bmin = bmid, bmax = bmid; /* Limits of bottom-up search. */ + lin c; /* Cost. */ + bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd + diagonal with respect to the northwest. */ + + fd[fmid] = xoff; + bd[bmid] = xlim; + + for (c = 1;; ++c) + { + lin d; /* Active diagonal. */ + bool big_snake = 0; + + /* Extend the top-down search by an edit step in each diagonal. */ + fmin > dmin ? fd[--fmin - 1] = -1 : ++fmin; + fmax < dmax ? fd[++fmax + 1] = -1 : --fmax; + for (d = fmax; d >= fmin; d -= 2) + { + lin x, y, oldx, tlo = fd[d - 1], thi = fd[d + 1]; + + if (tlo >= thi) + x = tlo + 1; + else + x = thi; + oldx = x; + y = x - d; + while (x < xlim && y < ylim && xv[x] == yv[y]) + ++x, ++y; + if (x - oldx > SNAKE_LIMIT) + big_snake = 1; + fd[d] = x; + if (odd && bmin <= d && d <= bmax && bd[d] <= x) + { + part->xmid = x; + part->ymid = y; + part->lo_minimal = part->hi_minimal = 1; + return 2 * c - 1; + } + } + + /* Similarly extend the bottom-up search. */ + bmin > dmin ? bd[--bmin - 1] = LIN_MAX : ++bmin; + bmax < dmax ? bd[++bmax + 1] = LIN_MAX : --bmax; + for (d = bmax; d >= bmin; d -= 2) + { + lin x, y, oldx, tlo = bd[d - 1], thi = bd[d + 1]; + + if (tlo < thi) + x = tlo; + else + x = thi - 1; + oldx = x; + y = x - d; + while (x > xoff && y > yoff && xv[x - 1] == yv[y - 1]) + --x, --y; + if (oldx - x > SNAKE_LIMIT) + big_snake = 1; + bd[d] = x; + if (!odd && fmin <= d && d <= fmax && x <= fd[d]) + { + part->xmid = x; + part->ymid = y; + part->lo_minimal = part->hi_minimal = 1; + return 2 * c; + } + } + + if (find_minimal) + continue; + + /* Heuristic: check occasionally for a diagonal that has made + lots of progress compared with the edit distance. + If we have any such, find the one that has made the most + progress and return it as if it had succeeded. + + With this heuristic, for files with a constant small density + of changes, the algorithm is linear in the file size. */ + + if (200 < c && big_snake && speed_large_files) + { + lin best; + + best = 0; + for (d = fmax; d >= fmin; d -= 2) + { + lin dd = d - fmid; + lin x = fd[d]; + lin y = x - d; + lin v = (x - xoff) * 2 - dd; + if (v > 12 * (c + (dd < 0 ? -dd : dd))) + { + if (v > best + && xoff + SNAKE_LIMIT <= x && x < xlim + && yoff + SNAKE_LIMIT <= y && y < ylim) + { + /* We have a good enough best diagonal; + now insist that it end with a significant snake. */ + int k; + + for (k = 1; xv[x - k] == yv[y - k]; k++) + if (k == SNAKE_LIMIT) + { + best = v; + part->xmid = x; + part->ymid = y; + break; + } + } + } + } + if (best > 0) + { + part->lo_minimal = 1; + part->hi_minimal = 0; + return 2 * c - 1; + } + + best = 0; + for (d = bmax; d >= bmin; d -= 2) + { + lin dd = d - bmid; + lin x = bd[d]; + lin y = x - d; + lin v = (xlim - x) * 2 + dd; + if (v > 12 * (c + (dd < 0 ? -dd : dd))) + { + if (v > best + && xoff < x && x <= xlim - SNAKE_LIMIT + && yoff < y && y <= ylim - SNAKE_LIMIT) + { + /* We have a good enough best diagonal; + now insist that it end with a significant snake. */ + int k; + + for (k = 0; xv[x + k] == yv[y + k]; k++) + if (k == SNAKE_LIMIT - 1) + { + best = v; + part->xmid = x; + part->ymid = y; + break; + } + } + } + } + if (best > 0) + { + part->lo_minimal = 0; + part->hi_minimal = 1; + return 2 * c - 1; + } + } + + /* Heuristic: if we've gone well beyond the call of duty, + give up and report halfway between our best results so far. */ + if (c >= too_expensive) + { + lin fxybest, fxbest; + lin bxybest, bxbest; + + fxbest = bxbest = 0; /* Pacify `gcc -Wall'. */ + + /* Find forward diagonal that maximizes X + Y. */ + fxybest = -1; + for (d = fmax; d >= fmin; d -= 2) + { + lin x = MIN (fd[d], xlim); + lin y = x - d; + if (ylim < y) + x = ylim + d, y = ylim; + if (fxybest < x + y) + { + fxybest = x + y; + fxbest = x; + } + } + + /* Find backward diagonal that minimizes X + Y. */ + bxybest = LIN_MAX; + for (d = bmax; d >= bmin; d -= 2) + { + lin x = MAX (xoff, bd[d]); + lin y = x - d; + if (y < yoff) + x = yoff + d, y = yoff; + if (x + y < bxybest) + { + bxybest = x + y; + bxbest = x; + } + } + + /* Use the better of the two diagonals. */ + if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff)) + { + part->xmid = fxbest; + part->ymid = fxybest - fxbest; + part->lo_minimal = 1; + part->hi_minimal = 0; + } + else + { + part->xmid = bxbest; + part->ymid = bxybest - bxbest; + part->lo_minimal = 0; + part->hi_minimal = 1; + } + return 2 * c - 1; + } + } +} + +/* Compare in detail contiguous subsequences of the two files + which are known, as a whole, to match each other. + + The results are recorded in the vectors files[N].changed, by + storing 1 in the element for each line that is an insertion or deletion. + + The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1. + + Note that XLIM, YLIM are exclusive bounds. + All line numbers are origin-0 and discarded lines are not counted. + + If FIND_MINIMAL, find a minimal difference no matter how + expensive it is. */ + +static void +compareseq (lin xoff, lin xlim, lin yoff, lin ylim, bool find_minimal) +{ + lin * const xv = xvec; /* Help the compiler. */ + lin * const yv = yvec; + + /* Slide down the bottom initial diagonal. */ + while (xoff < xlim && yoff < ylim && xv[xoff] == yv[yoff]) + ++xoff, ++yoff; + /* Slide up the top initial diagonal. */ + while (xlim > xoff && ylim > yoff && xv[xlim - 1] == yv[ylim - 1]) + --xlim, --ylim; + + /* Handle simple cases. */ + if (xoff == xlim) + while (yoff < ylim) + files[1].changed[files[1].realindexes[yoff++]] = 1; + else if (yoff == ylim) + while (xoff < xlim) + files[0].changed[files[0].realindexes[xoff++]] = 1; + else + { + lin c; + struct partition part; + + /* Find a point of correspondence in the middle of the files. */ + + c = diag (xoff, xlim, yoff, ylim, find_minimal, &part); + + if (c == 1) + { + /* This should be impossible, because it implies that + one of the two subsequences is empty, + and that case was handled above without calling `diag'. + Let's verify that this is true. */ + abort (); +#if 0 + /* The two subsequences differ by a single insert or delete; + record it and we are done. */ + if (part.xmid - part.ymid < xoff - yoff) + files[1].changed[files[1].realindexes[part.ymid - 1]] = 1; + else + files[0].changed[files[0].realindexes[part.xmid]] = 1; +#endif + } + else + { + /* Use the partitions to split this problem into subproblems. */ + compareseq (xoff, part.xmid, yoff, part.ymid, part.lo_minimal); + compareseq (part.xmid, xlim, part.ymid, ylim, part.hi_minimal); + } + } +} + +/* Discard lines from one file that have no matches in the other file. + + A line which is discarded will not be considered by the actual + comparison algorithm; it will be as if that line were not in the file. + The file's `realindexes' table maps virtual line numbers + (which don't count the discarded lines) into real line numbers; + this is how the actual comparison algorithm produces results + that are comprehensible when the discarded lines are counted. + + When we discard a line, we also mark it as a deletion or insertion + so that it will be printed in the output. */ + +static void +discard_confusing_lines (struct file_data filevec[]) +{ + int f; + lin i; + char *discarded[2]; + lin *equiv_count[2]; + lin *p; + + /* Allocate our results. */ + p = xmalloc ((filevec[0].buffered_lines + filevec[1].buffered_lines) + * (2 * sizeof *p)); + for (f = 0; f < 2; f++) + { + filevec[f].undiscarded = p; p += filevec[f].buffered_lines; + filevec[f].realindexes = p; p += filevec[f].buffered_lines; + } + + /* Set up equiv_count[F][I] as the number of lines in file F + that fall in equivalence class I. */ + + p = zalloc (filevec[0].equiv_max * (2 * sizeof *p)); + equiv_count[0] = p; + equiv_count[1] = p + filevec[0].equiv_max; + + for (i = 0; i < filevec[0].buffered_lines; ++i) + ++equiv_count[0][filevec[0].equivs[i]]; + for (i = 0; i < filevec[1].buffered_lines; ++i) + ++equiv_count[1][filevec[1].equivs[i]]; + + /* Set up tables of which lines are going to be discarded. */ + + discarded[0] = zalloc (filevec[0].buffered_lines + + filevec[1].buffered_lines); + discarded[1] = discarded[0] + filevec[0].buffered_lines; + + /* Mark to be discarded each line that matches no line of the other file. + If a line matches many lines, mark it as provisionally discardable. */ + + for (f = 0; f < 2; f++) + { + size_t end = filevec[f].buffered_lines; + char *discards = discarded[f]; + lin *counts = equiv_count[1 - f]; + lin *equivs = filevec[f].equivs; + size_t many = 5; + size_t tem = end / 64; + + /* Multiply MANY by approximate square root of number of lines. + That is the threshold for provisionally discardable lines. */ + while ((tem = tem >> 2) > 0) + many *= 2; + + for (i = 0; i < end; i++) + { + lin nmatch; + if (equivs[i] == 0) + continue; + nmatch = counts[equivs[i]]; + if (nmatch == 0) + discards[i] = 1; + else if (nmatch > many) + discards[i] = 2; + } + } + + /* Don't really discard the provisional lines except when they occur + in a run of discardables, with nonprovisionals at the beginning + and end. */ + + for (f = 0; f < 2; f++) + { + lin end = filevec[f].buffered_lines; + register char *discards = discarded[f]; + + for (i = 0; i < end; i++) + { + /* Cancel provisional discards not in middle of run of discards. */ + if (discards[i] == 2) + discards[i] = 0; + else if (discards[i] != 0) + { + /* We have found a nonprovisional discard. */ + register lin j; + lin length; + lin provisional = 0; + + /* Find end of this run of discardable lines. + Count how many are provisionally discardable. */ + for (j = i; j < end; j++) + { + if (discards[j] == 0) + break; + if (discards[j] == 2) + ++provisional; + } + + /* Cancel provisional discards at end, and shrink the run. */ + while (j > i && discards[j - 1] == 2) + discards[--j] = 0, --provisional; + + /* Now we have the length of a run of discardable lines + whose first and last are not provisional. */ + length = j - i; + + /* If 1/4 of the lines in the run are provisional, + cancel discarding of all provisional lines in the run. */ + if (provisional * 4 > length) + { + while (j > i) + if (discards[--j] == 2) + discards[j] = 0; + } + else + { + register lin consec; + lin minimum = 1; + lin tem = length >> 2; + + /* MINIMUM is approximate square root of LENGTH/4. + A subrun of two or more provisionals can stand + when LENGTH is at least 16. + A subrun of 4 or more can stand when LENGTH >= 64. */ + while (0 < (tem >>= 2)) + minimum <<= 1; + minimum++; + + /* Cancel any subrun of MINIMUM or more provisionals + within the larger run. */ + for (j = 0, consec = 0; j < length; j++) + if (discards[i + j] != 2) + consec = 0; + else if (minimum == ++consec) + /* Back up to start of subrun, to cancel it all. */ + j -= consec; + else if (minimum < consec) + discards[i + j] = 0; + + /* Scan from beginning of run + until we find 3 or more nonprovisionals in a row + or until the first nonprovisional at least 8 lines in. + Until that point, cancel any provisionals. */ + for (j = 0, consec = 0; j < length; j++) + { + if (j >= 8 && discards[i + j] == 1) + break; + if (discards[i + j] == 2) + consec = 0, discards[i + j] = 0; + else if (discards[i + j] == 0) + consec = 0; + else + consec++; + if (consec == 3) + break; + } + + /* I advances to the last line of the run. */ + i += length - 1; + + /* Same thing, from end. */ + for (j = 0, consec = 0; j < length; j++) + { + if (j >= 8 && discards[i - j] == 1) + break; + if (discards[i - j] == 2) + consec = 0, discards[i - j] = 0; + else if (discards[i - j] == 0) + consec = 0; + else + consec++; + if (consec == 3) + break; + } + } + } + } + } + + /* Actually discard the lines. */ + for (f = 0; f < 2; f++) + { + char *discards = discarded[f]; + lin end = filevec[f].buffered_lines; + lin j = 0; + for (i = 0; i < end; ++i) + if (minimal || discards[i] == 0) + { + filevec[f].undiscarded[j] = filevec[f].equivs[i]; + filevec[f].realindexes[j++] = i; + } + else + filevec[f].changed[i] = 1; + filevec[f].nondiscarded_lines = j; + } + + free (discarded[0]); + free (equiv_count[0]); +} + +/* Adjust inserts/deletes of identical lines to join changes + as much as possible. + + We do something when a run of changed lines include a + line at one end and have an excluded, identical line at the other. + We are free to choose which identical line is included. + `compareseq' usually chooses the one at the beginning, + but usually it is cleaner to consider the following identical line + to be the "change". */ + +static void +shift_boundaries (struct file_data filevec[]) +{ + int f; + + for (f = 0; f < 2; f++) + { + bool *changed = filevec[f].changed; + bool const *other_changed = filevec[1 - f].changed; + lin const *equivs = filevec[f].equivs; + lin i = 0; + lin j = 0; + lin i_end = filevec[f].buffered_lines; + + while (1) + { + lin runlength, start, corresponding; + + /* Scan forwards to find beginning of another run of changes. + Also keep track of the corresponding point in the other file. */ + + while (i < i_end && !changed[i]) + { + while (other_changed[j++]) + continue; + i++; + } + + if (i == i_end) + break; + + start = i; + + /* Find the end of this run of changes. */ + + while (changed[++i]) + continue; + while (other_changed[j]) + j++; + + do + { + /* Record the length of this run of changes, so that + we can later determine whether the run has grown. */ + runlength = i - start; + + /* Move the changed region back, so long as the + previous unchanged line matches the last changed one. + This merges with previous changed regions. */ + + while (start && equivs[start - 1] == equivs[i - 1]) + { + changed[--start] = 1; + changed[--i] = 0; + while (changed[start - 1]) + start--; + while (other_changed[--j]) + continue; + } + + /* Set CORRESPONDING to the end of the changed run, at the last + point where it corresponds to a changed run in the other file. + CORRESPONDING == I_END means no such point has been found. */ + corresponding = other_changed[j - 1] ? i : i_end; + + /* Move the changed region forward, so long as the + first changed line matches the following unchanged one. + This merges with following changed regions. + Do this second, so that if there are no merges, + the changed region is moved forward as far as possible. */ + + while (i != i_end && equivs[start] == equivs[i]) + { + changed[start++] = 0; + changed[i++] = 1; + while (changed[i]) + i++; + while (other_changed[++j]) + corresponding = i; + } + } + while (runlength != i - start); + + /* If possible, move the fully-merged run of changes + back to a corresponding run in the other file. */ + + while (corresponding < i) + { + changed[--start] = 1; + changed[--i] = 0; + while (other_changed[--j]) + continue; + } + } + } +} + +/* Cons an additional entry onto the front of an edit script OLD. + LINE0 and LINE1 are the first affected lines in the two files (origin 0). + DELETED is the number of lines deleted here from file 0. + INSERTED is the number of lines inserted here in file 1. + + If DELETED is 0 then LINE0 is the number of the line before + which the insertion was done; vice versa for INSERTED and LINE1. */ + +static struct change * +add_change (lin line0, lin line1, lin deleted, lin inserted, + struct change *old) +{ + struct change *new = xmalloc (sizeof *new); + + new->line0 = line0; + new->line1 = line1; + new->inserted = inserted; + new->deleted = deleted; + new->link = old; + return new; +} + +/* Scan the tables of which lines are inserted and deleted, + producing an edit script in reverse order. */ + +static struct change * +build_reverse_script (struct file_data const filevec[]) +{ + struct change *script = 0; + bool *changed0 = filevec[0].changed; + bool *changed1 = filevec[1].changed; + lin len0 = filevec[0].buffered_lines; + lin len1 = filevec[1].buffered_lines; + + /* Note that changedN[len0] does exist, and is 0. */ + + lin i0 = 0, i1 = 0; + + while (i0 < len0 || i1 < len1) + { + if (changed0[i0] | changed1[i1]) + { + lin line0 = i0, line1 = i1; + + /* Find # lines changed here in each file. */ + while (changed0[i0]) ++i0; + while (changed1[i1]) ++i1; + + /* Record this change. */ + script = add_change (line0, line1, i0 - line0, i1 - line1, script); + } + + /* We have reached lines in the two files that match each other. */ + i0++, i1++; + } + + return script; +} + +/* Scan the tables of which lines are inserted and deleted, + producing an edit script in forward order. */ + +static struct change * +build_script (struct file_data const filevec[]) +{ + struct change *script = 0; + bool *changed0 = filevec[0].changed; + bool *changed1 = filevec[1].changed; + lin i0 = filevec[0].buffered_lines, i1 = filevec[1].buffered_lines; + + /* Note that changedN[-1] does exist, and is 0. */ + + while (i0 >= 0 || i1 >= 0) + { + if (changed0[i0 - 1] | changed1[i1 - 1]) + { + lin line0 = i0, line1 = i1; + + /* Find # lines changed here in each file. */ + while (changed0[i0 - 1]) --i0; + while (changed1[i1 - 1]) --i1; + + /* Record this change. */ + script = add_change (i0, i1, line0 - i0, line1 - i1, script); + } + + /* We have reached lines in the two files that match each other. */ + i0--, i1--; + } + + return script; +} + +/* If CHANGES, briefly report that two files differed. + Return 2 if trouble, CHANGES otherwise. */ +static int +briefly_report (int changes, struct file_data const filevec[]) +{ + if (changes) + { + char const *label0 = file_label[0] ? file_label[0] : filevec[0].name; + char const *label1 = file_label[1] ? file_label[1] : filevec[1].name; + + if (brief) + message ("Files %s and %s differ\n", label0, label1); + else + { + message ("Binary files %s and %s differ\n", label0, label1); + changes = 2; + } + } + + return changes; +} + +/* Report the differences of two files. */ +int +diff_2_files (struct comparison *cmp) +{ + lin diags; + int f; + struct change *e, *p; + struct change *script; + int changes; + + + /* If we have detected that either file is binary, + compare the two files as binary. This can happen + only when the first chunk is read. + Also, --brief without any --ignore-* options means + we can speed things up by treating the files as binary. */ + + if (read_files (cmp->file, files_can_be_treated_as_binary)) + { + /* Files with different lengths must be different. */ + if (cmp->file[0].stat.st_size != cmp->file[1].stat.st_size + && (cmp->file[0].desc < 0 || S_ISREG (cmp->file[0].stat.st_mode)) + && (cmp->file[1].desc < 0 || S_ISREG (cmp->file[1].stat.st_mode))) + changes = 1; + + /* Standard input equals itself. */ + else if (cmp->file[0].desc == cmp->file[1].desc) + changes = 0; + + else + /* Scan both files, a buffer at a time, looking for a difference. */ + { + /* Allocate same-sized buffers for both files. */ + size_t lcm_max = PTRDIFF_MAX - 1; + size_t buffer_size = + buffer_lcm (sizeof (word), + buffer_lcm (STAT_BLOCKSIZE (cmp->file[0].stat), + STAT_BLOCKSIZE (cmp->file[1].stat), + lcm_max), + lcm_max); + for (f = 0; f < 2; f++) + cmp->file[f].buffer = xrealloc (cmp->file[f].buffer, buffer_size); + + for (;; cmp->file[0].buffered = cmp->file[1].buffered = 0) + { + /* Read a buffer's worth from both files. */ + for (f = 0; f < 2; f++) + if (0 <= cmp->file[f].desc) + file_block_read (&cmp->file[f], + buffer_size - cmp->file[f].buffered); + + /* If the buffers differ, the files differ. */ + if (cmp->file[0].buffered != cmp->file[1].buffered + || memcmp (cmp->file[0].buffer, + cmp->file[1].buffer, + cmp->file[0].buffered)) + { + changes = 1; + break; + } + + /* If we reach end of file, the files are the same. */ + if (cmp->file[0].buffered != buffer_size) + { + changes = 0; + break; + } + } + } + + changes = briefly_report (changes, cmp->file); + } + else + { + /* Allocate vectors for the results of comparison: + a flag for each line of each file, saying whether that line + is an insertion or deletion. + Allocate an extra element, always 0, at each end of each vector. */ + + size_t s = cmp->file[0].buffered_lines + cmp->file[1].buffered_lines + 4; + bool *flag_space = zalloc (s * sizeof *flag_space); + cmp->file[0].changed = flag_space + 1; + cmp->file[1].changed = flag_space + cmp->file[0].buffered_lines + 3; + + /* Some lines are obviously insertions or deletions + because they don't match anything. Detect them now, and + avoid even thinking about them in the main comparison algorithm. */ + + discard_confusing_lines (cmp->file); + + /* Now do the main comparison algorithm, considering just the + undiscarded lines. */ + + xvec = cmp->file[0].undiscarded; + yvec = cmp->file[1].undiscarded; + diags = (cmp->file[0].nondiscarded_lines + + cmp->file[1].nondiscarded_lines + 3); + fdiag = xmalloc (diags * (2 * sizeof *fdiag)); + bdiag = fdiag + diags; + fdiag += cmp->file[1].nondiscarded_lines + 1; + bdiag += cmp->file[1].nondiscarded_lines + 1; + + /* Set TOO_EXPENSIVE to be approximate square root of input size, + bounded below by 256. */ + too_expensive = 1; + for (; diags != 0; diags >>= 2) + too_expensive <<= 1; + too_expensive = MAX (256, too_expensive); + + files[0] = cmp->file[0]; + files[1] = cmp->file[1]; + + compareseq (0, cmp->file[0].nondiscarded_lines, + 0, cmp->file[1].nondiscarded_lines, minimal); + + free (fdiag - (cmp->file[1].nondiscarded_lines + 1)); + + /* Modify the results slightly to make them prettier + in cases where that can validly be done. */ + + shift_boundaries (cmp->file); + + /* Get the results of comparison in the form of a chain + of `struct change's -- an edit script. */ + + if (output_style == OUTPUT_ED) + script = build_reverse_script (cmp->file); + else + script = build_script (cmp->file); + + /* Set CHANGES if we had any diffs. + If some changes are ignored, we must scan the script to decide. */ + if (ignore_blank_lines || ignore_regexp.fastmap) + { + struct change *next = script; + changes = 0; + + while (next && changes == 0) + { + struct change *this, *end; + lin first0, last0, first1, last1; + + /* Find a set of changes that belong together. */ + this = next; + end = find_change (next); + + /* Disconnect them from the rest of the changes, making them + a hunk, and remember the rest for next iteration. */ + next = end->link; + end->link = 0; + + /* Determine whether this hunk is really a difference. */ + if (analyze_hunk (this, &first0, &last0, &first1, &last1)) + changes = 1; + + /* Reconnect the script so it will all be freed properly. */ + end->link = next; + } + } + else + changes = (script != 0); + + if (brief) + changes = briefly_report (changes, cmp->file); + else + { + if (changes | !no_diff_means_no_output) + { + /* Record info for starting up output, + to be used if and when we have some output to print. */ + setup_output (file_label[0] ? file_label[0] : cmp->file[0].name, + file_label[1] ? file_label[1] : cmp->file[1].name, + cmp->parent != 0); + + switch (output_style) + { + case OUTPUT_CONTEXT: + print_context_script (script, 0); + break; + + case OUTPUT_UNIFIED: + print_context_script (script, 1); + break; + + case OUTPUT_ED: + print_ed_script (script); + break; + + case OUTPUT_FORWARD_ED: + pr_forward_ed_script (script); + break; + + case OUTPUT_RCS: + print_rcs_script (script); + break; + + case OUTPUT_NORMAL: + print_normal_script (script); + break; + + case OUTPUT_IFDEF: + print_ifdef_script (script); + break; + + case OUTPUT_SDIFF: + print_sdiff_script (script); + break; + + default: + abort (); + } + + finish_output (); + } + } + + free (cmp->file[0].undiscarded); + + free (flag_space); + + for (f = 0; f < 2; f++) + { + free (cmp->file[f].equivs); + free (cmp->file[f].linbuf + cmp->file[f].linbuf_base); + } + + for (e = script; e; e = p) + { + p = e->link; + free (e); + } + + if (! ROBUST_OUTPUT_STYLE (output_style)) + for (f = 0; f < 2; ++f) + if (cmp->file[f].missing_newline) + { + error (0, 0, "%s: %s\n", + file_label[f] ? file_label[f] : cmp->file[f].name, + _("No newline at end of file")); + changes = 2; + } + } + + if (cmp->file[0].buffer != cmp->file[1].buffer) + free (cmp->file[0].buffer); + free (cmp->file[1].buffer); + + return changes; +} diff --git a/gnu/dist/diffutils/src/cmp.c b/gnu/dist/diffutils/src/cmp.c new file mode 100644 index 00000000000..d033829dfc6 --- /dev/null +++ b/gnu/dist/diffutils/src/cmp.c @@ -0,0 +1,676 @@ +/* $NetBSD: cmp.c,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* cmp - compare two files byte by byte + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2001, + 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include <stdio.h> +#include <cmpbuf.h> +#include <c-stack.h> +#include <error.h> +#include <exitfail.h> +#include <freesoft.h> +#include <getopt.h> +#include <hard-locale.h> +#include <inttostr.h> +#include <setmode.h> +#include <xalloc.h> +#include <xstrtol.h> + +#if defined LC_MESSAGES && ENABLE_NLS +# define hard_locale_LC_MESSAGES hard_locale (LC_MESSAGES) +#else +# define hard_locale_LC_MESSAGES 0 +#endif + +static char const authorship_msgid[] = + N_("Written by Torbjorn Granlund and David MacKenzie."); + +static char const copyright_string[] = + "Copyright (C) 2002 Free Software Foundation, Inc."; + +extern char const version_string[]; + +static int cmp (void); +static off_t file_position (int); +static size_t block_compare (word const *, word const *); +static size_t block_compare_and_count (word const *, word const *, off_t *); +static void sprintc (char *, unsigned char); + +/* Name under which this program was invoked. */ +char *program_name; + +/* Filenames of the compared files. */ +static char const *file[2]; + +/* File descriptors of the files. */ +static int file_desc[2]; + +/* Status of the files. */ +static struct stat stat_buf[2]; + +/* Read buffers for the files. */ +static word *buffer[2]; + +/* Optimal block size for the files. */ +static size_t buf_size; + +/* Initial prefix to ignore for each file. */ +static off_t ignore_initial[2]; + +/* Number of bytes to compare. */ +static uintmax_t bytes = UINTMAX_MAX; + +/* Output format. */ +static enum comparison_type + { + type_first_diff, /* Print the first difference. */ + type_all_diffs, /* Print all differences. */ + type_status /* Exit status only. */ + } comparison_type; + +/* If nonzero, print values of bytes quoted like cat -t does. */ +static bool opt_print_bytes; + +/* Values for long options that do not have single-letter equivalents. */ +enum +{ + HELP_OPTION = CHAR_MAX + 1 +}; + +static struct option const long_options[] = +{ + {"print-bytes", 0, 0, 'b'}, + {"print-chars", 0, 0, 'c'}, /* obsolescent as of diffutils 2.7.3 */ + {"ignore-initial", 1, 0, 'i'}, + {"verbose", 0, 0, 'l'}, + {"bytes", 1, 0, 'n'}, + {"silent", 0, 0, 's'}, + {"quiet", 0, 0, 's'}, + {"version", 0, 0, 'v'}, + {"help", 0, 0, HELP_OPTION}, + {0, 0, 0, 0} +}; + +static void try_help (char const *, char const *) __attribute__((noreturn)); +static void +try_help (char const *reason_msgid, char const *operand) +{ + if (reason_msgid) + error (0, 0, _(reason_msgid), operand); + error (EXIT_TROUBLE, 0, + _("Try `%s --help' for more information."), program_name); + abort (); +} + +static char const valid_suffixes[] = "kKMGTPEZY0"; + +/* Parse an operand *ARGPTR of --ignore-initial, updating *ARGPTR to + point after the operand. If DELIMITER is nonzero, the operand may + be followed by DELIMITER; otherwise it must be null-terminated. */ +static off_t +parse_ignore_initial (char **argptr, char delimiter) +{ + uintmax_t val; + off_t o; + char const *arg = *argptr; + strtol_error e = xstrtoumax (arg, argptr, 0, &val, valid_suffixes); + if (! (e == LONGINT_OK + || (e == LONGINT_INVALID_SUFFIX_CHAR && **argptr == delimiter)) + || (o = val) < 0 || o != val || val == UINTMAX_MAX) + try_help ("invalid --ignore-initial value `%s'", arg); + return o; +} + +/* Specify the output format. */ +static void +specify_comparison_type (enum comparison_type t) +{ + if (comparison_type) + try_help ("options -l and -s are incompatible", 0); + comparison_type = t; +} + +static void +check_stdout (void) +{ + if (ferror (stdout)) + error (EXIT_TROUBLE, 0, "%s", _("write failed")); + else if (fclose (stdout) != 0) + error (EXIT_TROUBLE, errno, "%s", _("standard output")); +} + +static char const * const option_help_msgid[] = { + N_("-b --print-bytes Print differing bytes."), + N_("-i SKIP --ignore-initial=SKIP Skip the first SKIP bytes of input."), + N_("-i SKIP1:SKIP2 --ignore-initial=SKIP1:SKIP2"), + N_(" Skip the first SKIP1 bytes of FILE1 and the first SKIP2 bytes of FILE2."), + N_("-l --verbose Output byte numbers and values of all differing bytes."), + N_("-n LIMIT --bytes=LIMIT Compare at most LIMIT bytes."), + N_("-s --quiet --silent Output nothing; yield exit status only."), + N_("-v --version Output version info."), + N_("--help Output this help."), + 0 +}; + +static void +usage (void) +{ + char const * const *p; + + printf (_("Usage: %s [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]\n"), + program_name); + printf ("%s\n\n", _("Compare two files byte by byte.")); + for (p = option_help_msgid; *p; p++) + printf (" %s\n", _(*p)); + printf ("\n%s\n%s\n\n%s\n\n%s\n", + _("SKIP1 and SKIP2 are the number of bytes to skip in each file."), + _("SKIP values may be followed by the following multiplicative suffixes:\n\ +kB 1000, K 1024, MB 1,000,000, M 1,048,576,\n\ +GB 1,000,000,000, G 1,073,741,824, and so on for T, P, E, Z, Y."), + _("If a FILE is `-' or missing, read standard input."), + _("Report bugs to <bug-gnu-utils@gnu.org>.")); +} + +int +main (int argc, char **argv) +{ + int c, f, exit_status; + size_t words_per_buffer; + + exit_failure = EXIT_TROUBLE; + initialize_main (&argc, &argv); + program_name = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + c_stack_action (c_stack_die); + + /* Parse command line options. */ + + while ((c = getopt_long (argc, argv, "bci:ln:sv", long_options, 0)) + != -1) + switch (c) + { + case 'b': + case 'c': /* 'c' is obsolescent as of diffutils 2.7.3 */ + opt_print_bytes = 1; + break; + + case 'i': + ignore_initial[0] = parse_ignore_initial (&optarg, ':'); + ignore_initial[1] = (*optarg++ == ':' + ? parse_ignore_initial (&optarg, 0) + : ignore_initial[0]); + break; + + case 'l': + specify_comparison_type (type_all_diffs); + break; + + case 'n': + { + uintmax_t n; + if (xstrtoumax (optarg, 0, 0, &n, valid_suffixes) != LONGINT_OK) + try_help ("invalid --bytes value `%s'", optarg); + if (n < bytes) + bytes = n; + } + break; + + case 's': + specify_comparison_type (type_status); + break; + + case 'v': + printf ("cmp %s\n%s\n\n%s\n\n%s\n", + version_string, copyright_string, + _(free_software_msgid), _(authorship_msgid)); + check_stdout (); + return EXIT_SUCCESS; + + case HELP_OPTION: + usage (); + check_stdout (); + return EXIT_SUCCESS; + + default: + try_help (0, 0); + } + + if (optind == argc) + try_help ("missing operand after `%s'", argv[argc - 1]); + + file[0] = argv[optind++]; + file[1] = optind < argc ? argv[optind++] : "-"; + + for (f = 0; f < 2 && optind < argc; f++) + { + char *arg = argv[optind++]; + ignore_initial[f] = parse_ignore_initial (&arg, 0); + } + + if (optind < argc) + try_help ("extra operand `%s'", argv[optind]); + + for (f = 0; f < 2; f++) + { + /* If file[1] is "-", treat it first; this avoids a misdiagnostic if + stdin is closed and opening file[0] yields file descriptor 0. */ + int f1 = f ^ (strcmp (file[1], "-") == 0); + + /* Two files with the same name are identical. + But wait until we open the file once, for proper diagnostics. */ + if (f && file_name_cmp (file[0], file[1]) == 0) + return EXIT_SUCCESS; + + file_desc[f1] = (strcmp (file[f1], "-") == 0 + ? STDIN_FILENO + : open (file[f1], O_RDONLY, 0)); + if (file_desc[f1] < 0 || fstat (file_desc[f1], stat_buf + f1) != 0) + { + if (file_desc[f1] < 0 && comparison_type == type_status) + exit (EXIT_TROUBLE); + else + error (EXIT_TROUBLE, errno, "%s", file[f1]); + } + + set_binary_mode (file_desc[f1], 1); + } + + /* If the files are links to the same inode and have the same file position, + they are identical. */ + + if (0 < same_file (&stat_buf[0], &stat_buf[1]) + && same_file_attributes (&stat_buf[0], &stat_buf[1]) + && file_position (0) == file_position (1)) + return EXIT_SUCCESS; + + /* If output is redirected to the null device, we may assume `-s'. */ + + if (comparison_type != type_status) + { + struct stat outstat, nullstat; + + if (fstat (STDOUT_FILENO, &outstat) == 0 + && stat (NULL_DEVICE, &nullstat) == 0 + && 0 < same_file (&outstat, &nullstat)) + comparison_type = type_status; + } + + /* If only a return code is needed, + and if both input descriptors are associated with plain files, + conclude that the files differ if they have different sizes + and if more bytes will be compared than are in the smaller file. */ + + if (comparison_type == type_status + && S_ISREG (stat_buf[0].st_mode) + && S_ISREG (stat_buf[1].st_mode)) + { + off_t s0 = stat_buf[0].st_size - file_position (0); + off_t s1 = stat_buf[1].st_size - file_position (1); + if (s0 < 0) + s0 = 0; + if (s1 < 0) + s1 = 0; + if (s0 != s1 && MIN (s0, s1) < bytes) + exit (EXIT_FAILURE); + } + + /* Get the optimal block size of the files. */ + + buf_size = buffer_lcm (STAT_BLOCKSIZE (stat_buf[0]), + STAT_BLOCKSIZE (stat_buf[1]), + PTRDIFF_MAX - sizeof (word)); + + /* Allocate word-aligned buffers, with space for sentinels at the end. */ + + words_per_buffer = (buf_size + 2 * sizeof (word) - 1) / sizeof (word); + buffer[0] = xmalloc (2 * sizeof (word) * words_per_buffer); + buffer[1] = buffer[0] + words_per_buffer; + + exit_status = cmp (); + + for (f = 0; f < 2; f++) + if (close (file_desc[f]) != 0) + error (EXIT_TROUBLE, errno, "%s", file[f]); + if (exit_status != 0 && comparison_type != type_status) + check_stdout (); + exit (exit_status); + return exit_status; +} + +/* Compare the two files already open on `file_desc[0]' and `file_desc[1]', + using `buffer[0]' and `buffer[1]'. + Return EXIT_SUCCESS if identical, EXIT_FAILURE if different, + >1 if error. */ + +static int +cmp (void) +{ + off_t line_number = 1; /* Line number (1...) of difference. */ + off_t byte_number = 1; /* Byte number (1...) of difference. */ + uintmax_t remaining = bytes; /* Remaining number of bytes to compare. */ + size_t read0, read1; /* Number of bytes read from each file. */ + size_t first_diff; /* Offset (0...) in buffers of 1st diff. */ + size_t smaller; /* The lesser of `read0' and `read1'. */ + word *buffer0 = buffer[0]; + word *buffer1 = buffer[1]; + char *buf0 = (char *) buffer0; + char *buf1 = (char *) buffer1; + int ret = EXIT_SUCCESS; + int f; + int offset_width; + + if (comparison_type == type_all_diffs) + { + off_t byte_number_max = MIN (bytes, TYPE_MAXIMUM (off_t)); + + for (f = 0; f < 2; f++) + if (S_ISREG (stat_buf[f].st_mode)) + { + off_t file_bytes = stat_buf[f].st_size - file_position (f); + if (file_bytes < byte_number_max) + byte_number_max = file_bytes; + } + + for (offset_width = 1; (byte_number_max /= 10) != 0; offset_width++) + continue; + } + + for (f = 0; f < 2; f++) + { + off_t ig = ignore_initial[f]; + if (ig && file_position (f) == -1) + { + /* lseek failed; read and discard the ignored initial prefix. */ + do + { + size_t bytes_to_read = MIN (ig, buf_size); + size_t r = block_read (file_desc[f], buf0, bytes_to_read); + if (r != bytes_to_read) + { + if (r == SIZE_MAX) + error (EXIT_TROUBLE, errno, "%s", file[f]); + break; + } + ig -= r; + } + while (ig); + } + } + + do + { + size_t bytes_to_read = buf_size; + + if (remaining != UINTMAX_MAX) + { + if (remaining < bytes_to_read) + bytes_to_read = remaining; + remaining -= bytes_to_read; + } + + read0 = block_read (file_desc[0], buf0, bytes_to_read); + if (read0 == SIZE_MAX) + error (EXIT_TROUBLE, errno, "%s", file[0]); + read1 = block_read (file_desc[1], buf1, bytes_to_read); + if (read1 == SIZE_MAX) + error (EXIT_TROUBLE, errno, "%s", file[1]); + + /* Insert sentinels for the block compare. */ + + buf0[read0] = ~buf1[read0]; + buf1[read1] = ~buf0[read1]; + + /* If the line number should be written for differing files, + compare the blocks and count the number of newlines + simultaneously. */ + first_diff = (comparison_type == type_first_diff + ? block_compare_and_count (buffer0, buffer1, &line_number) + : block_compare (buffer0, buffer1)); + + byte_number += first_diff; + smaller = MIN (read0, read1); + + if (first_diff < smaller) + { + switch (comparison_type) + { + case type_first_diff: + { + char byte_buf[INT_BUFSIZE_BOUND (off_t)]; + char line_buf[INT_BUFSIZE_BOUND (off_t)]; + char const *byte_num = offtostr (byte_number, byte_buf); + char const *line_num = offtostr (line_number, line_buf); + if (!opt_print_bytes) + { + /* See POSIX 1003.1-2001 for this format. This + message is used only in the POSIX locale, so it + need not be translated. */ + static char const char_message[] = + "%s %s differ: char %s, line %s\n"; + + /* The POSIX rationale recommends using the word + "byte" outside the POSIX locale. Some gettext + implementations translate even in the POSIX + locale if certain other environment variables + are set, so use "byte" if a translation is + available, or if outside the POSIX locale. */ + static char const byte_msgid[] = + N_("%s %s differ: byte %s, line %s\n"); + char const *byte_message = _(byte_msgid); + bool use_byte_message = (byte_message != byte_msgid + || hard_locale_LC_MESSAGES); + + printf ((use_byte_message + ? byte_message + : "%s %s differ: char %s, line %s\n"), + file[0], file[1], byte_num, line_num); + } + else + { + unsigned char c0 = buf0[first_diff]; + unsigned char c1 = buf1[first_diff]; + char s0[5]; + char s1[5]; + sprintc (s0, c0); + sprintc (s1, c1); + printf (_("%s %s differ: byte %s, line %s is %3o %s %3o %s\n"), + file[0], file[1], byte_num, line_num, + c0, s0, c1, s1); + } + } + /* Fall through. */ + case type_status: + return EXIT_FAILURE; + + case type_all_diffs: + do + { + unsigned char c0 = buf0[first_diff]; + unsigned char c1 = buf1[first_diff]; + if (c0 != c1) + { + char byte_buf[INT_BUFSIZE_BOUND (off_t)]; + char const *byte_num = offtostr (byte_number, byte_buf); + if (!opt_print_bytes) + { + /* See POSIX 1003.1-2001 for this format. */ + printf ("%*s %3o %3o\n", + offset_width, byte_num, c0, c1); + } + else + { + char s0[5]; + char s1[5]; + sprintc (s0, c0); + sprintc (s1, c1); + printf ("%*s %3o %-4s %3o %s\n", + offset_width, byte_num, c0, s0, c1, s1); + } + } + byte_number++; + first_diff++; + } + while (first_diff < smaller); + ret = EXIT_FAILURE; + break; + } + } + + if (read0 != read1) + { + if (comparison_type != type_status) + { + /* See POSIX 1003.1-2001 for this format. */ + fprintf (stderr, _("cmp: EOF on %s\n"), file[read1 < read0]); + } + + return EXIT_FAILURE; + } + } + while (read0 == buf_size); + + return ret; +} + +/* Compare two blocks of memory P0 and P1 until they differ, + and count the number of '\n' occurrences in the common + part of P0 and P1. + If the blocks are not guaranteed to be different, put sentinels at the ends + of the blocks before calling this function. + + Return the offset of the first byte that differs. + Increment *COUNT by the count of '\n' occurrences. */ + +static size_t +block_compare_and_count (word const *p0, word const *p1, off_t *count) +{ + word l; /* One word from first buffer. */ + word const *l0, *l1; /* Pointers into each buffer. */ + char const *c0, *c1; /* Pointers for finding exact address. */ + size_t cnt = 0; /* Number of '\n' occurrences. */ + word nnnn; /* Newline, sizeof (word) times. */ + int i; + + nnnn = 0; + for (i = 0; i < sizeof nnnn; i++) + nnnn = (nnnn << CHAR_BIT) | '\n'; + + /* Find the rough position of the first difference by reading words, + not bytes. */ + + for (l0 = p0, l1 = p1; (l = *l0) == *l1; l0++, l1++) + { + l ^= nnnn; + for (i = 0; i < sizeof l; i++) + { + cnt += ! (unsigned char) l; + l >>= CHAR_BIT; + } + } + + /* Find the exact differing position (endianness independent). */ + + for (c0 = (char const *) l0, c1 = (char const *) l1; + *c0 == *c1; + c0++, c1++) + cnt += *c0 == '\n'; + + *count += cnt; + return c0 - (char const *) p0; +} + +/* Compare two blocks of memory P0 and P1 until they differ. + If the blocks are not guaranteed to be different, put sentinels at the ends + of the blocks before calling this function. + + Return the offset of the first byte that differs. */ + +static size_t +block_compare (word const *p0, word const *p1) +{ + word const *l0, *l1; + char const *c0, *c1; + + /* Find the rough position of the first difference by reading words, + not bytes. */ + + for (l0 = p0, l1 = p1; *l0 == *l1; l0++, l1++) + continue; + + /* Find the exact differing position (endianness independent). */ + + for (c0 = (char const *) l0, c1 = (char const *) l1; + *c0 == *c1; + c0++, c1++) + continue; + + return c0 - (char const *) p0; +} + +/* Put into BUF the unsigned char C, making unprintable bytes + visible by quoting like cat -t does. */ + +static void +sprintc (char *buf, unsigned char c) +{ + if (! ISPRINT (c)) + { + if (c >= 128) + { + *buf++ = 'M'; + *buf++ = '-'; + c -= 128; + } + if (c < 32) + { + *buf++ = '^'; + c += 64; + } + else if (c == 127) + { + *buf++ = '^'; + c = '?'; + } + } + + *buf++ = c; + *buf = 0; +} + +/* Position file F to ignore_initial[F] bytes from its initial position, + and yield its new position. Don't try more than once. */ + +static off_t +file_position (int f) +{ + static bool positioned[2]; + static off_t position[2]; + + if (! positioned[f]) + { + positioned[f] = 1; + position[f] = lseek (file_desc[f], ignore_initial[f], SEEK_CUR); + } + return position[f]; +} diff --git a/gnu/dist/diffutils/src/context.c b/gnu/dist/diffutils/src/context.c new file mode 100644 index 00000000000..0b29cd3e929 --- /dev/null +++ b/gnu/dist/diffutils/src/context.c @@ -0,0 +1,480 @@ +/* $NetBSD: context.c,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* Context-format output routines for GNU DIFF. + + Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001, + 2002 Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" +#include <inttostr.h> +#include <regex.h> + +#ifdef ST_MTIM_NSEC +# define TIMESPEC_NS(timespec) ((timespec).ST_MTIM_NSEC) +#else +# define TIMESPEC_NS(timespec) 0 +#endif + +size_t nstrftime (char *, size_t, char const *, struct tm const *, int, int); + +static char const *find_function (char const * const *, lin); +static struct change *find_hunk (struct change *); +static void mark_ignorable (struct change *); +static void pr_context_hunk (struct change *); +static void pr_unidiff_hunk (struct change *); + +/* Last place find_function started searching from. */ +static lin find_function_last_search; + +/* The value find_function returned when it started searching there. */ +static lin find_function_last_match; + +/* Print a label for a context diff, with a file name and date or a label. */ + +static void +print_context_label (char const *mark, + struct file_data *inf, + char const *label) +{ + if (label) + fprintf (outfile, "%s %s\n", mark, label); + else + { + char buf[MAX (INT_STRLEN_BOUND (int) + 32, + INT_STRLEN_BOUND (time_t) + 11)]; + struct tm const *tm = localtime (&inf->stat.st_mtime); + int nsec = TIMESPEC_NS (inf->stat.st_mtim); + if (! (tm && nstrftime (buf, sizeof buf, time_format, tm, 0, nsec))) + { + long sec = inf->stat.st_mtime; + verify (info_preserved, sizeof inf->stat.st_mtime <= sizeof sec); + sprintf (buf, "%ld.%.9d", sec, nsec); + } + fprintf (outfile, "%s %s\t%s\n", mark, inf->name, buf); + } +} + +/* Print a header for a context diff, with the file names and dates. */ + +void +print_context_header (struct file_data inf[], bool unidiff) +{ + if (unidiff) + { + print_context_label ("---", &inf[0], file_label[0]); + print_context_label ("+++", &inf[1], file_label[1]); + } + else + { + print_context_label ("***", &inf[0], file_label[0]); + print_context_label ("---", &inf[1], file_label[1]); + } +} + +/* Print an edit script in context format. */ + +void +print_context_script (struct change *script, bool unidiff) +{ + if (ignore_blank_lines || ignore_regexp.fastmap) + mark_ignorable (script); + else + { + struct change *e; + for (e = script; e; e = e->link) + e->ignore = 0; + } + + find_function_last_search = - files[0].prefix_lines; + find_function_last_match = LIN_MAX; + + if (unidiff) + print_script (script, find_hunk, pr_unidiff_hunk); + else + print_script (script, find_hunk, pr_context_hunk); +} + +/* Print a pair of line numbers with a comma, translated for file FILE. + If the second number is not greater, use the first in place of it. + + Args A and B are internal line numbers. + We print the translated (real) line numbers. */ + +static void +print_context_number_range (struct file_data const *file, lin a, lin b) +{ + long trans_a, trans_b; + translate_range (file, a, b, &trans_a, &trans_b); + + /* We can have B <= A in the case of a range of no lines. + In this case, we should print the line number before the range, + which is B. + + POSIX 1003.1-2001 requires two line numbers separated by a comma + even if the line numbers are the same. However, this does not + match existing practice and is surely an error in the + specification. */ + + if (trans_b <= trans_a) + fprintf (outfile, "%ld", trans_b); + else + fprintf (outfile, "%ld,%ld", trans_a, trans_b); +} + +/* Print FUNCTION in a context header. */ +static void +print_context_function (FILE *out, char const *function) +{ + int i; + putc (' ', out); + for (i = 0; i < 40 && function[i] != '\n'; i++) + continue; + fwrite (function, 1, i, out); +} + +/* Print a portion of an edit script in context format. + HUNK is the beginning of the portion to be printed. + The end is marked by a `link' that has been nulled out. + + Prints out lines from both files, and precedes each + line with the appropriate flag-character. */ + +static void +pr_context_hunk (struct change *hunk) +{ + lin first0, last0, first1, last1, i; + char const *prefix; + char const *function; + FILE *out; + + /* Determine range of line numbers involved in each file. */ + + enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); + if (! changes) + return; + + /* Include a context's width before and after. */ + + i = - files[0].prefix_lines; + first0 = MAX (first0 - context, i); + first1 = MAX (first1 - context, i); + if (last0 < files[0].valid_lines - context) + last0 += context; + else + last0 = files[0].valid_lines - 1; + if (last1 < files[1].valid_lines - context) + last1 += context; + else + last1 = files[1].valid_lines - 1; + + /* If desired, find the preceding function definition line in file 0. */ + function = 0; + if (function_regexp.fastmap) + function = find_function (files[0].linbuf, first0); + + begin_output (); + out = outfile; + + fprintf (out, "***************"); + + if (function) + print_context_function (out, function); + + fprintf (out, "\n*** "); + print_context_number_range (&files[0], first0, last0); + fprintf (out, " ****\n"); + + if (changes & OLD) + { + struct change *next = hunk; + + for (i = first0; i <= last0; i++) + { + /* Skip past changes that apply (in file 0) + only to lines before line I. */ + + while (next && next->line0 + next->deleted <= i) + next = next->link; + + /* Compute the marking for line I. */ + + prefix = " "; + if (next && next->line0 <= i) + /* The change NEXT covers this line. + If lines were inserted here in file 1, this is "changed". + Otherwise it is "deleted". */ + prefix = (next->inserted > 0 ? "!" : "-"); + + print_1_line (prefix, &files[0].linbuf[i]); + } + } + + fprintf (out, "--- "); + print_context_number_range (&files[1], first1, last1); + fprintf (out, " ----\n"); + + if (changes & NEW) + { + struct change *next = hunk; + + for (i = first1; i <= last1; i++) + { + /* Skip past changes that apply (in file 1) + only to lines before line I. */ + + while (next && next->line1 + next->inserted <= i) + next = next->link; + + /* Compute the marking for line I. */ + + prefix = " "; + if (next && next->line1 <= i) + /* The change NEXT covers this line. + If lines were deleted here in file 0, this is "changed". + Otherwise it is "inserted". */ + prefix = (next->deleted > 0 ? "!" : "+"); + + print_1_line (prefix, &files[1].linbuf[i]); + } + } +} + +/* Print a pair of line numbers with a comma, translated for file FILE. + If the second number is smaller, use the first in place of it. + If the numbers are equal, print just one number. + + Args A and B are internal line numbers. + We print the translated (real) line numbers. */ + +static void +print_unidiff_number_range (struct file_data const *file, lin a, lin b) +{ + long trans_a, trans_b; + translate_range (file, a, b, &trans_a, &trans_b); + + /* We can have B < A in the case of a range of no lines. + In this case, we should print the line number before the range, + which is B. */ + if (trans_b <= trans_a) + fprintf (outfile, trans_b < trans_a ? "%ld,0" : "%ld", trans_b); + else + fprintf (outfile, "%ld,%ld", trans_a, trans_b - trans_a + 1); +} + +/* Print a portion of an edit script in unidiff format. + HUNK is the beginning of the portion to be printed. + The end is marked by a `link' that has been nulled out. + + Prints out lines from both files, and precedes each + line with the appropriate flag-character. */ + +static void +pr_unidiff_hunk (struct change *hunk) +{ + lin first0, last0, first1, last1; + lin i, j, k; + struct change *next; + char const *function; + FILE *out; + + /* Determine range of line numbers involved in each file. */ + + if (! analyze_hunk (hunk, &first0, &last0, &first1, &last1)) + return; + + /* Include a context's width before and after. */ + + i = - files[0].prefix_lines; + first0 = MAX (first0 - context, i); + first1 = MAX (first1 - context, i); + if (last0 < files[0].valid_lines - context) + last0 += context; + else + last0 = files[0].valid_lines - 1; + if (last1 < files[1].valid_lines - context) + last1 += context; + else + last1 = files[1].valid_lines - 1; + + /* If desired, find the preceding function definition line in file 0. */ + function = 0; + if (function_regexp.fastmap) + function = find_function (files[0].linbuf, first0); + + begin_output (); + out = outfile; + + fprintf (out, "@@ -"); + print_unidiff_number_range (&files[0], first0, last0); + fprintf (out, " +"); + print_unidiff_number_range (&files[1], first1, last1); + fprintf (out, " @@"); + + if (function) + print_context_function (out, function); + + putc ('\n', out); + + next = hunk; + i = first0; + j = first1; + + while (i <= last0 || j <= last1) + { + + /* If the line isn't a difference, output the context from file 0. */ + + if (!next || i < next->line0) + { + putc (initial_tab ? '\t' : ' ', out); + print_1_line (0, &files[0].linbuf[i++]); + j++; + } + else + { + /* For each difference, first output the deleted part. */ + + k = next->deleted; + while (k--) + { + putc ('-', out); + if (initial_tab) + putc ('\t', out); + print_1_line (0, &files[0].linbuf[i++]); + } + + /* Then output the inserted part. */ + + k = next->inserted; + while (k--) + { + putc ('+', out); + if (initial_tab) + putc ('\t', out); + print_1_line (0, &files[1].linbuf[j++]); + } + + /* We're done with this hunk, so on to the next! */ + + next = next->link; + } + } +} + +/* Scan a (forward-ordered) edit script for the first place that more than + 2*CONTEXT unchanged lines appear, and return a pointer + to the `struct change' for the last change before those lines. */ + +static struct change * +find_hunk (struct change *start) +{ + struct change *prev; + lin top0, top1; + lin thresh; + + /* Threshold distance is 2 * CONTEXT + 1 between two non-ignorable + changes, but only CONTEXT if one is ignorable. Watch out for + integer overflow, though. */ + lin non_ignorable_threshold = + (LIN_MAX - 1) / 2 < context ? LIN_MAX : 2 * context + 1; + lin ignorable_threshold = context; + + do + { + /* Compute number of first line in each file beyond this changed. */ + top0 = start->line0 + start->deleted; + top1 = start->line1 + start->inserted; + prev = start; + start = start->link; + thresh = (prev->ignore || (start && start->ignore) + ? ignorable_threshold + : non_ignorable_threshold); + /* It is not supposed to matter which file we check in the end-test. + If it would matter, crash. */ + if (start && start->line0 - top0 != start->line1 - top1) + abort (); + } while (start + /* Keep going if less than THRESH lines + elapse before the affected line. */ + && start->line0 - top0 < thresh); + + return prev; +} + +/* Set the `ignore' flag properly in each change in SCRIPT. + It should be 1 if all the lines inserted or deleted in that change + are ignorable lines. */ + +static void +mark_ignorable (struct change *script) +{ + while (script) + { + struct change *next = script->link; + lin first0, last0, first1, last1; + + /* Turn this change into a hunk: detach it from the others. */ + script->link = 0; + + /* Determine whether this change is ignorable. */ + script->ignore = ! analyze_hunk (script, + &first0, &last0, &first1, &last1); + + /* Reconnect the chain as before. */ + script->link = next; + + /* Advance to the following change. */ + script = next; + } +} + +/* Find the last function-header line in LINBUF prior to line number LINENUM. + This is a line containing a match for the regexp in `function_regexp'. + Return the address of the text, or 0 if no function-header is found. */ + +static char const * +find_function (char const * const *linbuf, lin linenum) +{ + lin i = linenum; + lin last = find_function_last_search; + find_function_last_search = i; + + while (last <= --i) + { + /* See if this line is what we want. */ + char const *line = linbuf[i]; + size_t linelen = linbuf[i + 1] - line - 1; + + /* FIXME: re_search's size args should be size_t, not int. */ + int len = MIN (linelen, INT_MAX); + + if (0 <= re_search (&function_regexp, line, len, 0, len, 0)) + { + find_function_last_match = i; + return line; + } + } + /* If we search back to where we started searching the previous time, + find the line we found last time. */ + if (find_function_last_match != LIN_MAX) + return linbuf[find_function_last_match]; + + return 0; +} diff --git a/gnu/dist/diffutils/src/diff.c b/gnu/dist/diffutils/src/diff.c new file mode 100644 index 00000000000..e087fa76969 --- /dev/null +++ b/gnu/dist/diffutils/src/diff.c @@ -0,0 +1,1365 @@ +/* $NetBSD: diff.c,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* diff - compare files line by line + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 DIFF; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define GDIFF_MAIN +#include "diff.h" +#include <c-stack.h> +#include <dirname.h> +#include <error.h> +#include <exclude.h> +#include <exitfail.h> +#include <fnmatch.h> +#include <freesoft.h> +#include <getopt.h> +#include <hard-locale.h> +#include <prepargs.h> +#include <quotesys.h> +#include <regex.h> +#include <setmode.h> +#include <xalloc.h> + +static char const authorship_msgid[] = + N_("Written by Paul Eggert, Mike Haertel, David Hayes,\n\ +Richard Stallman, and Len Tower."); + +static char const copyright_string[] = + "Copyright (C) 2002 Free Software Foundation, Inc."; + +#ifndef GUTTER_WIDTH_MINIMUM +# define GUTTER_WIDTH_MINIMUM 3 +#endif + +struct regexp_list +{ + char *regexps; /* chars representing disjunction of the regexps */ + size_t len; /* chars used in `regexps' */ + size_t size; /* size malloc'ed for `regexps'; 0 if not malloc'ed */ + bool multiple_regexps;/* Does `regexps' represent a disjunction? */ + struct re_pattern_buffer *buf; +}; + +static int compare_files (struct comparison const *, char const *, char const *); +static void add_regexp (struct regexp_list *, char const *); +static void summarize_regexp_list (struct regexp_list *); +static void specify_style (enum output_style); +static void specify_value (char const **, char const *, char const *); +static void try_help (char const *, char const *) __attribute__((noreturn)); +static void check_stdout (void); +static void usage (void); + +/* If comparing directories, compare their common subdirectories + recursively. */ +static bool recursive; + +/* In context diffs, show previous lines that match these regexps. */ +static struct regexp_list function_regexp_list; + +/* Ignore changes affecting only lines that match these regexps. */ +static struct regexp_list ignore_regexp_list; + +#if HAVE_SETMODE_DOS +/* Use binary I/O when reading and writing data (--binary). + On POSIX hosts, this has no effect. */ +static bool binary; +#endif + +/* When comparing directories, if a file appears only in one + directory, treat it as present but empty in the other (-N). + Then `patch' would create the file with appropriate contents. */ +static bool new_file; + +/* When comparing directories, if a file appears only in the second + directory of the two, treat it as present but empty in the other + (--unidirectional-new-file). + Then `patch' would create the file with appropriate contents. */ +static bool unidirectional_new_file; + +/* Report files compared that are the same (-s). + Normally nothing is output when that happens. */ +static bool report_identical_files; + + +/* Return a string containing the command options with which diff was invoked. + Spaces appear between what were separate ARGV-elements. + There is a space at the beginning but none at the end. + If there were no options, the result is an empty string. + + Arguments: OPTIONVEC, a vector containing separate ARGV-elements, and COUNT, + the length of that vector. */ + +static char * +option_list (char **optionvec, int count) +{ + int i; + size_t size = 1; + char *result; + char *p; + + for (i = 0; i < count; i++) + size += 1 + quote_system_arg ((char *) 0, optionvec[i]); + + p = result = xmalloc (size); + + for (i = 0; i < count; i++) + { + *p++ = ' '; + p += quote_system_arg (p, optionvec[i]); + } + + *p = 0; + return result; +} + + +/* Return an option value suitable for add_exclude. */ + +static int +exclude_options (void) +{ + return EXCLUDE_WILDCARDS | (ignore_file_name_case ? FNM_CASEFOLD : 0); +} + +static char const shortopts[] = +"0123456789abBcC:dD:eEfF:hHiI:lL:nNpPqrsS:tTuU:vwW:x:X:y"; + +/* Values for long options that do not have single-letter equivalents. */ +enum +{ + BINARY_OPTION = CHAR_MAX + 1, + FROM_FILE_OPTION, + HELP_OPTION, + HORIZON_LINES_OPTION, + IGNORE_FILE_NAME_CASE_OPTION, + INHIBIT_HUNK_MERGE_OPTION, + LEFT_COLUMN_OPTION, + LINE_FORMAT_OPTION, + NO_IGNORE_FILE_NAME_CASE_OPTION, + NORMAL_OPTION, + SDIFF_MERGE_ASSIST_OPTION, + STRIP_TRAILING_CR_OPTION, + SUPPRESS_COMMON_LINES_OPTION, + TO_FILE_OPTION, + + /* These options must be in sequence. */ + UNCHANGED_LINE_FORMAT_OPTION, + OLD_LINE_FORMAT_OPTION, + NEW_LINE_FORMAT_OPTION, + + /* These options must be in sequence. */ + UNCHANGED_GROUP_FORMAT_OPTION, + OLD_GROUP_FORMAT_OPTION, + NEW_GROUP_FORMAT_OPTION, + CHANGED_GROUP_FORMAT_OPTION +}; + +static char const group_format_option[][sizeof "--unchanged-group-format"] = + { + "--unchanged-group-format", + "--old-group-format", + "--new-group-format", + "--changed-group-format" + }; + +static char const line_format_option[][sizeof "--unchanged-line-format"] = + { + "--unchanged-line-format", + "--old-line-format", + "--new-line-format" + }; + +static struct option const longopts[] = +{ + {"binary", 0, 0, BINARY_OPTION}, + {"brief", 0, 0, 'q'}, + {"changed-group-format", 1, 0, CHANGED_GROUP_FORMAT_OPTION}, + {"context", 2, 0, 'C'}, + {"ed", 0, 0, 'e'}, + {"exclude", 1, 0, 'x'}, + {"exclude-from", 1, 0, 'X'}, + {"expand-tabs", 0, 0, 't'}, + {"forward-ed", 0, 0, 'f'}, + {"from-file", 1, 0, FROM_FILE_OPTION}, + {"help", 0, 0, HELP_OPTION}, + {"horizon-lines", 1, 0, HORIZON_LINES_OPTION}, + {"ifdef", 1, 0, 'D'}, + {"ignore-all-space", 0, 0, 'w'}, + {"ignore-blank-lines", 0, 0, 'B'}, + {"ignore-case", 0, 0, 'i'}, + {"ignore-file-name-case", 0, 0, IGNORE_FILE_NAME_CASE_OPTION}, + {"ignore-matching-lines", 1, 0, 'I'}, + {"ignore-space-change", 0, 0, 'b'}, + {"ignore-tab-expansion", 0, 0, 'E'}, + {"inhibit-hunk-merge", 0, 0, INHIBIT_HUNK_MERGE_OPTION}, + {"initial-tab", 0, 0, 'T'}, + {"label", 1, 0, 'L'}, + {"left-column", 0, 0, LEFT_COLUMN_OPTION}, + {"line-format", 1, 0, LINE_FORMAT_OPTION}, + {"minimal", 0, 0, 'd'}, + {"new-file", 0, 0, 'N'}, + {"new-group-format", 1, 0, NEW_GROUP_FORMAT_OPTION}, + {"new-line-format", 1, 0, NEW_LINE_FORMAT_OPTION}, + {"no-ignore-file-name-case", 0, 0, NO_IGNORE_FILE_NAME_CASE_OPTION}, + {"normal", 0, 0, NORMAL_OPTION}, + {"old-group-format", 1, 0, OLD_GROUP_FORMAT_OPTION}, + {"old-line-format", 1, 0, OLD_LINE_FORMAT_OPTION}, + {"paginate", 0, 0, 'l'}, + {"rcs", 0, 0, 'n'}, + {"recursive", 0, 0, 'r'}, + {"report-identical-files", 0, 0, 's'}, + {"sdiff-merge-assist", 0, 0, SDIFF_MERGE_ASSIST_OPTION}, + {"show-c-function", 0, 0, 'p'}, + {"show-function-line", 1, 0, 'F'}, + {"side-by-side", 0, 0, 'y'}, + {"speed-large-files", 0, 0, 'H'}, + {"starting-file", 1, 0, 'S'}, + {"strip-trailing-cr", 0, 0, STRIP_TRAILING_CR_OPTION}, + {"suppress-common-lines", 0, 0, SUPPRESS_COMMON_LINES_OPTION}, + {"text", 0, 0, 'a'}, + {"to-file", 1, 0, TO_FILE_OPTION}, + {"unchanged-group-format", 1, 0, UNCHANGED_GROUP_FORMAT_OPTION}, + {"unchanged-line-format", 1, 0, UNCHANGED_LINE_FORMAT_OPTION}, + {"unidirectional-new-file", 0, 0, 'P'}, + {"unified", 2, 0, 'U'}, + {"version", 0, 0, 'v'}, + {"width", 1, 0, 'W'}, + {0, 0, 0, 0} +}; + +int +main (int argc, char **argv) +{ + int exit_status = EXIT_SUCCESS; + int c; + int i; + int prev = -1; + lin ocontext = -1; + bool explicit_context = 0; + int width = 0; + bool show_c_function = 0; + char const *from_file = 0; + char const *to_file = 0; + uintmax_t numval; + char *numend; + + /* Do our initializations. */ + exit_failure = 2; + initialize_main (&argc, &argv); + program_name = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + c_stack_action (c_stack_die); + function_regexp_list.buf = &function_regexp; + ignore_regexp_list.buf = &ignore_regexp; + re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING); + excluded = new_exclude (); + + /* Decode the options. */ + + while ((c = getopt_long (argc, argv, shortopts, longopts, 0)) != -1) + { + switch (c) + { + case 0: + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (! ISDIGIT (prev)) + ocontext = c - '0'; + else if (LIN_MAX / 10 < ocontext + || ((ocontext = 10 * ocontext + c - '0') < 0)) + ocontext = LIN_MAX; + break; + + case 'a': + text = 1; + break; + + case 'b': + if (ignore_white_space < IGNORE_SPACE_CHANGE) + ignore_white_space = IGNORE_SPACE_CHANGE; + break; + + case 'B': + ignore_blank_lines = 1; + break; + + case 'C': /* +context[=lines] */ + case 'U': /* +unified[=lines] */ + { + if (optarg) + { + numval = strtoumax (optarg, &numend, 10); + if (*numend) + try_help ("invalid context length `%s'", optarg); + if (LIN_MAX < numval) + numval = LIN_MAX; + } + else + numval = 3; + + specify_style (c == 'U' ? OUTPUT_UNIFIED : OUTPUT_CONTEXT); + if (context < numval) + context = numval; + explicit_context = 1; + } + break; + + case 'c': + specify_style (OUTPUT_CONTEXT); + if (context < 3) + context = 3; + break; + + case 'd': + minimal = 1; + break; + + case 'D': + specify_style (OUTPUT_IFDEF); + { + static char const C_ifdef_group_formats[] = + "%%=%c#ifndef %s\n%%<#endif /* ! %s */\n%c#ifdef %s\n%%>#endif /* %s */\n%c#ifndef %s\n%%<#else /* %s */\n%%>#endif /* %s */\n"; + char *b = xmalloc (sizeof C_ifdef_group_formats + + 7 * strlen (optarg) - 14 /* 7*"%s" */ + - 8 /* 5*"%%" + 3*"%c" */); + sprintf (b, C_ifdef_group_formats, + 0, + optarg, optarg, 0, + optarg, optarg, 0, + optarg, optarg, optarg); + for (i = 0; i < sizeof group_format / sizeof *group_format; i++) + { + specify_value (&group_format[i], b, "-D"); + b += strlen (b) + 1; + } + } + break; + + case 'e': + specify_style (OUTPUT_ED); + break; + + case 'E': + if (ignore_white_space < IGNORE_TAB_EXPANSION) + ignore_white_space = IGNORE_TAB_EXPANSION; + break; + + case 'f': + specify_style (OUTPUT_FORWARD_ED); + break; + + case 'F': + add_regexp (&function_regexp_list, optarg); + break; + + case 'h': + /* Split the files into chunks for faster processing. + Usually does not change the result. + + This currently has no effect. */ + break; + + case 'H': + speed_large_files = 1; + break; + + case 'i': + ignore_case = 1; + break; + + case 'I': + add_regexp (&ignore_regexp_list, optarg); + break; + + case 'l': + if (!pr_program[0]) + try_help ("pagination not supported on this host", 0); + paginate = 1; +#ifdef SIGCHLD + /* Pagination requires forking and waiting, and + System V fork+wait does not work if SIGCHLD is ignored. */ + signal (SIGCHLD, SIG_DFL); +#endif + break; + + case 'L': + if (!file_label[0]) + file_label[0] = optarg; + else if (!file_label[1]) + file_label[1] = optarg; + else + fatal ("too many file label options"); + break; + + case 'n': + specify_style (OUTPUT_RCS); + break; + + case 'N': + new_file = 1; + break; + + case 'p': + show_c_function = 1; + add_regexp (&function_regexp_list, "^[[:alpha:]$_]"); + break; + + case 'P': + unidirectional_new_file = 1; + break; + + case 'q': + brief = 1; + break; + + case 'r': + recursive = 1; + break; + + case 's': + report_identical_files = 1; + break; + + case 'S': + specify_value (&starting_file, optarg, "-S"); + break; + + case 't': + expand_tabs = 1; + break; + + case 'T': + initial_tab = 1; + break; + + case 'u': + specify_style (OUTPUT_UNIFIED); + if (context < 3) + context = 3; + break; + + case 'v': + printf ("diff %s\n%s\n\n%s\n\n%s\n", + version_string, copyright_string, + _(free_software_msgid), _(authorship_msgid)); + check_stdout (); + return EXIT_SUCCESS; + + case 'w': + ignore_white_space = IGNORE_ALL_SPACE; + break; + + case 'x': + add_exclude (excluded, optarg, exclude_options ()); + break; + + case 'X': + if (add_exclude_file (add_exclude, excluded, optarg, + exclude_options (), '\n')) + pfatal_with_name (optarg); + break; + + case 'y': + specify_style (OUTPUT_SDIFF); + break; + + case 'W': + numval = strtoumax (optarg, &numend, 10); + if (! (0 < numval && numval <= INT_MAX) || *numend) + try_help ("invalid width `%s'", optarg); + if (width != numval) + { + if (width) + fatal ("conflicting width options"); + width = numval; + } + break; + + case BINARY_OPTION: +#if HAVE_SETMODE_DOS + binary = 1; + set_binary_mode (STDOUT_FILENO, 1); +#endif + break; + + case FROM_FILE_OPTION: + specify_value (&from_file, optarg, "--from-file"); + break; + + case HELP_OPTION: + usage (); + check_stdout (); + return EXIT_SUCCESS; + + case HORIZON_LINES_OPTION: + numval = strtoumax (optarg, &numend, 10); + if (*numend) + try_help ("invalid horizon length `%s'", optarg); + horizon_lines = MAX (horizon_lines, MIN (numval, LIN_MAX)); + break; + + case IGNORE_FILE_NAME_CASE_OPTION: + ignore_file_name_case = 1; + break; + + case INHIBIT_HUNK_MERGE_OPTION: + /* This option is obsolete, but accept it for backward + compatibility. */ + break; + + case LEFT_COLUMN_OPTION: + left_column = 1; + break; + + case LINE_FORMAT_OPTION: + specify_style (OUTPUT_IFDEF); + for (i = 0; i < sizeof line_format / sizeof *line_format; i++) + specify_value (&line_format[i], optarg, "--line-format"); + break; + + case NO_IGNORE_FILE_NAME_CASE_OPTION: + ignore_file_name_case = 0; + break; + + case NORMAL_OPTION: + specify_style (OUTPUT_NORMAL); + break; + + case SDIFF_MERGE_ASSIST_OPTION: + specify_style (OUTPUT_SDIFF); + sdiff_merge_assist = 1; + break; + + case STRIP_TRAILING_CR_OPTION: + strip_trailing_cr = 1; + break; + + case SUPPRESS_COMMON_LINES_OPTION: + suppress_common_lines = 1; + break; + + case TO_FILE_OPTION: + specify_value (&to_file, optarg, "--to-file"); + break; + + case UNCHANGED_LINE_FORMAT_OPTION: + case OLD_LINE_FORMAT_OPTION: + case NEW_LINE_FORMAT_OPTION: + specify_style (OUTPUT_IFDEF); + c -= UNCHANGED_LINE_FORMAT_OPTION; + specify_value (&line_format[c], optarg, line_format_option[c]); + break; + + case UNCHANGED_GROUP_FORMAT_OPTION: + case OLD_GROUP_FORMAT_OPTION: + case NEW_GROUP_FORMAT_OPTION: + case CHANGED_GROUP_FORMAT_OPTION: + specify_style (OUTPUT_IFDEF); + c -= UNCHANGED_GROUP_FORMAT_OPTION; + specify_value (&group_format[c], optarg, group_format_option[c]); + break; + + default: + try_help (0, 0); + } + prev = c; + } + + if (output_style == OUTPUT_UNSPECIFIED) + { + if (show_c_function) + { + specify_style (OUTPUT_CONTEXT); + if (ocontext < 0) + context = 3; + } + else + specify_style (OUTPUT_NORMAL); + } + + if (output_style != OUTPUT_CONTEXT || hard_locale (LC_TIME)) + time_format = "%Y-%m-%d %H:%M:%S.%N %z"; + else + { + /* See POSIX 1003.1-2001 for this format. */ + time_format = "%a %b %e %T %Y"; + } + + if (0 <= ocontext) + { + bool modern_usage = 200112 <= posix2_version (); + + if ((output_style == OUTPUT_CONTEXT + || output_style == OUTPUT_UNIFIED) + && (context < ocontext + || (ocontext < context && ! explicit_context))) + { + if (modern_usage) + { + error (0, 0, + _("`-%ld' option is obsolete; use `-%c %ld'"), + (long) ocontext, + output_style == OUTPUT_CONTEXT ? 'C' : 'U', + (long) ocontext); + try_help (0, 0); + } + context = ocontext; + } + else + { + if (modern_usage) + { + error (0, 0, _("`-%ld' option is obsolete; omit it"), + (long) ocontext); + try_help (0, 0); + } + } + } + + { + /* + * We maximize first the half line width, and then the gutter width, + * according to the following constraints: + * 1. Two half lines plus a gutter must fit in a line. + * 2. If the half line width is nonzero: + * a. The gutter width is at least GUTTER_WIDTH_MINIMUM. + * b. If tabs are not expanded to spaces, + * a half line plus a gutter is an integral number of tabs, + * so that tabs in the right column line up. + */ + unsigned int t = expand_tabs ? 1 : TAB_WIDTH; + int w = width ? width : 130; + int off = (w + t + GUTTER_WIDTH_MINIMUM) / (2 * t) * t; + sdiff_half_width = MAX (0, MIN (off - GUTTER_WIDTH_MINIMUM, w - off)), + sdiff_column2_offset = sdiff_half_width ? off : w; + } + + /* Make the horizon at least as large as the context, so that + shift_boundaries has more freedom to shift the first and last hunks. */ + if (horizon_lines < context) + horizon_lines = context; + + summarize_regexp_list (&function_regexp_list); + summarize_regexp_list (&ignore_regexp_list); + + if (output_style == OUTPUT_IFDEF) + { + for (i = 0; i < sizeof line_format / sizeof *line_format; i++) + if (!line_format[i]) + line_format[i] = "%l\n"; + if (!group_format[OLD]) + group_format[OLD] + = group_format[CHANGED] ? group_format[CHANGED] : "%<"; + if (!group_format[NEW]) + group_format[NEW] + = group_format[CHANGED] ? group_format[CHANGED] : "%>"; + if (!group_format[UNCHANGED]) + group_format[UNCHANGED] = "%="; + if (!group_format[CHANGED]) + group_format[CHANGED] = concat (group_format[OLD], + group_format[NEW], ""); + } + + no_diff_means_no_output = + (output_style == OUTPUT_IFDEF ? + (!*group_format[UNCHANGED] + || (strcmp (group_format[UNCHANGED], "%=") == 0 + && !*line_format[UNCHANGED])) + : (output_style != OUTPUT_SDIFF) | suppress_common_lines); + + files_can_be_treated_as_binary = + (brief + & ~ (ignore_blank_lines | ignore_case | strip_trailing_cr + | (ignore_regexp_list.regexps || ignore_white_space))); + + switch_string = option_list (argv + 1, optind - 1); + + if (from_file) + { + if (to_file) + fatal ("--from-file and --to-file both specified"); + else + for (; optind < argc; optind++) + { + int status = compare_files ((struct comparison *) 0, + from_file, argv[optind]); + if (exit_status < status) + exit_status = status; + } + } + else + { + if (to_file) + for (; optind < argc; optind++) + { + int status = compare_files ((struct comparison *) 0, + argv[optind], to_file); + if (exit_status < status) + exit_status = status; + } + else + { + if (argc - optind != 2) + { + if (argc - optind < 2) + try_help ("missing operand after `%s'", argv[argc - 1]); + else + try_help ("extra operand `%s'", argv[optind + 2]); + } + + exit_status = compare_files ((struct comparison *) 0, + argv[optind], argv[optind + 1]); + } + } + + /* Print any messages that were saved up for last. */ + print_message_queue (); + + check_stdout (); + exit (exit_status); + return exit_status; +} + +/* Append to REGLIST the regexp PATTERN. */ + +static void +add_regexp (struct regexp_list *reglist, char const *pattern) +{ + size_t patlen = strlen (pattern); + char const *m = re_compile_pattern (pattern, patlen, reglist->buf); + + if (m != 0) + error (0, 0, "%s: %s", pattern, m); + else + { + char *regexps = reglist->regexps; + size_t len = reglist->len; + bool multiple_regexps = reglist->multiple_regexps = regexps != 0; + size_t newlen = reglist->len = len + 2 * multiple_regexps + patlen; + size_t size = reglist->size; + + if (size <= newlen) + { + if (!size) + size = 1; + + do size *= 2; + while (size <= newlen); + + reglist->size = size; + reglist->regexps = regexps = xrealloc (regexps, size); + } + if (multiple_regexps) + { + regexps[len++] = '\\'; + regexps[len++] = '|'; + } + memcpy (regexps + len, pattern, patlen + 1); + } +} + +/* Ensure that REGLIST represents the disjunction of its regexps. + This is done here, rather than earlier, to avoid O(N^2) behavior. */ + +static void +summarize_regexp_list (struct regexp_list *reglist) +{ + if (reglist->regexps) + { + /* At least one regexp was specified. Allocate a fastmap for it. */ + reglist->buf->fastmap = xmalloc (1 << CHAR_BIT); + if (reglist->multiple_regexps) + { + /* Compile the disjunction of the regexps. + (If just one regexp was specified, it is already compiled.) */ + char const *m = re_compile_pattern (reglist->regexps, reglist->len, + reglist->buf); + if (m != 0) + error (EXIT_TROUBLE, 0, "%s: %s", reglist->regexps, m); + } + } +} + +static void +try_help (char const *reason_msgid, char const *operand) +{ + if (reason_msgid) + error (0, 0, _(reason_msgid), operand); + error (EXIT_TROUBLE, 0, _("Try `%s --help' for more information."), + program_name); + abort (); +} + +static void +check_stdout (void) +{ + if (ferror (stdout)) + fatal ("write failed"); + else if (fclose (stdout) != 0) + pfatal_with_name (_("standard output")); +} + +static char const * const option_help_msgid[] = { + N_("Compare files line by line."), + "", + N_("-i --ignore-case Ignore case differences in file contents."), + N_("--ignore-file-name-case Ignore case when comparing file names."), + N_("--no-ignore-file-name-case Consider case when comparing file names."), + N_("-E --ignore-tab-expansion Ignore changes due to tab expansion."), + N_("-b --ignore-space-change Ignore changes in the amount of white space."), + N_("-w --ignore-all-space Ignore all white space."), + N_("-B --ignore-blank-lines Ignore changes whose lines are all blank."), + N_("-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE."), + N_("--strip-trailing-cr Strip trailing carriage return on input."), +#if HAVE_SETMODE_DOS + N_("--binary Read and write data in binary mode."), +#endif + N_("-a --text Treat all files as text."), + "", + N_("-c -C NUM --context[=NUM] Output NUM (default 3) lines of copied context.\n\ +-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified context.\n\ + --label LABEL Use LABEL instead of file name.\n\ + -p --show-c-function Show which C function each change is in.\n\ + -F RE --show-function-line=RE Show the most recent line matching RE."), + N_("-q --brief Output only whether files differ."), + N_("-e --ed Output an ed script."), + N_("--normal Output a normal diff."), + N_("-n --rcs Output an RCS format diff."), + N_("-y --side-by-side Output in two columns.\n\ + -W NUM --width=NUM Output at most NUM (default 130) print columns.\n\ + --left-column Output only the left column of common lines.\n\ + --suppress-common-lines Do not output common lines."), + N_("-D NAME --ifdef=NAME Output merged file to show `#ifdef NAME' diffs."), + N_("--GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT."), + N_("--line-format=LFMT Similar, but format all input lines with LFMT."), + N_("--LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT."), + N_(" LTYPE is `old', `new', or `unchanged'. GTYPE is LTYPE or `changed'."), + N_(" GFMT may contain:\n\ + %< lines from FILE1\n\ + %> lines from FILE2\n\ + %= lines common to FILE1 and FILE2\n\ + %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER\n\ + LETTERs are as follows for new group, lower case for old group:\n\ + F first line number\n\ + L last line number\n\ + N number of lines = L-F+1\n\ + E F-1\n\ + M L+1"), + N_(" LFMT may contain:\n\ + %L contents of line\n\ + %l contents of line, excluding any trailing newline\n\ + %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number"), + N_(" Either GFMT or LFMT may contain:\n\ + %% %\n\ + %c'C' the single character C\n\ + %c'\\OOO' the character with octal code OOO"), + "", + N_("-l --paginate Pass the output through `pr' to paginate it."), + N_("-t --expand-tabs Expand tabs to spaces in output."), + N_("-T --initial-tab Make tabs line up by prepending a tab."), + "", + N_("-r --recursive Recursively compare any subdirectories found."), + N_("-N --new-file Treat absent files as empty."), + N_("--unidirectional-new-file Treat absent first files as empty."), + N_("-s --report-identical-files Report when two files are the same."), + N_("-x PAT --exclude=PAT Exclude files that match PAT."), + N_("-X FILE --exclude-from=FILE Exclude files that match any pattern in FILE."), + N_("-S FILE --starting-file=FILE Start with FILE when comparing directories."), + N_("--from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory."), + N_("--to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory."), + "", + N_("--horizon-lines=NUM Keep NUM lines of the common prefix and suffix."), + N_("-d --minimal Try hard to find a smaller set of changes."), + N_("--speed-large-files Assume large files and many scattered small changes."), + "", + N_("-v --version Output version info."), + N_("--help Output this help."), + "", + N_("FILES are `FILE1 FILE2' or `DIR1 DIR2' or `DIR FILE...' or `FILE... DIR'."), + N_("If --from-file or --to-file is given, there are no restrictions on FILES."), + N_("If a FILE is `-', read standard input."), + "", + N_("Report bugs to <bug-gnu-utils@gnu.org>."), + 0 +}; + +static void +usage (void) +{ + char const * const *p; + + printf (_("Usage: %s [OPTION]... FILES\n"), program_name); + + for (p = option_help_msgid; *p; p++) + { + if (!**p) + putchar ('\n'); + else + { + char const *msg = _(*p); + char const *nl; + while ((nl = strchr (msg, '\n'))) + { + int msglen = nl + 1 - msg; + printf (" %.*s", msglen, msg); + msg = nl + 1; + } + + printf (" %s\n" + 2 * (*msg != ' ' && *msg != '-'), msg); + } + } +} + +/* Set VAR to VALUE, reporting an OPTION error if this is a + conflict. */ +static void +specify_value (char const **var, char const *value, char const *option) +{ + if (*var && strcmp (*var, value) != 0) + { + error (0, 0, _("conflicting %s option value `%s'"), option, value); + try_help (0, 0); + } + *var = value; +} + +/* Set the output style to STYLE, diagnosing conflicts. */ +static void +specify_style (enum output_style style) +{ + if (output_style != style) + { + if (output_style != OUTPUT_UNSPECIFIED) + try_help ("conflicting output style options", 0); + output_style = style; + } +} + +static char const * +filetype (struct stat const *st) +{ + /* See POSIX 1003.1-2001 for these formats. + + To keep diagnostics grammatical in English, the returned string + must start with a consonant. */ + + if (S_ISREG (st->st_mode)) + return st->st_size == 0 ? _("regular empty file") : _("regular file"); + + if (S_ISDIR (st->st_mode)) return _("directory"); + +#ifdef S_ISBLK + if (S_ISBLK (st->st_mode)) return _("block special file"); +#endif +#ifdef S_ISCHR + if (S_ISCHR (st->st_mode)) return _("character special file"); +#endif +#ifdef S_ISFIFO + if (S_ISFIFO (st->st_mode)) return _("fifo"); +#endif + /* S_ISLNK is impossible with `fstat' and `stat'. */ +#ifdef S_ISSOCK + if (S_ISSOCK (st->st_mode)) return _("socket"); +#endif +#ifdef S_TYPEISMQ + if (S_TYPEISMQ (st)) return _("message queue"); +#endif +#ifdef S_TYPEISSEM + if (S_TYPEISSEM (st)) return _("semaphore"); +#endif +#ifdef S_TYPEISSHM + if (S_TYPEISSHM (st)) return _("shared memory object"); +#endif +#ifdef S_TYPEISTMO + if (S_TYPEISTMO (st)) return _("typed memory object"); +#endif + + return _("weird file"); +} + +/* Set the last-modified time of *ST to be the current time. */ + +static void +set_mtime_to_now (struct stat *st) +{ +#ifdef ST_MTIM_NSEC + +# if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME + if (clock_gettime (CLOCK_REALTIME, &st->st_mtim) == 0) + return; +# endif + +# if HAVE_GETTIMEOFDAY + { + struct timeval timeval; + if (gettimeofday (&timeval, NULL) == 0) + { + st->st_mtime = timeval.tv_sec; + st->st_mtim.ST_MTIM_NSEC = timeval.tv_usec * 1000; + return; + } + } +# endif + +#endif /* ST_MTIM_NSEC */ + + time (&st->st_mtime); +} + +/* Compare two files (or dirs) with parent comparison PARENT + and names NAME0 and NAME1. + (If PARENT is 0, then the first name is just NAME0, etc.) + This is self-contained; it opens the files and closes them. + + Value is EXIT_SUCCESS if files are the same, EXIT_FAILURE if + different, EXIT_TROUBLE if there is a problem opening them. */ + +static int +compare_files (struct comparison const *parent, + char const *name0, + char const *name1) +{ + struct comparison cmp; +#define DIR_P(f) (S_ISDIR (cmp.file[f].stat.st_mode) != 0) + register int f; + int status = EXIT_SUCCESS; + bool same_files; + char *free0, *free1; + + /* If this is directory comparison, perhaps we have a file + that exists only in one of the directories. + If so, just print a message to that effect. */ + + if (! ((name0 && name1) + || (unidirectional_new_file && name1) + || new_file)) + { + char const *name = name0 == 0 ? name1 : name0; + char const *dir = parent->file[name0 == 0].name; + + /* See POSIX 1003.1-2001 for this format. */ + message ("Only in %s: %s\n", dir, name); + + /* Return EXIT_FAILURE so that diff_dirs will return + EXIT_FAILURE ("some files differ"). */ + return EXIT_FAILURE; + } + + memset (cmp.file, 0, sizeof cmp.file); + cmp.parent = parent; + + /* cmp.file[f].desc markers */ +#define NONEXISTENT (-1) /* nonexistent file */ +#define UNOPENED (-2) /* unopened file (e.g. directory) */ +#define ERRNO_ENCODE(errno) (-3 - (errno)) /* encoded errno value */ + +#define ERRNO_DECODE(desc) (-3 - (desc)) /* inverse of ERRNO_ENCODE */ + + cmp.file[0].desc = name0 == 0 ? NONEXISTENT : UNOPENED; + cmp.file[1].desc = name1 == 0 ? NONEXISTENT : UNOPENED; + + /* Now record the full name of each file, including nonexistent ones. */ + + if (name0 == 0) + name0 = name1; + if (name1 == 0) + name1 = name0; + + if (!parent) + { + free0 = 0; + free1 = 0; + cmp.file[0].name = name0; + cmp.file[1].name = name1; + } + else + { + cmp.file[0].name = free0 + = dir_file_pathname (parent->file[0].name, name0); + cmp.file[1].name = free1 + = dir_file_pathname (parent->file[1].name, name1); + } + + /* Stat the files. */ + + for (f = 0; f < 2; f++) + { + if (cmp.file[f].desc != NONEXISTENT) + { + if (f && file_name_cmp (cmp.file[f].name, cmp.file[0].name) == 0) + { + cmp.file[f].desc = cmp.file[0].desc; + cmp.file[f].stat = cmp.file[0].stat; + } + else if (strcmp (cmp.file[f].name, "-") == 0) + { + cmp.file[f].desc = STDIN_FILENO; + if (fstat (STDIN_FILENO, &cmp.file[f].stat) != 0) + cmp.file[f].desc = ERRNO_ENCODE (errno); + else + { + if (S_ISREG (cmp.file[f].stat.st_mode)) + { + off_t pos = lseek (STDIN_FILENO, (off_t) 0, SEEK_CUR); + if (pos < 0) + cmp.file[f].desc = ERRNO_ENCODE (errno); + else + cmp.file[f].stat.st_size = + MAX (0, cmp.file[f].stat.st_size - pos); + } + + /* POSIX 1003.1-2001 requires current time for + stdin. */ + set_mtime_to_now (&cmp.file[f].stat); + } + } + else if (stat (cmp.file[f].name, &cmp.file[f].stat) != 0) + cmp.file[f].desc = ERRNO_ENCODE (errno); + } + } + + /* Mark files as nonexistent at the top level as needed for -N and + --unidirectional-new-file. */ + if (! parent) + { + if ((new_file | unidirectional_new_file) + && cmp.file[0].desc == ERRNO_ENCODE (ENOENT) + && cmp.file[1].desc == UNOPENED) + cmp.file[0].desc = NONEXISTENT; + + if (new_file + && cmp.file[0].desc == UNOPENED + && cmp.file[1].desc == ERRNO_ENCODE (ENOENT)) + cmp.file[1].desc = NONEXISTENT; + } + + for (f = 0; f < 2; f++) + if (cmp.file[f].desc == NONEXISTENT) + cmp.file[f].stat.st_mode = cmp.file[1 - f].stat.st_mode; + + for (f = 0; f < 2; f++) + { + int e = ERRNO_DECODE (cmp.file[f].desc); + if (0 <= e) + { + errno = e; + perror_with_name (cmp.file[f].name); + status = EXIT_TROUBLE; + } + } + + if (status == EXIT_SUCCESS && ! parent && DIR_P (0) != DIR_P (1)) + { + /* If one is a directory, and it was specified in the command line, + use the file in that dir with the other file's basename. */ + + int fnm_arg = DIR_P (0); + int dir_arg = 1 - fnm_arg; + char const *fnm = cmp.file[fnm_arg].name; + char const *dir = cmp.file[dir_arg].name; + char const *filename = cmp.file[dir_arg].name = free0 + = dir_file_pathname (dir, base_name (fnm)); + + if (strcmp (fnm, "-") == 0) + fatal ("cannot compare `-' to a directory"); + + if (stat (filename, &cmp.file[dir_arg].stat) != 0) + { + perror_with_name (filename); + status = EXIT_TROUBLE; + } + } + + if (status != EXIT_SUCCESS) + { + /* One of the files should exist but does not. */ + } + else if ((same_files + = (cmp.file[0].desc != NONEXISTENT + && cmp.file[1].desc != NONEXISTENT + && 0 < same_file (&cmp.file[0].stat, &cmp.file[1].stat) + && same_file_attributes (&cmp.file[0].stat, + &cmp.file[1].stat))) + && no_diff_means_no_output) + { + /* The two named files are actually the same physical file. + We know they are identical without actually reading them. */ + } + else if (DIR_P (0) & DIR_P (1)) + { + if (output_style == OUTPUT_IFDEF) + fatal ("-D option not supported with directories"); + + /* If both are directories, compare the files in them. */ + + if (parent && !recursive) + { + /* But don't compare dir contents one level down + unless -r was specified. + See POSIX 1003.1-2001 for this format. */ + message ("Common subdirectories: %s and %s\n", + cmp.file[0].name, cmp.file[1].name); + } + else + status = diff_dirs (&cmp, compare_files); + } + else if ((DIR_P (0) | DIR_P (1)) + || (parent + && (! S_ISREG (cmp.file[0].stat.st_mode) + || ! S_ISREG (cmp.file[1].stat.st_mode)))) + { + if (cmp.file[0].desc == NONEXISTENT || cmp.file[1].desc == NONEXISTENT) + { + /* We have a subdirectory that exists only in one directory. */ + + if ((DIR_P (0) | DIR_P (1)) + && recursive + && (new_file + || (unidirectional_new_file + && cmp.file[0].desc == NONEXISTENT))) + status = diff_dirs (&cmp, compare_files); + else + { + char const *dir + = parent->file[cmp.file[0].desc == NONEXISTENT].name; + + /* See POSIX 1003.1-2001 for this format. */ + message ("Only in %s: %s\n", dir, name0); + + status = EXIT_FAILURE; + } + } + else + { + /* We have two files that are not to be compared. */ + + /* See POSIX 1003.1-2001 for this format. */ + message5 ("File %s is a %s while file %s is a %s\n", + file_label[0] ? file_label[0] : cmp.file[0].name, + filetype (&cmp.file[0].stat), + file_label[1] ? file_label[1] : cmp.file[1].name, + filetype (&cmp.file[1].stat)); + + /* This is a difference. */ + status = EXIT_FAILURE; + } + } + else if (files_can_be_treated_as_binary + && cmp.file[0].stat.st_size != cmp.file[1].stat.st_size + && (cmp.file[0].desc == NONEXISTENT + || S_ISREG (cmp.file[0].stat.st_mode)) + && (cmp.file[1].desc == NONEXISTENT + || S_ISREG (cmp.file[1].stat.st_mode))) + { + message ("Files %s and %s differ\n", + file_label[0] ? file_label[0] : cmp.file[0].name, + file_label[1] ? file_label[1] : cmp.file[1].name); + status = EXIT_FAILURE; + } + else + { + /* Both exist and neither is a directory. */ + + /* Open the files and record their descriptors. */ + + if (cmp.file[0].desc == UNOPENED) + if ((cmp.file[0].desc = open (cmp.file[0].name, O_RDONLY, 0)) < 0) + { + perror_with_name (cmp.file[0].name); + status = EXIT_TROUBLE; + } + if (cmp.file[1].desc == UNOPENED) + { + if (same_files) + cmp.file[1].desc = cmp.file[0].desc; + else if ((cmp.file[1].desc = open (cmp.file[1].name, O_RDONLY, 0)) + < 0) + { + perror_with_name (cmp.file[1].name); + status = EXIT_TROUBLE; + } + } + +#if HAVE_SETMODE_DOS + if (binary) + for (f = 0; f < 2; f++) + if (0 <= cmp.file[f].desc) + set_binary_mode (cmp.file[f].desc, 1); +#endif + + /* Compare the files, if no error was found. */ + + if (status == EXIT_SUCCESS) + status = diff_2_files (&cmp); + + /* Close the file descriptors. */ + + if (0 <= cmp.file[0].desc && close (cmp.file[0].desc) != 0) + { + perror_with_name (cmp.file[0].name); + status = EXIT_TROUBLE; + } + if (0 <= cmp.file[1].desc && cmp.file[0].desc != cmp.file[1].desc + && close (cmp.file[1].desc) != 0) + { + perror_with_name (cmp.file[1].name); + status = EXIT_TROUBLE; + } + } + + /* Now the comparison has been done, if no error prevented it, + and STATUS is the value this function will return. */ + + if (status == EXIT_SUCCESS) + { + if (report_identical_files && !DIR_P (0)) + message ("Files %s and %s are identical\n", + file_label[0] ? file_label[0] : cmp.file[0].name, + file_label[1] ? file_label[1] : cmp.file[1].name); + } + else + { + /* Flush stdout so that the user sees differences immediately. + This can hurt performance, unfortunately. */ + if (fflush (stdout) != 0) + pfatal_with_name (_("standard output")); + } + + if (free0) + free (free0); + if (free1) + free (free1); + + return status; +} diff --git a/gnu/dist/diffutils/src/diff.h b/gnu/dist/diffutils/src/diff.h new file mode 100644 index 00000000000..deb561a6931 --- /dev/null +++ b/gnu/dist/diffutils/src/diff.h @@ -0,0 +1,377 @@ +/* $NetBSD: diff.h,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* Shared definitions for GNU DIFF + + Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001, + 2002 Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "system.h" +#include <stdio.h> + +#define TAB_WIDTH 8 + +/* What kind of changes a hunk contains. */ +enum changes +{ + /* No changes: lines common to both files. */ + UNCHANGED, + + /* Deletes only: lines taken from just the first file. */ + OLD, + + /* Inserts only: lines taken from just the second file. */ + NEW, + + /* Both deletes and inserts: a hunk containing both old and new lines. */ + CHANGED +}; + +/* Variables for command line options */ + +#ifndef GDIFF_MAIN +# define XTERN extern +#else +# define XTERN +#endif + +enum output_style +{ + /* No output style specified. */ + OUTPUT_UNSPECIFIED, + + /* Default output style. */ + OUTPUT_NORMAL, + + /* Output the differences with lines of context before and after (-c). */ + OUTPUT_CONTEXT, + + /* Output the differences in a unified context diff format (-u). */ + OUTPUT_UNIFIED, + + /* Output the differences as commands suitable for `ed' (-e). */ + OUTPUT_ED, + + /* Output the diff as a forward ed script (-f). */ + OUTPUT_FORWARD_ED, + + /* Like -f, but output a count of changed lines in each "command" (-n). */ + OUTPUT_RCS, + + /* Output merged #ifdef'd file (-D). */ + OUTPUT_IFDEF, + + /* Output sdiff style (-y). */ + OUTPUT_SDIFF +}; + +/* True for output styles that are robust, + i.e. can handle a file that ends in a non-newline. */ +#define ROBUST_OUTPUT_STYLE(S) ((S) != OUTPUT_ED && (S) != OUTPUT_FORWARD_ED) + +XTERN enum output_style output_style; + +/* Nonzero if output cannot be generated for identical files. */ +XTERN bool no_diff_means_no_output; + +/* Number of lines of context to show in each set of diffs. + This is zero when context is not to be shown. */ +XTERN lin context; + +/* Consider all files as text files (-a). + Don't interpret codes over 0177 as implying a "binary file". */ +XTERN bool text; + +/* Number of lines to keep in identical prefix and suffix. */ +XTERN lin horizon_lines; + +/* The significance of white space during comparisons. */ +XTERN enum +{ + /* All white space is significant (the default). */ + IGNORE_NO_WHITE_SPACE, + + /* Ignore changes due to tab expansion (-E). */ + IGNORE_TAB_EXPANSION, + + /* Ignore changes in horizontal white space (-b). */ + IGNORE_SPACE_CHANGE, + + /* Ignore all horizontal white space (-w). */ + IGNORE_ALL_SPACE +} ignore_white_space; + +/* Ignore changes that affect only blank lines (-B). */ +XTERN bool ignore_blank_lines; + +/* Files can be compared byte-by-byte, as if they were binary. + This depends on various options. */ +XTERN bool files_can_be_treated_as_binary; + +/* Ignore differences in case of letters (-i). */ +XTERN bool ignore_case; + +/* Ignore differences in case of letters in file names. */ +XTERN bool ignore_file_name_case; + +/* File labels for `-c' output headers (--label). */ +XTERN char *file_label[2]; + +/* Regexp to identify function-header lines (-F). */ +XTERN struct re_pattern_buffer function_regexp; + +/* Ignore changes that affect only lines matching this regexp (-I). */ +XTERN struct re_pattern_buffer ignore_regexp; + +/* Say only whether files differ, not how (-q). */ +XTERN bool brief; + +/* Expand tabs in the output so the text lines up properly + despite the characters added to the front of each line (-t). */ +XTERN bool expand_tabs; + +/* Use a tab in the output, rather than a space, before the text of an + input line, so as to keep the proper alignment in the input line + without changing the characters in it (-T). */ +XTERN bool initial_tab; + +/* Remove trailing carriage returns from input. */ +XTERN bool strip_trailing_cr; + +/* In directory comparison, specify file to start with (-S). + This is used for resuming an aborted comparison. + All file names less than this name are ignored. */ +XTERN char const *starting_file; + +/* Pipe each file's output through pr (-l). */ +XTERN bool paginate; + +/* Line group formats for unchanged, old, new, and changed groups. */ +XTERN char const *group_format[CHANGED + 1]; + +/* Line formats for unchanged, old, and new lines. */ +XTERN char const *line_format[NEW + 1]; + +/* If using OUTPUT_SDIFF print extra information to help the sdiff filter. */ +XTERN bool sdiff_merge_assist; + +/* Tell OUTPUT_SDIFF to show only the left version of common lines. */ +XTERN bool left_column; + +/* Tell OUTPUT_SDIFF to not show common lines. */ +XTERN bool suppress_common_lines; + +/* The half line width and column 2 offset for OUTPUT_SDIFF. */ +XTERN unsigned int sdiff_half_width; +XTERN unsigned int sdiff_column2_offset; + +/* String containing all the command options diff received, + with spaces between and at the beginning but none at the end. + If there were no options given, this string is empty. */ +XTERN char *switch_string; + +/* Use heuristics for better speed with large files with a small + density of changes. */ +XTERN bool speed_large_files; + +/* Patterns that match file names to be excluded. */ +XTERN struct exclude *excluded; + +/* Don't discard lines. This makes things slower (sometimes much + slower) but will find a guaranteed minimal set of changes. */ +XTERN bool minimal; + +/* Name of program the user invoked (for error messages). */ +XTERN char *program_name; + +/* The strftime format to use for time strings. */ +XTERN char const *time_format; + +/* The result of comparison is an "edit script": a chain of `struct change'. + Each `struct change' represents one place where some lines are deleted + and some are inserted. + + LINE0 and LINE1 are the first affected lines in the two files (origin 0). + DELETED is the number of lines deleted here from file 0. + INSERTED is the number of lines inserted here in file 1. + + If DELETED is 0 then LINE0 is the number of the line before + which the insertion was done; vice versa for INSERTED and LINE1. */ + +struct change +{ + struct change *link; /* Previous or next edit command */ + lin inserted; /* # lines of file 1 changed here. */ + lin deleted; /* # lines of file 0 changed here. */ + lin line0; /* Line number of 1st deleted line. */ + lin line1; /* Line number of 1st inserted line. */ + bool ignore; /* Flag used in context.c. */ +}; + +/* Structures that describe the input files. */ + +/* Data on one input file being compared. */ + +struct file_data { + int desc; /* File descriptor */ + char const *name; /* File name */ + struct stat stat; /* File status */ + + /* Buffer in which text of file is read. */ + word *buffer; + + /* Allocated size of buffer, in bytes. Always a multiple of + sizeof *buffer. */ + size_t bufsize; + + /* Number of valid bytes now in the buffer. */ + size_t buffered; + + /* Array of pointers to lines in the file. */ + char const **linbuf; + + /* linbuf_base <= buffered_lines <= valid_lines <= alloc_lines. + linebuf[linbuf_base ... buffered_lines - 1] are possibly differing. + linebuf[linbuf_base ... valid_lines - 1] contain valid data. + linebuf[linbuf_base ... alloc_lines - 1] are allocated. */ + lin linbuf_base, buffered_lines, valid_lines, alloc_lines; + + /* Pointer to end of prefix of this file to ignore when hashing. */ + char const *prefix_end; + + /* Count of lines in the prefix. + There are this many lines in the file before linbuf[0]. */ + lin prefix_lines; + + /* Pointer to start of suffix of this file to ignore when hashing. */ + char const *suffix_begin; + + /* Vector, indexed by line number, containing an equivalence code for + each line. It is this vector that is actually compared with that + of another file to generate differences. */ + lin *equivs; + + /* Vector, like the previous one except that + the elements for discarded lines have been squeezed out. */ + lin *undiscarded; + + /* Vector mapping virtual line numbers (not counting discarded lines) + to real ones (counting those lines). Both are origin-0. */ + lin *realindexes; + + /* Total number of nondiscarded lines. */ + lin nondiscarded_lines; + + /* Vector, indexed by real origin-0 line number, + containing TRUE for a line that is an insertion or a deletion. + The results of comparison are stored here. */ + bool *changed; + + /* 1 if file ends in a line with no final newline. */ + bool missing_newline; + + /* 1 if at end of file. */ + bool eof; + + /* 1 more than the maximum equivalence value used for this or its + sibling file. */ + lin equiv_max; +}; + +/* The file buffer, considered as an array of bytes rather than + as an array of words. */ +#define FILE_BUFFER(f) ((char *) (f)->buffer) + +/* Data on two input files being compared. */ + +struct comparison + { + struct file_data file[2]; + struct comparison const *parent; /* parent, if a recursive comparison */ + }; + +/* Describe the two files currently being compared. */ + +XTERN struct file_data files[2]; + +/* Stdio stream to output diffs to. */ + +XTERN FILE *outfile; + +/* Declare various functions. */ + +/* analyze.c */ +int diff_2_files (struct comparison *); + +/* context.c */ +void print_context_header (struct file_data[], bool); +void print_context_script (struct change *, bool); + +/* dir.c */ +int diff_dirs (struct comparison const *, int (*) (struct comparison const *, char const *, char const *)); + +/* ed.c */ +void print_ed_script (struct change *); +void pr_forward_ed_script (struct change *); + +/* ifdef.c */ +void print_ifdef_script (struct change *); + +/* io.c */ +void file_block_read (struct file_data *, size_t); +bool read_files (struct file_data[], bool); + +/* normal.c */ +void print_normal_script (struct change *); + +/* rcs.c */ +void print_rcs_script (struct change *); + +/* side.c */ +void print_sdiff_script (struct change *); + +/* util.c */ +extern char const change_letter[4]; +extern char const pr_program[]; +char *concat (char const *, char const *, char const *); +char *dir_file_pathname (char const *, char const *); +bool lines_differ (char const *, char const *); +lin translate_line_number (struct file_data const *, lin); +struct change *find_change (struct change *); +struct change *find_reverse_change (struct change *); +void *zalloc (size_t); +enum changes analyze_hunk (struct change *, lin *, lin *, lin *, lin *); +void begin_output (void); +void debug_script (struct change *); +void fatal (char const *) __attribute__((noreturn)); +void finish_output (void); +void message (char const *, char const *, char const *); +void message5 (char const *, char const *, char const *, char const *, char const *); +void output_1_line (char const *, char const *, char const *, char const *); +void perror_with_name (char const *); +void pfatal_with_name (char const *) __attribute__((noreturn)); +void print_1_line (char const *, char const * const *); +void print_message_queue (void); +void print_number_range (char, struct file_data *, lin, lin); +void print_script (struct change *, struct change * (*) (struct change *), void (*) (struct change *)); +void setup_output (char const *, char const *, bool); +void translate_range (struct file_data const *, lin, lin, long *, long *); + +/* version.c */ +extern char const version_string[]; diff --git a/gnu/dist/diffutils/src/diff3.c b/gnu/dist/diffutils/src/diff3.c new file mode 100644 index 00000000000..33a680b3d9d --- /dev/null +++ b/gnu/dist/diffutils/src/diff3.c @@ -0,0 +1,1747 @@ +/* $NetBSD: diff3.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* diff3 - compare three files line by line + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1998, 2001, + 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "system.h" + +static char const copyright_string[] = + "Copyright (C) 2002 Free Software Foundation, Inc."; + +static char const authorship_msgid[] = N_("Written by Randy Smith."); + +#include <c-stack.h> +#include <cmpbuf.h> +#include <error.h> +#include <exitfail.h> +#include <freesoft.h> +#include <getopt.h> +#include <inttostr.h> +#include <quotesys.h> +#include <stdio.h> +#include <xalloc.h> + +extern char const version_string[]; + +/* + * Internal data structures and macros for the diff3 program; includes + * data structures for both diff3 diffs and normal diffs. + */ + +/* Different files within a three way diff. */ +#define FILE0 0 +#define FILE1 1 +#define FILE2 2 + +/* + * A three way diff is built from two two-way diffs; the file which + * the two two-way diffs share is: + */ +#define FILEC FILE2 + +/* + * Different files within a two way diff. + * FC is the common file, FO the other file. + */ +#define FO 0 +#define FC 1 + +/* The ranges are indexed by */ +#define RANGE_START 0 +#define RANGE_END 1 + +enum diff_type { + ERROR, /* Should not be used */ + ADD, /* Two way diff add */ + CHANGE, /* Two way diff change */ + DELETE, /* Two way diff delete */ + DIFF_ALL, /* All three are different */ + DIFF_1ST, /* Only the first is different */ + DIFF_2ND, /* Only the second */ + DIFF_3RD /* Only the third */ +}; + +/* Two way diff */ +struct diff_block { + lin ranges[2][2]; /* Ranges are inclusive */ + char **lines[2]; /* The actual lines (may contain nulls) */ + size_t *lengths[2]; /* Line lengths (including newlines, if any) */ + struct diff_block *next; +}; + +/* Three way diff */ + +struct diff3_block { + enum diff_type correspond; /* Type of diff */ + lin ranges[3][2]; /* Ranges are inclusive */ + char **lines[3]; /* The actual lines (may contain nulls) */ + size_t *lengths[3]; /* Line lengths (including newlines, if any) */ + struct diff3_block *next; +}; + +/* + * Access the ranges on a diff block. + */ +#define D_LOWLINE(diff, filenum) \ + ((diff)->ranges[filenum][RANGE_START]) +#define D_HIGHLINE(diff, filenum) \ + ((diff)->ranges[filenum][RANGE_END]) +#define D_NUMLINES(diff, filenum) \ + (D_HIGHLINE (diff, filenum) - D_LOWLINE (diff, filenum) + 1) + +/* + * Access the line numbers in a file in a diff by relative line + * numbers (i.e. line number within the diff itself). Note that these + * are lvalues and can be used for assignment. + */ +#define D_RELNUM(diff, filenum, linenum) \ + ((diff)->lines[filenum][linenum]) +#define D_RELLEN(diff, filenum, linenum) \ + ((diff)->lengths[filenum][linenum]) + +/* + * And get at them directly, when that should be necessary. + */ +#define D_LINEARRAY(diff, filenum) \ + ((diff)->lines[filenum]) +#define D_LENARRAY(diff, filenum) \ + ((diff)->lengths[filenum]) + +/* + * Next block. + */ +#define D_NEXT(diff) ((diff)->next) + +/* + * Access the type of a diff3 block. + */ +#define D3_TYPE(diff) ((diff)->correspond) + +/* + * Line mappings based on diffs. The first maps off the top of the + * diff, the second off of the bottom. + */ +#define D_HIGH_MAPLINE(diff, fromfile, tofile, linenum) \ + ((linenum) \ + - D_HIGHLINE ((diff), (fromfile)) \ + + D_HIGHLINE ((diff), (tofile))) + +#define D_LOW_MAPLINE(diff, fromfile, tofile, linenum) \ + ((linenum) \ + - D_LOWLINE ((diff), (fromfile)) \ + + D_LOWLINE ((diff), (tofile))) + +/* Options variables for flags set on command line. */ + +/* If nonzero, treat all files as text files, never as binary. */ +static bool text; + +/* If nonzero, write out an ed script instead of the standard diff3 format. */ +static bool edscript; + +/* If nonzero, in the case of overlapping diffs (type DIFF_ALL), + preserve the lines which would normally be deleted from + file 1 with a special flagging mechanism. */ +static bool flagging; + +/* Use a tab to align output lines (-T). */ +static bool initial_tab; + +/* If nonzero, do not output information for overlapping diffs. */ +static bool simple_only; + +/* If nonzero, do not output information for non-overlapping diffs. */ +static bool overlap_only; + +/* If nonzero, show information for DIFF_2ND diffs. */ +static bool show_2nd; + +/* If nonzero, include `:wq' at the end of the script + to write out the file being edited. */ +static bool finalwrite; + +/* If nonzero, output a merged file. */ +static bool merge; + +char *program_name; + +static char *read_diff (char const *, char const *, char **); +static char *scan_diff_line (char *, char **, size_t *, char *, char); +static enum diff_type process_diff_control (char **, struct diff_block *); +static bool compare_line_list (char * const[], size_t const[], char * const[], size_t const[], lin); +static bool copy_stringlist (char * const[], size_t const[], char *[], size_t[], lin); +static bool output_diff3_edscript (FILE *, struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *); +static bool output_diff3_merge (FILE *, FILE *, struct diff3_block *, int const[3], int const[3], char const *, char const *, char const *); +static struct diff3_block *create_diff3_block (lin, lin, lin, lin, lin, lin); +static struct diff3_block *make_3way_diff (struct diff_block *, struct diff_block *); +static struct diff3_block *reverse_diff3_blocklist (struct diff3_block *); +static struct diff3_block *using_to_diff3_block (struct diff_block *[2], struct diff_block *[2], int, int, struct diff3_block const *); +static struct diff_block *process_diff (char const *, char const *, struct diff_block **); +static void check_stdout (void); +static void fatal (char const *) __attribute__((noreturn)); +static void output_diff3 (FILE *, struct diff3_block *, int const[3], int const[3]); +static void perror_with_exit (char const *) __attribute__((noreturn)); +static void try_help (char const *, char const *) __attribute__((noreturn)); +static void usage (void); + +static char const *diff_program = DEFAULT_DIFF_PROGRAM; + +/* Values for long options that do not have single-letter equivalents. */ +enum +{ + DIFF_PROGRAM_OPTION = CHAR_MAX + 1, + HELP_OPTION +}; + +static struct option const longopts[] = +{ + {"text", 0, 0, 'a'}, + {"show-all", 0, 0, 'A'}, + {"ed", 0, 0, 'e'}, + {"diff-program", 1, 0, DIFF_PROGRAM_OPTION}, + {"show-overlap", 0, 0, 'E'}, + {"label", 1, 0, 'L'}, + {"merge", 0, 0, 'm'}, + {"initial-tab", 0, 0, 'T'}, + {"overlap-only", 0, 0, 'x'}, + {"easy-only", 0, 0, '3'}, + {"version", 0, 0, 'v'}, + {"help", 0, 0, HELP_OPTION}, + {0, 0, 0, 0} +}; + +/* + * Main program. Calls diff twice on two pairs of input files, + * combines the two diffs, and outputs them. + */ +int +main (int argc, char **argv) +{ + int c, i; + int common; + int mapping[3]; + int rev_mapping[3]; + int incompat = 0; + bool conflicts_found; + struct diff_block *thread0, *thread1, *last_block; + struct diff3_block *diff3; + int tag_count = 0; + char *tag_strings[3]; + char *commonname; + char **file; + struct stat statb; + + exit_failure = 2; + initialize_main (&argc, &argv); + program_name = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + c_stack_action (c_stack_die); + + while ((c = getopt_long (argc, argv, "aeimvx3AEL:TX", longopts, 0)) != -1) + { + switch (c) + { + case 'a': + text = 1; + break; + case 'A': + show_2nd = 1; + flagging = 1; + incompat++; + break; + case 'x': + overlap_only = 1; + incompat++; + break; + case '3': + simple_only = 1; + incompat++; + break; + case 'i': + finalwrite = 1; + break; + case 'm': + merge = 1; + break; + case 'X': + overlap_only = 1; + /* Fall through. */ + case 'E': + flagging = 1; + /* Fall through. */ + case 'e': + incompat++; + break; + case 'T': + initial_tab = 1; + break; + case 'v': + printf ("diff3 %s\n%s\n\n%s\n\n%s\n", + version_string, copyright_string, + _(free_software_msgid), _(authorship_msgid)); + check_stdout (); + return EXIT_SUCCESS; + case DIFF_PROGRAM_OPTION: + diff_program = optarg; + break; + case HELP_OPTION: + usage (); + check_stdout (); + return EXIT_SUCCESS; + case 'L': + /* Handle up to three -L options. */ + if (tag_count < 3) + { + tag_strings[tag_count++] = optarg; + break; + } + try_help ("too many file label options", 0); + default: + try_help (0, 0); + } + } + + edscript = incompat & ~merge; /* -AeExX3 without -m implies ed script. */ + show_2nd |= ~incompat & merge; /* -m without -AeExX3 implies -A. */ + flagging |= ~incompat & merge; + + if (incompat > 1 /* Ensure at most one of -AeExX3. */ + || finalwrite & merge /* -i -m would rewrite input file. */ + || (tag_count && ! flagging)) /* -L requires one of -AEX. */ + try_help ("incompatible options", 0); + + if (argc - optind != 3) + { + if (argc - optind < 3) + try_help ("missing operand after `%s'", argv[argc - 1]); + else + try_help ("extra operand `%s'", argv[optind + 3]); + } + + file = &argv[optind]; + + for (i = tag_count; i < 3; i++) + tag_strings[i] = file[i]; + + /* Always compare file1 to file2, even if file2 is "-". + This is needed for -mAeExX3. Using the file0 as + the common file would produce wrong results, because if the + file0-file1 diffs didn't line up with the file0-file2 diffs + (which is entirely possible since we don't use diff's -n option), + diff3 might report phantom changes from file1 to file2. + + Also, try to compare file0 to file1, because this is where + changes are expected to come from. Diffing between these pairs + of files is more likely to avoid phantom changes from file0 to file1. + + Historically, the default common file was file2, so some older + applications (e.g. Emacs ediff) used file2 as the ancestor. So, + for compatibility, if this is a 3-way diff (not a merge or + edscript), prefer file2 as the common file. */ + + common = 2 - (edscript | merge); + + if (strcmp (file[common], "-") == 0) + { + /* Sigh. We've got standard input as the common file. We can't + call diff twice on stdin. Use the other arg as the common + file instead. */ + common = 3 - common; + if (strcmp (file[0], "-") == 0 || strcmp (file[common], "-") == 0) + fatal ("`-' specified for more than one input file"); + } + + mapping[0] = 0; + mapping[1] = 3 - common; + mapping[2] = common; + + for (i = 0; i < 3; i++) + rev_mapping[mapping[i]] = i; + + for (i = 0; i < 3; i++) + if (strcmp (file[i], "-") != 0) + { + if (stat (file[i], &statb) < 0) + perror_with_exit (file[i]); + else if (S_ISDIR (statb.st_mode)) + error (EXIT_TROUBLE, EISDIR, "%s", file[i]); + } + +#ifdef SIGCHLD + /* System V fork+wait does not work if SIGCHLD is ignored. */ + signal (SIGCHLD, SIG_DFL); +#endif + + commonname = file[rev_mapping[FILEC]]; + thread1 = process_diff (file[rev_mapping[FILE1]], commonname, &last_block); + thread0 = process_diff (file[rev_mapping[FILE0]], commonname, &last_block); + diff3 = make_3way_diff (thread0, thread1); + if (edscript) + conflicts_found + = output_diff3_edscript (stdout, diff3, mapping, rev_mapping, + tag_strings[0], tag_strings[1], tag_strings[2]); + else if (merge) + { + if (! freopen (file[rev_mapping[FILE0]], "r", stdin)) + perror_with_exit (file[rev_mapping[FILE0]]); + conflicts_found + = output_diff3_merge (stdin, stdout, diff3, mapping, rev_mapping, + tag_strings[0], tag_strings[1], tag_strings[2]); + if (ferror (stdin)) + fatal ("read failed"); + } + else + { + output_diff3 (stdout, diff3, mapping, rev_mapping); + conflicts_found = 0; + } + + check_stdout (); + exit (conflicts_found); + return conflicts_found; +} + +static void +try_help (char const *reason_msgid, char const *operand) +{ + if (reason_msgid) + error (0, 0, _(reason_msgid), operand); + error (EXIT_TROUBLE, 0, + _("Try `%s --help' for more information."), program_name); + abort (); +} + +static void +check_stdout (void) +{ + if (ferror (stdout)) + fatal ("write failed"); + else if (fclose (stdout) != 0) + perror_with_exit (_("standard output")); +} + +static char const * const option_help_msgid[] = { + N_("-e --ed Output unmerged changes from OLDFILE to YOURFILE into MYFILE."), + N_("-E --show-overlap Output unmerged changes, bracketing conflicts."), + N_("-A --show-all Output all changes, bracketing conflicts."), + N_("-x --overlap-only Output overlapping changes."), + N_("-X Output overlapping changes, bracketing them."), + N_("-3 --easy-only Output unmerged nonoverlapping changes."), + "", + N_("-m --merge Output merged file instead of ed script (default -A)."), + N_("-L LABEL --label=LABEL Use LABEL instead of file name."), + N_("-i Append `w' and `q' commands to ed scripts."), + N_("-a --text Treat all files as text."), + N_("-T --initial-tab Make tabs line up by prepending a tab."), + N_("--diff-program=PROGRAM Use PROGRAM to compare files."), + "", + N_("-v --version Output version info."), + N_("--help Output this help."), + 0 +}; + +static void +usage (void) +{ + char const * const *p; + + printf (_("Usage: %s [OPTION]... MYFILE OLDFILE YOURFILE\n"), + program_name); + printf ("%s\n\n", _("Compare three files line by line.")); + for (p = option_help_msgid; *p; p++) + if (**p) + printf (" %s\n", _(*p)); + else + putchar ('\n'); + printf ("\n%s\n\n%s\n", + _("If a FILE is `-', read standard input."), + _("Report bugs to <bug-gnu-utils@gnu.org>.")); +} + +/* + * Routines that combine the two diffs together into one. The + * algorithm used follows: + * + * File2 is shared in common between the two diffs. + * Diff02 is the diff between 0 and 2. + * Diff12 is the diff between 1 and 2. + * + * 1) Find the range for the first block in File2. + * a) Take the lowest of the two ranges (in File2) in the two + * current blocks (one from each diff) as being the low + * water mark. Assign the upper end of this block as + * being the high water mark and move the current block up + * one. Mark the block just moved over as to be used. + * b) Check the next block in the diff that the high water + * mark is *not* from. + * + * *If* the high water mark is above + * the low end of the range in that block, + * + * mark that block as to be used and move the current + * block up. Set the high water mark to the max of + * the high end of this block and the current. Repeat b. + * + * 2) Find the corresponding ranges in File0 (from the blocks + * in diff02; line per line outside of diffs) and in File1. + * Create a diff3_block, reserving space as indicated by the ranges. + * + * 3) Copy all of the pointers for file2 in. At least for now, + * do memcmp's between corresponding strings in the two diffs. + * + * 4) Copy all of the pointers for file0 and 1 in. Get what you + * need from file2 (when there isn't a diff block, it's + * identical to file2 within the range between diff blocks). + * + * 5) If the diff blocks you used came from only one of the two + * strings of diffs, then that file (i.e. the one other than + * the common file in that diff) is the odd person out. If you used + * diff blocks from both sets, check to see if files 0 and 1 match: + * + * Same number of lines? If so, do a set of memcmp's (if a + * memcmp matches; copy the pointer over; it'll be easier later + * if you have to do any compares). If they match, 0 & 1 are + * the same. If not, all three different. + * + * Then you do it again, until you run out of blocks. + * + */ + +/* + * This routine makes a three way diff (chain of diff3_block's) from two + * two way diffs (chains of diff_block's). It is assumed that each of + * the two diffs passed are onto the same file (i.e. that each of the + * diffs were made "to" the same file). The three way diff pointer + * returned will have numbering FILE0--the other file in diff02, + * FILE1--the other file in diff12, and FILEC--the common file. + */ +static struct diff3_block * +make_3way_diff (struct diff_block *thread0, struct diff_block *thread1) +{ +/* + * This routine works on the two diffs passed to it as threads. + * Thread number 0 is diff02, thread number 1 is diff12. The USING + * array is set to the base of the list of blocks to be used to + * construct each block of the three way diff; if no blocks from a + * particular thread are to be used, that element of the using array + * is set to 0. The elements LAST_USING array are set to the last + * elements on each of the using lists. + * + * The HIGH_WATER_MARK is set to the highest line number in the common file + * described in any of the diffs in either of the USING lists. The + * HIGH_WATER_THREAD names the thread. Similarly the BASE_WATER_MARK + * and BASE_WATER_THREAD describe the lowest line number in the common file + * described in any of the diffs in either of the USING lists. The + * HIGH_WATER_DIFF is the diff from which the HIGH_WATER_MARK was + * taken. + * + * The HIGH_WATER_DIFF should always be equal to LAST_USING + * [HIGH_WATER_THREAD]. The OTHER_DIFF is the next diff to check for + * higher water, and should always be equal to + * CURRENT[HIGH_WATER_THREAD ^ 0x1]. The OTHER_THREAD is the thread + * in which the OTHER_DIFF is, and hence should always be equal to + * HIGH_WATER_THREAD ^ 0x1. + * + * The variable LAST_DIFF is kept set to the last diff block produced + * by this routine, for line correspondence purposes between that diff + * and the one currently being worked on. It is initialized to + * ZERO_DIFF before any blocks have been created. + */ + + struct diff_block *using[2]; + struct diff_block *last_using[2]; + struct diff_block *current[2]; + + lin high_water_mark; + + int high_water_thread; + int base_water_thread; + int other_thread; + + struct diff_block *high_water_diff; + struct diff_block *other_diff; + + struct diff3_block *result; + struct diff3_block *tmpblock; + struct diff3_block **result_end; + + struct diff3_block const *last_diff3; + + static struct diff3_block const zero_diff3; + + /* Initialization */ + result = 0; + result_end = &result; + current[0] = thread0; current[1] = thread1; + last_diff3 = &zero_diff3; + + /* Sniff up the threads until we reach the end */ + + while (current[0] || current[1]) + { + using[0] = using[1] = last_using[0] = last_using[1] = 0; + + /* Setup low and high water threads, diffs, and marks. */ + if (!current[0]) + base_water_thread = 1; + else if (!current[1]) + base_water_thread = 0; + else + base_water_thread = + (D_LOWLINE (current[0], FC) > D_LOWLINE (current[1], FC)); + + high_water_thread = base_water_thread; + + high_water_diff = current[high_water_thread]; + + high_water_mark = D_HIGHLINE (high_water_diff, FC); + + /* Make the diff you just got info from into the using class */ + using[high_water_thread] + = last_using[high_water_thread] + = high_water_diff; + current[high_water_thread] = high_water_diff->next; + last_using[high_water_thread]->next = 0; + + /* And mark the other diff */ + other_thread = high_water_thread ^ 0x1; + other_diff = current[other_thread]; + + /* Shuffle up the ladder, checking the other diff to see if it + needs to be incorporated. */ + while (other_diff + && D_LOWLINE (other_diff, FC) <= high_water_mark + 1) + { + + /* Incorporate this diff into the using list. Note that + this doesn't take it off the current list */ + if (using[other_thread]) + last_using[other_thread]->next = other_diff; + else + using[other_thread] = other_diff; + last_using[other_thread] = other_diff; + + /* Take it off the current list. Note that this following + code assumes that other_diff enters it equal to + current[high_water_thread ^ 0x1] */ + current[other_thread] = current[other_thread]->next; + other_diff->next = 0; + + /* Set the high_water stuff + If this comparison is equal, then this is the last pass + through this loop; since diff blocks within a given + thread cannot overlap, the high_water_mark will be + *below* the range_start of either of the next diffs. */ + + if (high_water_mark < D_HIGHLINE (other_diff, FC)) + { + high_water_thread ^= 1; + high_water_diff = other_diff; + high_water_mark = D_HIGHLINE (other_diff, FC); + } + + /* Set the other diff */ + other_thread = high_water_thread ^ 0x1; + other_diff = current[other_thread]; + } + + /* The using lists contain a list of all of the blocks to be + included in this diff3_block. Create it. */ + + tmpblock = using_to_diff3_block (using, last_using, + base_water_thread, high_water_thread, + last_diff3); + + if (!tmpblock) + fatal ("internal error: screwup in format of diff blocks"); + + /* Put it on the list. */ + *result_end = tmpblock; + result_end = &tmpblock->next; + + /* Set up corresponding lines correctly. */ + last_diff3 = tmpblock; + } + return result; +} + +/* + * using_to_diff3_block: + * This routine takes two lists of blocks (from two separate diff + * threads) and puts them together into one diff3 block. + * It then returns a pointer to this diff3 block or 0 for failure. + * + * All arguments besides using are for the convenience of the routine; + * they could be derived from the using array. + * LAST_USING is a pair of pointers to the last blocks in the using + * structure. + * LOW_THREAD and HIGH_THREAD tell which threads contain the lowest + * and highest line numbers for File0. + * last_diff3 contains the last diff produced in the calling routine. + * This is used for lines mappings which would still be identical to + * the state that diff ended in. + * + * A distinction should be made in this routine between the two diffs + * that are part of a normal two diff block, and the three diffs that + * are part of a diff3_block. + */ +static struct diff3_block * +using_to_diff3_block (struct diff_block *using[2], + struct diff_block *last_using[2], + int low_thread, int high_thread, + struct diff3_block const *last_diff3) +{ + lin low[2], high[2]; + struct diff3_block *result; + struct diff_block *ptr; + int d; + lin i; + + /* Find the range in the common file. */ + lin lowc = D_LOWLINE (using[low_thread], FC); + lin highc = D_HIGHLINE (last_using[high_thread], FC); + + /* Find the ranges in the other files. + If using[d] is null, that means that the file to which that diff + refers is equivalent to the common file over this range. */ + + for (d = 0; d < 2; d++) + if (using[d]) + { + low[d] = D_LOW_MAPLINE (using[d], FC, FO, lowc); + high[d] = D_HIGH_MAPLINE (last_using[d], FC, FO, highc); + } + else + { + low[d] = D_HIGH_MAPLINE (last_diff3, FILEC, FILE0 + d, lowc); + high[d] = D_HIGH_MAPLINE (last_diff3, FILEC, FILE0 + d, highc); + } + + /* Create a block with the appropriate sizes */ + result = create_diff3_block (low[0], high[0], low[1], high[1], lowc, highc); + + /* Copy information for the common file. + Return with a zero if any of the compares failed. */ + + for (d = 0; d < 2; d++) + for (ptr = using[d]; ptr; ptr = D_NEXT (ptr)) + { + lin result_offset = D_LOWLINE (ptr, FC) - lowc; + + if (!copy_stringlist (D_LINEARRAY (ptr, FC), + D_LENARRAY (ptr, FC), + D_LINEARRAY (result, FILEC) + result_offset, + D_LENARRAY (result, FILEC) + result_offset, + D_NUMLINES (ptr, FC))) + return 0; + } + + /* Copy information for file d. First deal with anything that might be + before the first diff. */ + + for (d = 0; d < 2; d++) + { + struct diff_block *u = using[d]; + lin lo = low[d], hi = high[d]; + + for (i = 0; + i + lo < (u ? D_LOWLINE (u, FO) : hi + 1); + i++) + { + D_RELNUM (result, FILE0 + d, i) = D_RELNUM (result, FILEC, i); + D_RELLEN (result, FILE0 + d, i) = D_RELLEN (result, FILEC, i); + } + + for (ptr = u; ptr; ptr = D_NEXT (ptr)) + { + lin result_offset = D_LOWLINE (ptr, FO) - lo; + lin linec; + + if (!copy_stringlist (D_LINEARRAY (ptr, FO), + D_LENARRAY (ptr, FO), + D_LINEARRAY (result, FILE0 + d) + result_offset, + D_LENARRAY (result, FILE0 + d) + result_offset, + D_NUMLINES (ptr, FO))) + return 0; + + /* Catch the lines between here and the next diff */ + linec = D_HIGHLINE (ptr, FC) + 1 - lowc; + for (i = D_HIGHLINE (ptr, FO) + 1 - lo; + i < (D_NEXT (ptr) ? D_LOWLINE (D_NEXT (ptr), FO) : hi + 1) - lo; + i++) + { + D_RELNUM (result, FILE0 + d, i) = D_RELNUM (result, FILEC, linec); + D_RELLEN (result, FILE0 + d, i) = D_RELLEN (result, FILEC, linec); + linec++; + } + } + } + + /* Set correspond */ + if (!using[0]) + D3_TYPE (result) = DIFF_2ND; + else if (!using[1]) + D3_TYPE (result) = DIFF_1ST; + else + { + lin nl0 = D_NUMLINES (result, FILE0); + lin nl1 = D_NUMLINES (result, FILE1); + + if (nl0 != nl1 + || !compare_line_list (D_LINEARRAY (result, FILE0), + D_LENARRAY (result, FILE0), + D_LINEARRAY (result, FILE1), + D_LENARRAY (result, FILE1), + nl0)) + D3_TYPE (result) = DIFF_ALL; + else + D3_TYPE (result) = DIFF_3RD; + } + + return result; +} + +/* + * This routine copies pointers from a list of strings to a different list + * of strings. If a spot in the second list is already filled, it + * makes sure that it is filled with the same string; if not it + * returns 0, the copy incomplete. + * Upon successful completion of the copy, it returns 1. + */ +static bool +copy_stringlist (char * const fromptrs[], size_t const fromlengths[], + char *toptrs[], size_t tolengths[], + lin copynum) +{ + register char * const *f = fromptrs; + register char **t = toptrs; + register size_t const *fl = fromlengths; + register size_t *tl = tolengths; + + while (copynum--) + { + if (*t) + { if (*fl != *tl || memcmp (*f, *t, *fl)) return 0; } + else + { *t = *f ; *tl = *fl; } + + t++; f++; tl++; fl++; + } + return 1; +} + +/* + * Create a diff3_block, with ranges as specified in the arguments. + * Allocate the arrays for the various pointers (and zero them) based + * on the arguments passed. Return the block as a result. + */ +static struct diff3_block * +create_diff3_block (lin low0, lin high0, + lin low1, lin high1, + lin low2, lin high2) +{ + struct diff3_block *result = xmalloc (sizeof *result); + lin numlines; + + D3_TYPE (result) = ERROR; + D_NEXT (result) = 0; + + /* Assign ranges */ + D_LOWLINE (result, FILE0) = low0; + D_HIGHLINE (result, FILE0) = high0; + D_LOWLINE (result, FILE1) = low1; + D_HIGHLINE (result, FILE1) = high1; + D_LOWLINE (result, FILE2) = low2; + D_HIGHLINE (result, FILE2) = high2; + + /* Allocate and zero space */ + numlines = D_NUMLINES (result, FILE0); + if (numlines) + { + D_LINEARRAY (result, FILE0) = xcalloc (numlines, sizeof (char *)); + D_LENARRAY (result, FILE0) = xcalloc (numlines, sizeof (size_t)); + } + else + { + D_LINEARRAY (result, FILE0) = 0; + D_LENARRAY (result, FILE0) = 0; + } + + numlines = D_NUMLINES (result, FILE1); + if (numlines) + { + D_LINEARRAY (result, FILE1) = xcalloc (numlines, sizeof (char *)); + D_LENARRAY (result, FILE1) = xcalloc (numlines, sizeof (size_t)); + } + else + { + D_LINEARRAY (result, FILE1) = 0; + D_LENARRAY (result, FILE1) = 0; + } + + numlines = D_NUMLINES (result, FILE2); + if (numlines) + { + D_LINEARRAY (result, FILE2) = xcalloc (numlines, sizeof (char *)); + D_LENARRAY (result, FILE2) = xcalloc (numlines, sizeof (size_t)); + } + else + { + D_LINEARRAY (result, FILE2) = 0; + D_LENARRAY (result, FILE2) = 0; + } + + /* Return */ + return result; +} + +/* + * Compare two lists of lines of text. + * Return 1 if they are equivalent, 0 if not. + */ +static bool +compare_line_list (char * const list1[], size_t const lengths1[], + char * const list2[], size_t const lengths2[], + lin nl) +{ + char + * const *l1 = list1, + * const *l2 = list2; + size_t const + *lgths1 = lengths1, + *lgths2 = lengths2; + + while (nl--) + if (!*l1 || !*l2 || *lgths1 != *lgths2++ + || memcmp (*l1++, *l2++, *lgths1++)) + return 0; + return 1; +} + +/* + * Routines to input and parse two way diffs. + */ + +static struct diff_block * +process_diff (char const *filea, + char const *fileb, + struct diff_block **last_block) +{ + char *diff_contents; + char *diff_limit; + char *scan_diff; + enum diff_type dt; + lin i; + struct diff_block *block_list, **block_list_end, *bptr; + size_t too_many_lines = (PTRDIFF_MAX + / MIN (sizeof *bptr->lines[1], + sizeof *bptr->lengths[1])); + + diff_limit = read_diff (filea, fileb, &diff_contents); + scan_diff = diff_contents; + block_list_end = &block_list; + bptr = 0; /* Pacify `gcc -W'. */ + + while (scan_diff < diff_limit) + { + bptr = xmalloc (sizeof *bptr); + bptr->lines[0] = bptr->lines[1] = 0; + bptr->lengths[0] = bptr->lengths[1] = 0; + + dt = process_diff_control (&scan_diff, bptr); + if (dt == ERROR || *scan_diff != '\n') + { + fprintf (stderr, _("%s: diff failed: "), program_name); + do + { + putc (*scan_diff, stderr); + } + while (*scan_diff++ != '\n'); + exit (EXIT_TROUBLE); + } + scan_diff++; + + /* Force appropriate ranges to be null, if necessary */ + switch (dt) + { + case ADD: + bptr->ranges[0][0]++; + break; + case DELETE: + bptr->ranges[1][0]++; + break; + case CHANGE: + break; + default: + fatal ("internal error: invalid diff type in process_diff"); + break; + } + + /* Allocate space for the pointers for the lines from filea, and + parcel them out among these pointers */ + if (dt != ADD) + { + lin numlines = D_NUMLINES (bptr, 0); + if (too_many_lines <= numlines) + xalloc_die (); + bptr->lines[0] = xmalloc (numlines * sizeof *bptr->lines[0]); + bptr->lengths[0] = xmalloc (numlines * sizeof *bptr->lengths[0]); + for (i = 0; i < numlines; i++) + scan_diff = scan_diff_line (scan_diff, + &(bptr->lines[0][i]), + &(bptr->lengths[0][i]), + diff_limit, + '<'); + } + + /* Get past the separator for changes */ + if (dt == CHANGE) + { + if (strncmp (scan_diff, "---\n", 4)) + fatal ("invalid diff format; invalid change separator"); + scan_diff += 4; + } + + /* Allocate space for the pointers for the lines from fileb, and + parcel them out among these pointers */ + if (dt != DELETE) + { + lin numlines = D_NUMLINES (bptr, 1); + if (too_many_lines <= numlines) + xalloc_die (); + bptr->lines[1] = xmalloc (numlines * sizeof *bptr->lines[1]); + bptr->lengths[1] = xmalloc (numlines * sizeof *bptr->lengths[1]); + for (i = 0; i < numlines; i++) + scan_diff = scan_diff_line (scan_diff, + &(bptr->lines[1][i]), + &(bptr->lengths[1][i]), + diff_limit, + '>'); + } + + /* Place this block on the blocklist. */ + *block_list_end = bptr; + block_list_end = &bptr->next; + } + + *block_list_end = 0; + *last_block = bptr; + return block_list; +} + +/* + * This routine will parse a normal format diff control string. It + * returns the type of the diff (ERROR if the format is bad). All of + * the other important information is filled into to the structure + * pointed to by db, and the string pointer (whose location is passed + * to this routine) is updated to point beyond the end of the string + * parsed. Note that only the ranges in the diff_block will be set by + * this routine. + * + * If some specific pair of numbers has been reduced to a single + * number, then both corresponding numbers in the diff block are set + * to that number. In general these numbers are interpreted as ranges + * inclusive, unless being used by the ADD or DELETE commands. It is + * assumed that these will be special cased in a superior routine. + */ + +static enum diff_type +process_diff_control (char **string, struct diff_block *db) +{ + char *s = *string; + lin holdnum; + enum diff_type type; + +/* These macros are defined here because they can use variables + defined in this function. Don't try this at home kids, we're + trained professionals! + + Also note that SKIPWHITE only recognizes tabs and spaces, and + that READNUM can only read positive, integral numbers */ + +#define SKIPWHITE(s) { while (*s == ' ' || *s == '\t') s++; } +#define READNUM(s, num) \ + { unsigned char c = *s; if (!ISDIGIT (c)) return ERROR; holdnum = 0; \ + do { holdnum = (c - '0' + holdnum * 10); } \ + while (ISDIGIT (c = *++s)); (num) = holdnum; } + + /* Read first set of digits */ + SKIPWHITE (s); + READNUM (s, db->ranges[0][RANGE_START]); + + /* Was that the only digit? */ + SKIPWHITE (s); + if (*s == ',') + { + /* Get the next digit */ + s++; + READNUM (s, db->ranges[0][RANGE_END]); + } + else + db->ranges[0][RANGE_END] = db->ranges[0][RANGE_START]; + + /* Get the letter */ + SKIPWHITE (s); + switch (*s) + { + case 'a': + type = ADD; + break; + case 'c': + type = CHANGE; + break; + case 'd': + type = DELETE; + break; + default: + return ERROR; /* Bad format */ + } + s++; /* Past letter */ + + /* Read second set of digits */ + SKIPWHITE (s); + READNUM (s, db->ranges[1][RANGE_START]); + + /* Was that the only digit? */ + SKIPWHITE (s); + if (*s == ',') + { + /* Get the next digit */ + s++; + READNUM (s, db->ranges[1][RANGE_END]); + SKIPWHITE (s); /* To move to end */ + } + else + db->ranges[1][RANGE_END] = db->ranges[1][RANGE_START]; + + *string = s; + return type; +} + +static char * +read_diff (char const *filea, + char const *fileb, + char **output_placement) +{ + char *diff_result; + size_t current_chunk_size, total; + int fd, wstatus; + int werrno = 0; + struct stat pipestat; + +#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK + + char const *argv[8]; + char const **ap; + int fds[2]; + pid_t pid; + + ap = argv; + *ap++ = diff_program; + if (text) + *ap++ = "-a"; + *ap++ = "--horizon-lines=100"; + *ap++ = "--"; + *ap++ = filea; + *ap++ = fileb; + *ap = 0; + + if (pipe (fds) != 0) + perror_with_exit ("pipe"); + + pid = vfork (); + if (pid == 0) + { + /* Child */ + close (fds[0]); + if (fds[1] != STDOUT_FILENO) + { + dup2 (fds[1], STDOUT_FILENO); + close (fds[1]); + } + + /* The cast to (char **) is needed for portability to older + hosts with a nonstandard prototype for execvp. */ + execvp (diff_program, (char **) argv); + + _exit (errno == ENOEXEC ? 126 : 127); + } + + if (pid == -1) + perror_with_exit ("fork"); + + close (fds[1]); /* Prevent erroneous lack of EOF */ + fd = fds[0]; + +#else + + FILE *fpipe; + char const args[] = " -a --horizon-lines=100 -- "; + char *command = xmalloc (quote_system_arg (0, diff_program) + + sizeof args - 1 + + quote_system_arg (0, filea) + 1 + + quote_system_arg (0, fileb) + 1); + char *p = command; + p += quote_system_arg (p, diff_program); + strcpy (p, args + (text ? 0 : 3)); + p += strlen (p); + p += quote_system_arg (p, filea); + *p++ = ' '; + p += quote_system_arg (p, fileb); + *p = 0; + errno = 0; + fpipe = popen (command, "r"); + if (!fpipe) + perror_with_exit (command); + free (command); + fd = fileno (fpipe); + +#endif + + if (fstat (fd, &pipestat) != 0) + perror_with_exit ("fstat"); + current_chunk_size = MAX (1, STAT_BLOCKSIZE (pipestat)); + diff_result = xmalloc (current_chunk_size); + total = 0; + + for (;;) + { + size_t bytes_to_read = current_chunk_size - total; + size_t bytes = block_read (fd, diff_result + total, bytes_to_read); + total += bytes; + if (bytes != bytes_to_read) + { + if (bytes == SIZE_MAX) + perror_with_exit (_("read failed")); + break; + } + if (PTRDIFF_MAX / 2 <= current_chunk_size) + xalloc_die (); + current_chunk_size *= 2; + diff_result = xrealloc (diff_result, current_chunk_size); + } + + if (total != 0 && diff_result[total-1] != '\n') + fatal ("invalid diff format; incomplete last line"); + + *output_placement = diff_result; + +#if ! (HAVE_WORKING_FORK || HAVE_WORKING_VFORK) + + wstatus = pclose (fpipe); + if (wstatus == -1) + werrno = errno; + +#else + + if (close (fd) != 0) + perror_with_exit ("close"); + if (waitpid (pid, &wstatus, 0) < 0) + perror_with_exit ("waitpid"); + +#endif + + if (! werrno && WIFEXITED (wstatus)) + switch (WEXITSTATUS (wstatus)) + { + case 126: + error (EXIT_TROUBLE, 0, _("subsidiary program `%s' not executable"), + diff_program); + case 127: + error (EXIT_TROUBLE, 0, _("subsidiary program `%s' not found"), + diff_program); + } + if (werrno || ! (WIFEXITED (wstatus) && WEXITSTATUS (wstatus) < 2)) + error (EXIT_TROUBLE, werrno, _("subsidiary program `%s' failed"), + diff_program); + + return diff_result + total; +} + + +/* + * Scan a regular diff line (consisting of > or <, followed by a + * space, followed by text (including nulls) up to a newline. + * + * This next routine began life as a macro and many parameters in it + * are used as call-by-reference values. + */ +static char * +scan_diff_line (char *scan_ptr, char **set_start, size_t *set_length, + char *limit, char leadingchar) +{ + char *line_ptr; + + if (!(scan_ptr[0] == leadingchar + && scan_ptr[1] == ' ')) + fatal ("invalid diff format; incorrect leading line chars"); + + *set_start = line_ptr = scan_ptr + 2; + while (*line_ptr++ != '\n') + continue; + + /* Include newline if the original line ended in a newline, + or if an edit script is being generated. + Copy any missing newline message to stderr if an edit script is being + generated, because edit scripts cannot handle missing newlines. + Return the beginning of the next line. */ + *set_length = line_ptr - *set_start; + if (line_ptr < limit && *line_ptr == '\\') + { + if (edscript) + fprintf (stderr, "%s:", program_name); + else + --*set_length; + line_ptr++; + do + { + if (edscript) + putc (*line_ptr, stderr); + } + while (*line_ptr++ != '\n'); + } + + return line_ptr; +} + +/* + * This routine outputs a three way diff passed as a list of + * diff3_block's. + * The argument MAPPING is indexed by external file number (in the + * argument list) and contains the internal file number (from the + * diff passed). This is important because the user expects his + * outputs in terms of the argument list number, and the diff passed + * may have been done slightly differently (if the last argument + * was "-", for example). + * REV_MAPPING is the inverse of MAPPING. + */ +static void +output_diff3 (FILE *outputfile, struct diff3_block *diff, + int const mapping[3], int const rev_mapping[3]) +{ + int i; + int oddoneout; + char *cp; + struct diff3_block *ptr; + lin line; + size_t length; + int dontprint; + static int skew_increment[3] = { 2, 3, 1 }; /* 0==>2==>1==>3 */ + char const *line_prefix = initial_tab ? "\t" : " "; + + for (ptr = diff; ptr; ptr = D_NEXT (ptr)) + { + char x[2]; + + switch (ptr->correspond) + { + case DIFF_ALL: + x[0] = 0; + dontprint = 3; /* Print them all */ + oddoneout = 3; /* Nobody's odder than anyone else */ + break; + case DIFF_1ST: + case DIFF_2ND: + case DIFF_3RD: + oddoneout = rev_mapping[ptr->correspond - DIFF_1ST]; + + x[0] = oddoneout + '1'; + x[1] = 0; + dontprint = oddoneout == 0; + break; + default: + fatal ("internal error: invalid diff type passed to output"); + } + fprintf (outputfile, "====%s\n", x); + + /* Go 0, 2, 1 if the first and third outputs are equivalent. */ + for (i = 0; i < 3; + i = (oddoneout == 1 ? skew_increment[i] : i + 1)) + { + int realfile = mapping[i]; + lin lowt = D_LOWLINE (ptr, realfile); + lin hight = D_HIGHLINE (ptr, realfile); + long llowt = lowt; + long lhight = hight; + + fprintf (outputfile, "%d:", i + 1); + switch (lowt - hight) + { + case 1: + fprintf (outputfile, "%lda\n", llowt - 1); + break; + case 0: + fprintf (outputfile, "%ldc\n", llowt); + break; + default: + fprintf (outputfile, "%ld,%ldc\n", llowt, lhight); + break; + } + + if (i == dontprint) continue; + + if (lowt <= hight) + { + line = 0; + do + { + fprintf (outputfile, line_prefix); + cp = D_RELNUM (ptr, realfile, line); + length = D_RELLEN (ptr, realfile, line); + fwrite (cp, sizeof (char), length, outputfile); + } + while (++line < hight - lowt + 1); + if (cp[length - 1] != '\n') + fprintf (outputfile, "\n\\ %s\n", + _("No newline at end of file")); + } + } + } +} + + +/* + * Output to OUTPUTFILE the lines of B taken from FILENUM. + * Double any initial '.'s; yield nonzero if any initial '.'s were doubled. + */ +static bool +dotlines (FILE *outputfile, struct diff3_block *b, int filenum) +{ + lin i; + bool leading_dot = 0; + + for (i = 0; + i < D_NUMLINES (b, filenum); + i++) + { + char *line = D_RELNUM (b, filenum, i); + if (line[0] == '.') + { + leading_dot = 1; + fprintf (outputfile, "."); + } + fwrite (line, sizeof (char), + D_RELLEN (b, filenum, i), outputfile); + } + + return leading_dot; +} + +/* + * Output to OUTPUTFILE a '.' line. If LEADING_DOT is nonzero, + * also output a command that removes initial '.'s + * starting with line START and continuing for NUM lines. + * (START is long, not lin, for convenience with printf %ld formats.) + */ +static void +undotlines (FILE *outputfile, bool leading_dot, long start, lin num) +{ + fprintf (outputfile, ".\n"); + if (leading_dot) + { + if (num == 1) + fprintf (outputfile, "%lds/^\\.//\n", start); + else + fprintf (outputfile, "%ld,%lds/^\\.//\n", start, start + num - 1); + } +} + +/* + * This routine outputs a diff3 set of blocks as an ed script. This + * script applies the changes between file's 2 & 3 to file 1. It + * takes the precise format of the ed script to be output from global + * variables set during options processing. Note that it does + * destructive things to the set of diff3 blocks it is passed; it + * reverses their order (this gets around the problems involved with + * changing line numbers in an ed script). + * + * Note that this routine has the same problem of mapping as the last + * one did; the variable MAPPING maps from file number according to + * the argument list to file number according to the diff passed. All + * files listed below are in terms of the argument list. + * REV_MAPPING is the inverse of MAPPING. + * + * The arguments FILE0, FILE1 and FILE2 are the strings to print + * as the names of the three files. These may be the actual names, + * or may be the arguments specified with -L. + * + * Returns 1 if conflicts were found. + */ + +static bool +output_diff3_edscript (FILE *outputfile, struct diff3_block *diff, + int const mapping[3], int const rev_mapping[3], + char const *file0, char const *file1, char const *file2) +{ + bool leading_dot; + bool conflicts_found = 0, conflict; + struct diff3_block *b; + + for (b = reverse_diff3_blocklist (diff); b; b = b->next) + { + /* Must do mapping correctly. */ + enum diff_type type + = (b->correspond == DIFF_ALL + ? DIFF_ALL + : DIFF_1ST + rev_mapping[b->correspond - DIFF_1ST]); + + long low0, high0; + + /* If we aren't supposed to do this output block, skip it. */ + switch (type) + { + default: continue; + case DIFF_2ND: if (!show_2nd) continue; conflict = 1; break; + case DIFF_3RD: if (overlap_only) continue; conflict = 0; break; + case DIFF_ALL: if (simple_only) continue; conflict = flagging; break; + } + + low0 = D_LOWLINE (b, mapping[FILE0]); + high0 = D_HIGHLINE (b, mapping[FILE0]); + + if (conflict) + { + conflicts_found = 1; + + + /* Mark end of conflict. */ + + fprintf (outputfile, "%lda\n", high0); + leading_dot = 0; + if (type == DIFF_ALL) + { + if (show_2nd) + { + /* Append lines from FILE1. */ + fprintf (outputfile, "||||||| %s\n", file1); + leading_dot = dotlines (outputfile, b, mapping[FILE1]); + } + /* Append lines from FILE2. */ + fprintf (outputfile, "=======\n"); + leading_dot |= dotlines (outputfile, b, mapping[FILE2]); + } + fprintf (outputfile, ">>>>>>> %s\n", file2); + undotlines (outputfile, leading_dot, high0 + 2, + (D_NUMLINES (b, mapping[FILE1]) + + D_NUMLINES (b, mapping[FILE2]) + 1)); + + + /* Mark start of conflict. */ + + fprintf (outputfile, "%lda\n<<<<<<< %s\n", low0 - 1, + type == DIFF_ALL ? file0 : file1); + leading_dot = 0; + if (type == DIFF_2ND) + { + /* Prepend lines from FILE1. */ + leading_dot = dotlines (outputfile, b, mapping[FILE1]); + fprintf (outputfile, "=======\n"); + } + undotlines (outputfile, leading_dot, low0 + 1, + D_NUMLINES (b, mapping[FILE1])); + } + else if (D_NUMLINES (b, mapping[FILE2]) == 0) + /* Write out a delete */ + { + if (low0 == high0) + fprintf (outputfile, "%ldd\n", low0); + else + fprintf (outputfile, "%ld,%ldd\n", low0, high0); + } + else + /* Write out an add or change */ + { + switch (high0 - low0) + { + case -1: + fprintf (outputfile, "%lda\n", high0); + break; + case 0: + fprintf (outputfile, "%ldc\n", high0); + break; + default: + fprintf (outputfile, "%ld,%ldc\n", low0, high0); + break; + } + + undotlines (outputfile, dotlines (outputfile, b, mapping[FILE2]), + low0, D_NUMLINES (b, mapping[FILE2])); + } + } + if (finalwrite) fprintf (outputfile, "w\nq\n"); + return conflicts_found; +} + +/* + * Read from INFILE and output to OUTPUTFILE a set of diff3_ blocks DIFF + * as a merged file. This acts like 'ed file0 <[output_diff3_edscript]', + * except that it works even for binary data or incomplete lines. + * + * As before, MAPPING maps from arg list file number to diff file number, + * REV_MAPPING is its inverse, + * and FILE0, FILE1, and FILE2 are the names of the files. + * + * Returns 1 if conflicts were found. + */ + +static bool +output_diff3_merge (FILE *infile, FILE *outputfile, struct diff3_block *diff, + int const mapping[3], int const rev_mapping[3], + char const *file0, char const *file1, char const *file2) +{ + int c; + lin i; + bool conflicts_found = 0, conflict; + struct diff3_block *b; + lin linesread = 0; + + for (b = diff; b; b = b->next) + { + /* Must do mapping correctly. */ + enum diff_type type + = ((b->correspond == DIFF_ALL) + ? DIFF_ALL + : DIFF_1ST + rev_mapping[b->correspond - DIFF_1ST]); + char const *format_2nd = "<<<<<<< %s\n"; + + /* If we aren't supposed to do this output block, skip it. */ + switch (type) + { + default: continue; + case DIFF_2ND: if (!show_2nd) continue; conflict = 1; break; + case DIFF_3RD: if (overlap_only) continue; conflict = 0; break; + case DIFF_ALL: if (simple_only) continue; conflict = flagging; + format_2nd = "||||||| %s\n"; + break; + } + + /* Copy I lines from file 0. */ + i = D_LOWLINE (b, FILE0) - linesread - 1; + linesread += i; + while (0 <= --i) + do + { + c = getc (infile); + if (c == EOF) + { + if (ferror (infile)) + perror_with_exit (_("read failed")); + else if (feof (infile)) + fatal ("input file shrank"); + } + putc (c, outputfile); + } + while (c != '\n'); + + if (conflict) + { + conflicts_found = 1; + + if (type == DIFF_ALL) + { + /* Put in lines from FILE0 with bracket. */ + fprintf (outputfile, "<<<<<<< %s\n", file0); + for (i = 0; + i < D_NUMLINES (b, mapping[FILE0]); + i++) + fwrite (D_RELNUM (b, mapping[FILE0], i), sizeof (char), + D_RELLEN (b, mapping[FILE0], i), outputfile); + } + + if (show_2nd) + { + /* Put in lines from FILE1 with bracket. */ + fprintf (outputfile, format_2nd, file1); + for (i = 0; + i < D_NUMLINES (b, mapping[FILE1]); + i++) + fwrite (D_RELNUM (b, mapping[FILE1], i), sizeof (char), + D_RELLEN (b, mapping[FILE1], i), outputfile); + } + + fprintf (outputfile, "=======\n"); + } + + /* Put in lines from FILE2. */ + for (i = 0; + i < D_NUMLINES (b, mapping[FILE2]); + i++) + fwrite (D_RELNUM (b, mapping[FILE2], i), sizeof (char), + D_RELLEN (b, mapping[FILE2], i), outputfile); + + if (conflict) + fprintf (outputfile, ">>>>>>> %s\n", file2); + + /* Skip I lines in file 0. */ + i = D_NUMLINES (b, FILE0); + linesread += i; + while (0 <= --i) + while ((c = getc (infile)) != '\n') + if (c == EOF) + { + if (ferror (infile)) + perror_with_exit (_("read failed")); + else if (feof (infile)) + { + if (i || b->next) + fatal ("input file shrank"); + return conflicts_found; + } + } + } + /* Copy rest of common file. */ + while ((c = getc (infile)) != EOF || !(ferror (infile) | feof (infile))) + putc (c, outputfile); + return conflicts_found; +} + +/* + * Reverse the order of the list of diff3 blocks. + */ +static struct diff3_block * +reverse_diff3_blocklist (struct diff3_block *diff) +{ + register struct diff3_block *tmp, *next, *prev; + + for (tmp = diff, prev = 0; tmp; tmp = next) + { + next = tmp->next; + tmp->next = prev; + prev = tmp; + } + + return prev; +} + +static void +fatal (char const *msgid) +{ + error (EXIT_TROUBLE, 0, "%s", _(msgid)); + abort (); +} + +static void +perror_with_exit (char const *string) +{ + error (EXIT_TROUBLE, errno, "%s", string); + abort (); +} diff --git a/gnu/dist/diffutils/src/dir.c b/gnu/dist/diffutils/src/dir.c new file mode 100644 index 00000000000..61410d07323 --- /dev/null +++ b/gnu/dist/diffutils/src/dir.c @@ -0,0 +1,291 @@ +/* $NetBSD: dir.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* Read, sort and compare two directories. Used for GNU DIFF. + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" +#include <error.h> +#include <exclude.h> +#include <setjmp.h> +#include <xalloc.h> + +/* Read the directory named by DIR and store into DIRDATA a sorted vector + of filenames for its contents. DIR->desc == -1 means this directory is + known to be nonexistent, so set DIRDATA to an empty vector. + Return -1 (setting errno) if error, 0 otherwise. */ + +struct dirdata +{ + size_t nnames; /* Number of names. */ + char const **names; /* Sorted names of files in dir, followed by 0. */ + char *data; /* Allocated storage for file names. */ +}; + +/* Whether file names in directories should be compared with strcoll. */ +static bool locale_specific_sorting; + +/* Where to go if strcoll fails. */ +static jmp_buf failed_strcoll; + +static bool dir_loop (struct comparison const *, int); +static int compare_names_for_qsort (void const *, void const *); + + +/* Read a directory and get its vector of names. */ + +static bool +dir_read (struct file_data const *dir, struct dirdata *dirdata) +{ + register struct dirent *next; + register size_t i; + + /* Address of block containing the files that are described. */ + char const **names; + + /* Number of files in directory. */ + size_t nnames; + + /* Allocated and used storage for file name data. */ + char *data; + size_t data_alloc, data_used; + + dirdata->names = 0; + dirdata->data = 0; + nnames = 0; + data = 0; + + if (dir->desc != -1) + { + /* Open the directory and check for errors. */ + register DIR *reading = opendir (dir->name); + if (!reading) + return 0; + + /* Initialize the table of filenames. */ + + data_alloc = 512; + data_used = 0; + dirdata->data = data = xmalloc (data_alloc); + + /* Read the directory entries, and insert the subfiles + into the `data' table. */ + + while ((errno = 0, (next = readdir (reading)) != 0)) + { + char *d_name = next->d_name; + size_t d_size = NAMLEN (next) + 1; + + /* Ignore "." and "..". */ + if (d_name[0] == '.' + && (d_name[1] == 0 || (d_name[1] == '.' && d_name[2] == 0))) + continue; + + if (excluded_filename (excluded, d_name)) + continue; + + while (data_alloc < data_used + d_size) + { + if (PTRDIFF_MAX / 2 <= data_alloc) + xalloc_die (); + dirdata->data = data = xrealloc (data, data_alloc *= 2); + } + + memcpy (data + data_used, d_name, d_size); + data_used += d_size; + nnames++; + } + if (errno) + { + int e = errno; + closedir (reading); + errno = e; + return 0; + } +#if CLOSEDIR_VOID + closedir (reading); +#else + if (closedir (reading) != 0) + return 0; +#endif + } + + /* Create the `names' table from the `data' table. */ + if (PTRDIFF_MAX / sizeof *names - 1 <= nnames) + xalloc_die (); + dirdata->names = names = xmalloc ((nnames + 1) * sizeof *names); + dirdata->nnames = nnames; + for (i = 0; i < nnames; i++) + { + names[i] = data; + data += strlen (data) + 1; + } + names[nnames] = 0; + return 1; +} + +/* Compare file names, returning a value compatible with strcmp. */ + +static int +compare_names (char const *name1, char const *name2) +{ + if (ignore_file_name_case) + { + int r = strcasecmp (name1, name2); + if (r) + return r; + } + + if (locale_specific_sorting) + { + int r; + errno = 0; + r = strcoll (name1, name2); + if (errno) + { + error (0, errno, _("cannot compare file names `%s' and `%s'"), + name1, name2); + longjmp (failed_strcoll, 1); + } + if (r) + return r; + } + + return file_name_cmp (name1, name2); +} + +/* A wrapper for compare_names suitable as an argument for qsort. */ + +static int +compare_names_for_qsort (void const *file1, void const *file2) +{ + char const *const *f1 = file1; + char const *const *f2 = file2; + return compare_names (*f1, *f2); +} + +/* Compare the contents of two directories named in CMP. + This is a top-level routine; it does everything necessary for diff + on two directories. + + CMP->file[0].desc == -1 says directory CMP->file[0] doesn't exist, + but pretend it is empty. Likewise for CMP->file[1]. + + HANDLE_FILE is a caller-provided subroutine called to handle each file. + It gets three operands: CMP, name of file in dir 0, name of file in dir 1. + These names are relative to the original working directory. + + For a file that appears in only one of the dirs, one of the name-args + to HANDLE_FILE is zero. + + Returns the maximum of all the values returned by HANDLE_FILE, + or EXIT_TROUBLE if trouble is encountered in opening files. */ + +int +diff_dirs (struct comparison const *cmp, + int (*handle_file) (struct comparison const *, + char const *, char const *)) +{ + struct dirdata dirdata[2]; + int volatile val = EXIT_SUCCESS; + int i; + + if ((cmp->file[0].desc == -1 || dir_loop (cmp, 0)) + && (cmp->file[1].desc == -1 || dir_loop (cmp, 1))) + { + error (0, 0, "%s: recursive directory loop", + cmp->file[cmp->file[0].desc == -1].name); + return EXIT_TROUBLE; + } + + /* Get contents of both dirs. */ + for (i = 0; i < 2; i++) + if (! dir_read (&cmp->file[i], &dirdata[i])) + { + perror_with_name (cmp->file[i].name); + val = EXIT_TROUBLE; + } + + if (val == EXIT_SUCCESS) + { + char const **volatile names[2]; + names[0] = dirdata[0].names; + names[1] = dirdata[1].names; + + /* Use locale-specific sorting if possible, else native byte order. */ + locale_specific_sorting = 1; + if (setjmp (failed_strcoll)) + locale_specific_sorting = 0; + + /* Sort the directories. */ + for (i = 0; i < 2; i++) + qsort (names[i], dirdata[i].nnames, sizeof *dirdata[i].names, + compare_names_for_qsort); + + /* If `-S name' was given, and this is the topmost level of comparison, + ignore all file names less than the specified starting name. */ + + if (starting_file && ! cmp->parent) + { + while (*names[0] && compare_names (*names[0], starting_file) < 0) + names[0]++; + while (*names[1] && compare_names (*names[1], starting_file) < 0) + names[1]++; + } + + /* Loop while files remain in one or both dirs. */ + while (*names[0] || *names[1]) + { + /* Compare next name in dir 0 with next name in dir 1. + At the end of a dir, + pretend the "next name" in that dir is very large. */ + int nameorder = (!*names[0] ? 1 : !*names[1] ? -1 + : compare_names (*names[0], *names[1])); + int v1 = (*handle_file) (cmp, + 0 < nameorder ? 0 : *names[0]++, + nameorder < 0 ? 0 : *names[1]++); + if (val < v1) + val = v1; + } + } + + for (i = 0; i < 2; i++) + { + if (dirdata[i].names) + free (dirdata[i].names); + if (dirdata[i].data) + free (dirdata[i].data); + } + + return val; +} + +/* Return nonzero if CMP is looping recursively in argument I. */ + +static bool +dir_loop (struct comparison const *cmp, int i) +{ + struct comparison const *p = cmp; + while ((p = p->parent)) + if (0 < same_file (&p->file[i].stat, &cmp->file[i].stat)) + return 1; + return 0; +} diff --git a/gnu/dist/diffutils/src/ed.c b/gnu/dist/diffutils/src/ed.c new file mode 100644 index 00000000000..42e47edbbb4 --- /dev/null +++ b/gnu/dist/diffutils/src/ed.c @@ -0,0 +1,171 @@ +/* $NetBSD: ed.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* Output routines for ed-script format. + + Copyright (C) 1988, 1989, 1991, 1992, 1993, 1995, 1998, 2001 Free + Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" + +static void print_ed_hunk (struct change *); +static void print_rcs_hunk (struct change *); +static void pr_forward_ed_hunk (struct change *); + +/* Print our script as ed commands. */ + +void +print_ed_script (struct change *script) +{ + print_script (script, find_reverse_change, print_ed_hunk); +} + +/* Print a hunk of an ed diff */ + +static void +print_ed_hunk (struct change *hunk) +{ + lin f0, l0, f1, l1; + enum changes changes; + +#ifdef DEBUG + debug_script (hunk); +#endif + + /* Determine range of line numbers involved in each file. */ + changes = analyze_hunk (hunk, &f0, &l0, &f1, &l1); + if (!changes) + return; + + begin_output (); + + /* Print out the line number header for this hunk */ + print_number_range (',', &files[0], f0, l0); + fprintf (outfile, "%c\n", change_letter[changes]); + + /* Print new/changed lines from second file, if needed */ + if (changes != OLD) + { + lin i; + for (i = f1; i <= l1; i++) + { + if (files[1].linbuf[i][0] == '.' && files[1].linbuf[i][1] == '\n') + { + /* The file's line is just a dot, and it would exit + insert mode. Precede the dot with another dot, exit + insert mode, remove the extra dot, and then resume + insert mode. */ + fprintf (outfile, "..\n.\ns/.//\na\n"); + } + else + print_1_line ("", &files[1].linbuf[i]); + } + + fprintf (outfile, ".\n"); + } +} + +/* Print change script in the style of ed commands, + but print the changes in the order they appear in the input files, + which means that the commands are not truly useful with ed. */ + +void +pr_forward_ed_script (struct change *script) +{ + print_script (script, find_change, pr_forward_ed_hunk); +} + +static void +pr_forward_ed_hunk (struct change *hunk) +{ + lin i, f0, l0, f1, l1; + + /* Determine range of line numbers involved in each file. */ + enum changes changes = analyze_hunk (hunk, &f0, &l0, &f1, &l1); + if (!changes) + return; + + begin_output (); + + fprintf (outfile, "%c", change_letter[changes]); + print_number_range (' ', files, f0, l0); + fprintf (outfile, "\n"); + + /* If deletion only, print just the number range. */ + + if (changes == OLD) + return; + + /* For insertion (with or without deletion), print the number range + and the lines from file 2. */ + + for (i = f1; i <= l1; i++) + print_1_line ("", &files[1].linbuf[i]); + + fprintf (outfile, ".\n"); +} + +/* Print in a format somewhat like ed commands + except that each insert command states the number of lines it inserts. + This format is used for RCS. */ + +void +print_rcs_script (struct change *script) +{ + print_script (script, find_change, print_rcs_hunk); +} + +/* Print a hunk of an RCS diff */ + +static void +print_rcs_hunk (struct change *hunk) +{ + lin i, f0, l0, f1, l1; + long tf0, tl0, tf1, tl1; + + /* Determine range of line numbers involved in each file. */ + enum changes changes = analyze_hunk (hunk, &f0, &l0, &f1, &l1); + if (!changes) + return; + + begin_output (); + + translate_range (&files[0], f0, l0, &tf0, &tl0); + + if (changes & OLD) + { + fprintf (outfile, "d"); + /* For deletion, print just the starting line number from file 0 + and the number of lines deleted. */ + fprintf (outfile, "%ld %ld\n", tf0, tf0 <= tl0 ? tl0 - tf0 + 1 : 1); + } + + if (changes & NEW) + { + fprintf (outfile, "a"); + + /* Take last-line-number from file 0 and # lines from file 1. */ + translate_range (&files[1], f1, l1, &tf1, &tl1); + fprintf (outfile, "%ld %ld\n", tl0, tf1 <= tl1 ? tl1 - tf1 + 1 : 1); + + /* Print the inserted lines. */ + for (i = f1; i <= l1; i++) + print_1_line ("", &files[1].linbuf[i]); + } +} diff --git a/gnu/dist/diffutils/src/ifdef.c b/gnu/dist/diffutils/src/ifdef.c new file mode 100644 index 00000000000..f8e3f4e4044 --- /dev/null +++ b/gnu/dist/diffutils/src/ifdef.c @@ -0,0 +1,426 @@ +/* $NetBSD: ifdef.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* #ifdef-format output routines for GNU DIFF. + + Copyright (C) 1989, 1991, 1992, 1993, 1994, 2001, 2002 Free + Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the GNU DIFF General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + GNU DIFF, but only under the conditions described in the + GNU DIFF General Public License. A copy of this license is + supposed to have been given to you along with GNU DIFF so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. */ + +#include "diff.h" + +#include <xalloc.h> + +struct group +{ + struct file_data const *file; + lin from, upto; /* start and limit lines for this group of lines */ +}; + +static char const *format_group (FILE *, char const *, char, + struct group const *); +static char const *do_printf_spec (FILE *, char const *, + struct file_data const *, lin, + struct group const *); +static char const *scan_char_literal (char const *, char *); +static lin groups_letter_value (struct group const *, char); +static void format_ifdef (char const *, lin, lin, lin, lin); +static void print_ifdef_hunk (struct change *); +static void print_ifdef_lines (FILE *, char const *, struct group const *); + +static lin next_line; + +/* Print the edit-script SCRIPT as a merged #ifdef file. */ + +void +print_ifdef_script (struct change *script) +{ + next_line = - files[0].prefix_lines; + print_script (script, find_change, print_ifdef_hunk); + if (next_line < files[0].valid_lines) + { + begin_output (); + format_ifdef (group_format[UNCHANGED], next_line, files[0].valid_lines, + next_line - files[0].valid_lines + files[1].valid_lines, + files[1].valid_lines); + } +} + +/* Print a hunk of an ifdef diff. + This is a contiguous portion of a complete edit script, + describing changes in consecutive lines. */ + +static void +print_ifdef_hunk (struct change *hunk) +{ + lin first0, last0, first1, last1; + + /* Determine range of line numbers involved in each file. */ + enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); + if (!changes) + return; + + begin_output (); + + /* Print lines up to this change. */ + if (next_line < first0) + format_ifdef (group_format[UNCHANGED], next_line, first0, + next_line - first0 + first1, first1); + + /* Print this change. */ + next_line = last0 + 1; + format_ifdef (group_format[changes], first0, next_line, first1, last1 + 1); +} + +/* Print a set of lines according to FORMAT. + Lines BEG0 up to END0 are from the first file; + lines BEG1 up to END1 are from the second file. */ + +static void +format_ifdef (char const *format, lin beg0, lin end0, lin beg1, lin end1) +{ + struct group groups[2]; + + groups[0].file = &files[0]; + groups[0].from = beg0; + groups[0].upto = end0; + groups[1].file = &files[1]; + groups[1].from = beg1; + groups[1].upto = end1; + format_group (outfile, format, 0, groups); +} + +/* Print to file OUT a set of lines according to FORMAT. + The format ends at the first free instance of ENDCHAR. + Yield the address of the terminating character. + GROUPS specifies which lines to print. + If OUT is zero, do not actually print anything; just scan the format. */ + +static char const * +format_group (register FILE *out, char const *format, char endchar, + struct group const *groups) +{ + register char c; + register char const *f = format; + + while ((c = *f) != endchar && c != 0) + { + char const *f1 = ++f; + if (c == '%') + switch ((c = *f++)) + { + case '%': + break; + + case '(': + /* Print if-then-else format e.g. `%(n=1?thenpart:elsepart)'. */ + { + int i; + uintmax_t value[2]; + FILE *thenout, *elseout; + + for (i = 0; i < 2; i++) + { + if (ISDIGIT (*f)) + { + char *fend; + errno = 0; + value[i] = strtoumax (f, &fend, 10); + if (errno) + goto bad_format; + f = fend; + } + else + { + value[i] = groups_letter_value (groups, *f); + if (value[i] == -1) + goto bad_format; + f++; + } + if (*f++ != "=?"[i]) + goto bad_format; + } + if (value[0] == value[1]) + thenout = out, elseout = 0; + else + thenout = 0, elseout = out; + f = format_group (thenout, f, ':', groups); + if (*f) + { + f = format_group (elseout, f + 1, ')', groups); + if (*f) + f++; + } + } + continue; + + case '<': + /* Print lines deleted from first file. */ + print_ifdef_lines (out, line_format[OLD], &groups[0]); + continue; + + case '=': + /* Print common lines. */ + print_ifdef_lines (out, line_format[UNCHANGED], &groups[0]); + continue; + + case '>': + /* Print lines inserted from second file. */ + print_ifdef_lines (out, line_format[NEW], &groups[1]); + continue; + + default: + f = do_printf_spec (out, f - 2, 0, 0, groups); + if (f) + continue; + /* Fall through. */ + bad_format: + c = '%'; + f = f1; + break; + } + + if (out) + putc (c, out); + } + + return f; +} + +/* For the line group pair G, return the number corresponding to LETTER. + Return -1 if LETTER is not a group format letter. */ +static lin +groups_letter_value (struct group const *g, char letter) +{ + switch (letter) + { + case 'E': letter = 'e'; g++; break; + case 'F': letter = 'f'; g++; break; + case 'L': letter = 'l'; g++; break; + case 'M': letter = 'm'; g++; break; + case 'N': letter = 'n'; g++; break; + } + + switch (letter) + { + case 'e': return translate_line_number (g->file, g->from) - 1; + case 'f': return translate_line_number (g->file, g->from); + case 'l': return translate_line_number (g->file, g->upto) - 1; + case 'm': return translate_line_number (g->file, g->upto); + case 'n': return g->upto - g->from; + default: return -1; + } +} + +/* Print to file OUT, using FORMAT to print the line group GROUP. + But do nothing if OUT is zero. */ +static void +print_ifdef_lines (register FILE *out, char const *format, + struct group const *group) +{ + struct file_data const *file = group->file; + char const * const *linbuf = file->linbuf; + lin from = group->from, upto = group->upto; + + if (!out) + return; + + /* If possible, use a single fwrite; it's faster. */ + if (!expand_tabs && format[0] == '%') + { + if (format[1] == 'l' && format[2] == '\n' && !format[3] && from < upto) + { + fwrite (linbuf[from], sizeof (char), + linbuf[upto] + (linbuf[upto][-1] != '\n') - linbuf[from], + out); + return; + } + if (format[1] == 'L' && !format[2]) + { + fwrite (linbuf[from], sizeof (char), + linbuf[upto] - linbuf[from], out); + return; + } + } + + for (; from < upto; from++) + { + register char c; + register char const *f = format; + + while ((c = *f++) != 0) + { + char const *f1 = f; + if (c == '%') + switch ((c = *f++)) + { + case '%': + break; + + case 'l': + output_1_line (linbuf[from], + (linbuf[from + 1] + - (linbuf[from + 1][-1] == '\n')), + 0, 0); + continue; + + case 'L': + output_1_line (linbuf[from], linbuf[from + 1], 0, 0); + continue; + + default: + f = do_printf_spec (out, f - 2, file, from, 0); + if (f) + continue; + c = '%'; + f = f1; + break; + } + + putc (c, out); + } + } +} + +static char const * +do_printf_spec (FILE *out, char const *spec, + struct file_data const *file, lin n, + struct group const *groups) +{ + char const *f = spec; + char c; + char c1; + + /* Scan printf-style SPEC of the form %[-'0]*[0-9]*(.[0-9]*)?[cdoxX]. */ + /* assert (*f == '%'); */ + f++; + while ((c = *f++) == '-' || c == '\'' || c == '0') + continue; + while (ISDIGIT (c)) + c = *f++; + if (c == '.') + while (ISDIGIT (c = *f++)) + continue; + c1 = *f++; + + switch (c) + { + case 'c': + if (c1 != '\'') + return 0; + else + { + char value; + f = scan_char_literal (f, &value); + if (!f) + return 0; + if (out) + putc (value, out); + } + break; + + case 'd': case 'o': case 'x': case 'X': + { + lin value; + + if (file) + { + if (c1 != 'n') + return 0; + value = translate_line_number (file, n); + } + else + { + value = groups_letter_value (groups, c1); + if (value < 0) + return 0; + } + + if (out) + { + /* For example, if the spec is "%3xn", use the printf + format spec "%3lx". Here the spec prefix is "%3". */ + long long_value = value; + size_t spec_prefix_len = f - spec - 2; +#if HAVE_C_VARARRAYS + char format[spec_prefix_len + 3]; +#else + char *format = xmalloc (spec_prefix_len + 3); +#endif + char *p = format + spec_prefix_len; + memcpy (format, spec, spec_prefix_len); + *p++ = 'l'; + *p++ = c; + *p = '\0'; + fprintf (out, format, long_value); +#if ! HAVE_C_VARARRAYS + free (format); +#endif + } + } + break; + + default: + return 0; + } + + return f; +} + +/* Scan the character literal represented in the string LIT; LIT points just + after the initial apostrophe. Put the literal's value into *VALPTR. + Yield the address of the first character after the closing apostrophe, + or zero if the literal is ill-formed. */ +static char const * +scan_char_literal (char const *lit, char *valptr) +{ + register char const *p = lit; + char value; + ptrdiff_t digits; + char c = *p++; + + switch (c) + { + case 0: + case '\'': + return 0; + + case '\\': + value = 0; + while ((c = *p++) != '\'') + { + unsigned int digit = c - '0'; + if (8 <= digit) + return 0; + value = 8 * value + digit; + } + digits = p - lit - 2; + if (! (1 <= digits && digits <= 3)) + return 0; + break; + + default: + value = c; + if (*p++ != '\'') + return 0; + break; + } + + *valptr = value; + return p; +} diff --git a/gnu/dist/diffutils/src/io.c b/gnu/dist/diffutils/src/io.c new file mode 100644 index 00000000000..47d75a535b6 --- /dev/null +++ b/gnu/dist/diffutils/src/io.c @@ -0,0 +1,857 @@ +/* $NetBSD: io.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* File I/O for GNU DIFF. + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" +#include <cmpbuf.h> +#include <regex.h> +#include <setmode.h> +#include <xalloc.h> + +/* Rotate an unsigned value to the left. */ +#define ROL(v, n) ((v) << (n) | (v) >> (sizeof (v) * CHAR_BIT - (n))) + +/* Given a hash value and a new character, return a new hash value. */ +#define HASH(h, c) ((c) + ROL (h, 7)) + +/* The type of a hash value. */ +typedef size_t hash_value; +verify (hash_value_is_unsigned, ! TYPE_SIGNED (hash_value)); + +/* Lines are put into equivalence classes of lines that match in lines_differ. + Each equivalence class is represented by one of these structures, + but only while the classes are being computed. + Afterward, each class is represented by a number. */ +struct equivclass +{ + lin next; /* Next item in this bucket. */ + hash_value hash; /* Hash of lines in this class. */ + char const *line; /* A line that fits this class. */ + size_t length; /* That line's length, not counting its newline. */ +}; + +/* Hash-table: array of buckets, each being a chain of equivalence classes. + buckets[-1] is reserved for incomplete lines. */ +static lin *buckets; + +/* Number of buckets in the hash table array, not counting buckets[-1]. */ +static size_t nbuckets; + +/* Array in which the equivalence classes are allocated. + The bucket-chains go through the elements in this array. + The number of an equivalence class is its index in this array. */ +static struct equivclass *equivs; + +/* Index of first free element in the array `equivs'. */ +static lin equivs_index; + +/* Number of elements allocated in the array `equivs'. */ +static lin equivs_alloc; + +/* Read a block of data into a file buffer, checking for EOF and error. */ + +void +file_block_read (struct file_data *current, size_t size) +{ + if (size && ! current->eof) + { + size_t s = block_read (current->desc, + FILE_BUFFER (current) + current->buffered, size); + if (s == SIZE_MAX) + pfatal_with_name (current->name); + current->buffered += s; + current->eof = s < size; + } +} + +/* Check for binary files and compare them for exact identity. */ + +/* Return 1 if BUF contains a non text character. + SIZE is the number of characters in BUF. */ + +#define binary_file_p(buf, size) (memchr (buf, 0, size) != 0) + +/* Get ready to read the current file. + Return nonzero if SKIP_TEST is zero, + and if it appears to be a binary file. */ + +static bool +sip (struct file_data *current, bool skip_test) +{ + /* If we have a nonexistent file at this stage, treat it as empty. */ + if (current->desc < 0) + { + /* Leave room for a sentinel. */ + current->bufsize = sizeof (word); + current->buffer = xmalloc (current->bufsize); + } + else + { + current->bufsize = buffer_lcm (sizeof (word), + STAT_BLOCKSIZE (current->stat), + PTRDIFF_MAX - 2 * sizeof (word)); + current->buffer = xmalloc (current->bufsize); + + if (! skip_test) + { + /* Check first part of file to see if it's a binary file. */ + + bool was_binary = set_binary_mode (current->desc, 1); + off_t buffered; + file_block_read (current, current->bufsize); + buffered = current->buffered; + + if (! was_binary) + { + /* Revert to text mode and seek back to the beginning to + reread the file. Use relative seek, since file + descriptors like stdin might not start at offset + zero. */ + + if (lseek (current->desc, - buffered, SEEK_CUR) == -1) + pfatal_with_name (current->name); + set_binary_mode (current->desc, 0); + current->buffered = 0; + current->eof = 0; + } + + return binary_file_p (current->buffer, buffered); + } + } + + current->buffered = 0; + current->eof = 0; + return 0; +} + +/* Slurp the rest of the current file completely into memory. */ + +static void +slurp (struct file_data *current) +{ + size_t cc; + + if (current->desc < 0) + { + /* The file is nonexistent. */ + return; + } + + if (S_ISREG (current->stat.st_mode)) + { + /* It's a regular file; slurp in the rest all at once. */ + + /* Get the size out of the stat block. + Allocate just enough room for appended newline plus word sentinel, + plus word-alignment since we want the buffer word-aligned. */ + size_t file_size = current->stat.st_size; + cc = file_size + 2 * sizeof (word) - file_size % sizeof (word); + if (file_size != current->stat.st_size || cc < file_size + || PTRDIFF_MAX <= cc) + xalloc_die (); + + if (current->bufsize < cc) + { + current->bufsize = cc; + current->buffer = xrealloc (current->buffer, cc); + } + + /* Try to read at least 1 more byte than the size indicates, to + detect whether the file is growing. This is a nicety for + users who run 'diff' on files while they are changing. */ + + if (current->buffered <= file_size) + { + file_block_read (current, file_size + 1 - current->buffered); + if (current->buffered <= file_size) + return; + } + } + + /* It's not a regular file, or it's a growing regular file; read it, + growing the buffer as needed. */ + + file_block_read (current, current->bufsize - current->buffered); + + if (current->buffered) + { + while (current->buffered == current->bufsize) + { + if (PTRDIFF_MAX / 2 - sizeof (word) < current->bufsize) + xalloc_die (); + current->bufsize *= 2; + current->buffer = xrealloc (current->buffer, current->bufsize); + file_block_read (current, current->bufsize - current->buffered); + } + + /* Allocate just enough room for appended newline plus word + sentinel, plus word-alignment. */ + cc = current->buffered + 2 * sizeof (word); + current->bufsize = cc - cc % sizeof (word); + current->buffer = xrealloc (current->buffer, current->bufsize); + } +} + +/* Split the file into lines, simultaneously computing the equivalence + class for each line. */ + +static void +find_and_hash_each_line (struct file_data *current) +{ + hash_value h; + unsigned char const *p = (unsigned char const *) current->prefix_end; + unsigned char c; + lin i, *bucket; + size_t length; + + /* Cache often-used quantities in local variables to help the compiler. */ + char const **linbuf = current->linbuf; + lin alloc_lines = current->alloc_lines; + lin line = 0; + lin linbuf_base = current->linbuf_base; + lin *cureqs = xmalloc (alloc_lines * sizeof *cureqs); + struct equivclass *eqs = equivs; + lin eqs_index = equivs_index; + lin eqs_alloc = equivs_alloc; + char const *suffix_begin = current->suffix_begin; + char const *bufend = FILE_BUFFER (current) + current->buffered; + bool diff_length_compare_anyway = + ignore_white_space != IGNORE_NO_WHITE_SPACE; + bool same_length_diff_contents_compare_anyway = + diff_length_compare_anyway | ignore_case; + + while ((char const *) p < suffix_begin) + { + char const *ip = (char const *) p; + + h = 0; + + /* Hash this line until we find a newline. */ + if (ignore_case) + switch (ignore_white_space) + { + case IGNORE_ALL_SPACE: + while ((c = *p++) != '\n') + if (! ISSPACE (c)) + h = HASH (h, TOLOWER (c)); + break; + + case IGNORE_SPACE_CHANGE: + while ((c = *p++) != '\n') + { + if (ISSPACE (c)) + { + do + if ((c = *p++) == '\n') + goto hashing_done; + while (ISSPACE (c)); + + h = HASH (h, ' '); + } + + /* C is now the first non-space. */ + h = HASH (h, TOLOWER (c)); + } + break; + + case IGNORE_TAB_EXPANSION: + { + size_t column = 0; + while ((c = *p++) != '\n') + { + int repetitions = 1; + + switch (c) + { + case '\b': + column -= 0 < column; + break; + + case '\t': + c = ' '; + repetitions = TAB_WIDTH - column % TAB_WIDTH; + column += repetitions; + break; + + case '\r': + column = 0; + break; + + default: + c = TOLOWER (c); + column++; + break; + } + + do + h = HASH (h, c); + while (--repetitions != 0); + } + } + break; + + default: + while ((c = *p++) != '\n') + h = HASH (h, TOLOWER (c)); + break; + } + else + switch (ignore_white_space) + { + case IGNORE_ALL_SPACE: + while ((c = *p++) != '\n') + if (! ISSPACE (c)) + h = HASH (h, c); + break; + + case IGNORE_SPACE_CHANGE: + while ((c = *p++) != '\n') + { + if (ISSPACE (c)) + { + do + if ((c = *p++) == '\n') + goto hashing_done; + while (ISSPACE (c)); + + h = HASH (h, ' '); + } + + /* C is now the first non-space. */ + h = HASH (h, c); + } + break; + + case IGNORE_TAB_EXPANSION: + { + size_t column = 0; + while ((c = *p++) != '\n') + { + int repetitions = 1; + + switch (c) + { + case '\b': + column -= 0 < column; + break; + + case '\t': + c = ' '; + repetitions = TAB_WIDTH - column % TAB_WIDTH; + column += repetitions; + break; + + case '\r': + column = 0; + break; + + default: + column++; + break; + } + + do + h = HASH (h, c); + while (--repetitions != 0); + } + } + break; + + default: + while ((c = *p++) != '\n') + h = HASH (h, c); + break; + } + + hashing_done:; + + bucket = &buckets[h % nbuckets]; + length = (char const *) p - ip - 1; + + if ((char const *) p == bufend + && current->missing_newline + && ROBUST_OUTPUT_STYLE (output_style)) + { + /* This line is incomplete. If this is significant, + put the line into buckets[-1]. */ + if (ignore_white_space < IGNORE_SPACE_CHANGE) + bucket = &buckets[-1]; + + /* Omit the inserted newline when computing linbuf later. */ + p--; + bufend = suffix_begin = (char const *) p; + } + + for (i = *bucket; ; i = eqs[i].next) + if (!i) + { + /* Create a new equivalence class in this bucket. */ + i = eqs_index++; + if (i == eqs_alloc) + { + if (PTRDIFF_MAX / (2 * sizeof *eqs) <= eqs_alloc) + xalloc_die (); + eqs_alloc *= 2; + eqs = xrealloc (eqs, eqs_alloc * sizeof *eqs); + } + eqs[i].next = *bucket; + eqs[i].hash = h; + eqs[i].line = ip; + eqs[i].length = length; + *bucket = i; + break; + } + else if (eqs[i].hash == h) + { + char const *eqline = eqs[i].line; + + /* Reuse existing class if lines_differ reports the lines + equal. */ + if (eqs[i].length == length) + { + /* Reuse existing equivalence class if the lines are identical. + This detects the common case of exact identity + faster than lines_differ would. */ + if (memcmp (eqline, ip, length) == 0) + break; + if (!same_length_diff_contents_compare_anyway) + continue; + } + else if (!diff_length_compare_anyway) + continue; + + if (! lines_differ (eqline, ip)) + break; + } + + /* Maybe increase the size of the line table. */ + if (line == alloc_lines) + { + /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ + if (PTRDIFF_MAX / 3 <= alloc_lines + || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base + || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) + xalloc_die (); + alloc_lines = 2 * alloc_lines - linbuf_base; + cureqs = xrealloc (cureqs, alloc_lines * sizeof *cureqs); + linbuf += linbuf_base; + linbuf = xrealloc (linbuf, + (alloc_lines - linbuf_base) * sizeof *linbuf); + linbuf -= linbuf_base; + } + linbuf[line] = ip; + cureqs[line] = i; + ++line; + } + + current->buffered_lines = line; + + for (i = 0; ; i++) + { + /* Record the line start for lines in the suffix that we care about. + Record one more line start than lines, + so that we can compute the length of any buffered line. */ + if (line == alloc_lines) + { + /* Double (alloc_lines - linbuf_base) by adding to alloc_lines. */ + if (PTRDIFF_MAX / 3 <= alloc_lines + || PTRDIFF_MAX / sizeof *cureqs <= 2 * alloc_lines - linbuf_base + || PTRDIFF_MAX / sizeof *linbuf <= alloc_lines - linbuf_base) + xalloc_die (); + alloc_lines = 2 * alloc_lines - linbuf_base; + linbuf += linbuf_base; + linbuf = xrealloc (linbuf, + (alloc_lines - linbuf_base) * sizeof *linbuf); + linbuf -= linbuf_base; + } + linbuf[line] = (char const *) p; + + if ((char const *) p == bufend) + break; + + if (context <= i && no_diff_means_no_output) + break; + + line++; + + while (*p++ != '\n') + continue; + } + + /* Done with cache in local variables. */ + current->linbuf = linbuf; + current->valid_lines = line; + current->alloc_lines = alloc_lines; + current->equivs = cureqs; + equivs = eqs; + equivs_alloc = eqs_alloc; + equivs_index = eqs_index; +} + +/* Prepare the text. Make sure the text end is initialized. + Make sure text ends in a newline, + but remember that we had to add one. + Strip trailing CRs, if that was requested. */ + +static void +prepare_text (struct file_data *current) +{ + size_t buffered = current->buffered; + char *p = FILE_BUFFER (current); + char *dst; + + if (buffered == 0 || p[buffered - 1] == '\n') + current->missing_newline = 0; + else + { + p[buffered++] = '\n'; + current->missing_newline = 1; + } + + if (!p) + return; + + /* Don't use uninitialized storage when planting or using sentinels. */ + memset (p + buffered, 0, sizeof (word)); + + if (strip_trailing_cr && (dst = memchr (p, '\r', buffered))) + { + char const *src = dst; + char const *srclim = p + buffered; + + do + dst += ! ((*dst = *src++) == '\r' && *src == '\n'); + while (src < srclim); + + buffered -= src - dst; + } + + current->buffered = buffered; +} + +/* We have found N lines in a buffer of size S; guess the + proportionate number of lines that will be found in a buffer of + size T. However, do not guess a number of lines so large that the + resulting line table might cause overflow in size calculations. */ +static lin +guess_lines (lin n, size_t s, size_t t) +{ + size_t guessed_bytes_per_line = n < 10 ? 32 : s / (n - 1); + lin guessed_lines = MAX (1, t / guessed_bytes_per_line); + return MIN (guessed_lines, PTRDIFF_MAX / (2 * sizeof (char *) + 1) - 5) + 5; +} + +/* Given a vector of two file_data objects, find the identical + prefixes and suffixes of each object. */ + +static void +find_identical_ends (struct file_data filevec[]) +{ + word *w0, *w1; + char *p0, *p1, *buffer0, *buffer1; + char const *end0, *beg0; + char const **linbuf0, **linbuf1; + lin i, lines; + size_t n0, n1; + lin alloc_lines0, alloc_lines1; + lin buffered_prefix, prefix_count, prefix_mask; + lin middle_guess, suffix_guess; + + slurp (&filevec[0]); + prepare_text (&filevec[0]); + if (filevec[0].desc != filevec[1].desc) + { + slurp (&filevec[1]); + prepare_text (&filevec[1]); + } + else + { + filevec[1].buffer = filevec[0].buffer; + filevec[1].bufsize = filevec[0].bufsize; + filevec[1].buffered = filevec[0].buffered; + filevec[1].missing_newline = filevec[0].missing_newline; + } + + /* Find identical prefix. */ + + w0 = filevec[0].buffer; + w1 = filevec[1].buffer; + p0 = buffer0 = (char *) w0; + p1 = buffer1 = (char *) w1; + n0 = filevec[0].buffered; + n1 = filevec[1].buffered; + + if (p0 == p1) + /* The buffers are the same; sentinels won't work. */ + p0 = p1 += n1; + else + { + /* Insert end sentinels, in this case characters that are guaranteed + to make the equality test false, and thus terminate the loop. */ + + if (n0 < n1) + p0[n0] = ~p1[n0]; + else + p1[n1] = ~p0[n1]; + + /* Loop until first mismatch, or to the sentinel characters. */ + + /* Compare a word at a time for speed. */ + while (*w0 == *w1) + w0++, w1++; + + /* Do the last few bytes of comparison a byte at a time. */ + p0 = (char *) w0; + p1 = (char *) w1; + while (*p0 == *p1) + p0++, p1++; + + /* Don't mistakenly count missing newline as part of prefix. */ + if (ROBUST_OUTPUT_STYLE (output_style) + && ((buffer0 + n0 - filevec[0].missing_newline < p0) + != + (buffer1 + n1 - filevec[1].missing_newline < p1))) + p0--, p1--; + } + + /* Now P0 and P1 point at the first nonmatching characters. */ + + /* Skip back to last line-beginning in the prefix, + and then discard up to HORIZON_LINES lines from the prefix. */ + i = horizon_lines; + while (p0 != buffer0 && (p0[-1] != '\n' || i--)) + p0--, p1--; + + /* Record the prefix. */ + filevec[0].prefix_end = p0; + filevec[1].prefix_end = p1; + + /* Find identical suffix. */ + + /* P0 and P1 point beyond the last chars not yet compared. */ + p0 = buffer0 + n0; + p1 = buffer1 + n1; + + if (! ROBUST_OUTPUT_STYLE (output_style) + || filevec[0].missing_newline == filevec[1].missing_newline) + { + end0 = p0; /* Addr of last char in file 0. */ + + /* Get value of P0 at which we should stop scanning backward: + this is when either P0 or P1 points just past the last char + of the identical prefix. */ + beg0 = filevec[0].prefix_end + (n0 < n1 ? 0 : n0 - n1); + + /* Scan back until chars don't match or we reach that point. */ + for (; p0 != beg0; p0--, p1--) + if (*p0 != *p1) + { + /* Point at the first char of the matching suffix. */ + beg0 = p0; + break; + } + + /* Are we at a line-beginning in both files? If not, add the rest of + this line to the main body. Discard up to HORIZON_LINES lines from + the identical suffix. Also, discard one extra line, + because shift_boundaries may need it. */ + i = horizon_lines + !((buffer0 == p0 || p0[-1] == '\n') + && + (buffer1 == p1 || p1[-1] == '\n')); + while (i-- && p0 != end0) + while (*p0++ != '\n') + continue; + + p1 += p0 - beg0; + } + + /* Record the suffix. */ + filevec[0].suffix_begin = p0; + filevec[1].suffix_begin = p1; + + /* Calculate number of lines of prefix to save. + + prefix_count == 0 means save the whole prefix; + we need this for options like -D that output the whole file, + or for enormous contexts (to avoid worrying about arithmetic overflow). + We also need it for options like -F that output some preceding line; + at least we will need to find the last few lines, + but since we don't know how many, it's easiest to find them all. + + Otherwise, prefix_count != 0. Save just prefix_count lines at start + of the line buffer; they'll be moved to the proper location later. + Handle 1 more line than the context says (because we count 1 too many), + rounded up to the next power of 2 to speed index computation. */ + + if (no_diff_means_no_output && ! function_regexp.fastmap + && context < LIN_MAX / 4 && context < n0) + { + middle_guess = guess_lines (0, 0, p0 - filevec[0].prefix_end); + suffix_guess = guess_lines (0, 0, buffer0 + n0 - p0); + for (prefix_count = 1; prefix_count <= context; prefix_count *= 2) + continue; + alloc_lines0 = (prefix_count + middle_guess + + MIN (context, suffix_guess)); + } + else + { + prefix_count = 0; + alloc_lines0 = guess_lines (0, 0, n0); + } + + prefix_mask = prefix_count - 1; + lines = 0; + linbuf0 = xmalloc (alloc_lines0 * sizeof *linbuf0); + p0 = buffer0; + + /* If the prefix is needed, find the prefix lines. */ + if (! (no_diff_means_no_output + && filevec[0].prefix_end == p0 + && filevec[1].prefix_end == p1)) + { + end0 = filevec[0].prefix_end; + while (p0 != end0) + { + lin l = lines++ & prefix_mask; + if (l == alloc_lines0) + { + if (PTRDIFF_MAX / (2 * sizeof *linbuf0) <= alloc_lines0) + xalloc_die (); + alloc_lines0 *= 2; + linbuf0 = xrealloc (linbuf0, alloc_lines0 * sizeof *linbuf0); + } + linbuf0[l] = p0; + while (*p0++ != '\n') + continue; + } + } + buffered_prefix = prefix_count && context < lines ? context : lines; + + /* Allocate line buffer 1. */ + + middle_guess = guess_lines (lines, p0 - buffer0, p1 - filevec[1].prefix_end); + suffix_guess = guess_lines (lines, p0 - buffer0, buffer1 + n1 - p1); + alloc_lines1 = buffered_prefix + middle_guess + MIN (context, suffix_guess); + if (alloc_lines1 < buffered_prefix + || PTRDIFF_MAX / sizeof *linbuf1 <= alloc_lines1) + xalloc_die (); + linbuf1 = xmalloc (alloc_lines1 * sizeof *linbuf1); + + if (buffered_prefix != lines) + { + /* Rotate prefix lines to proper location. */ + for (i = 0; i < buffered_prefix; i++) + linbuf1[i] = linbuf0[(lines - context + i) & prefix_mask]; + for (i = 0; i < buffered_prefix; i++) + linbuf0[i] = linbuf1[i]; + } + + /* Initialize line buffer 1 from line buffer 0. */ + for (i = 0; i < buffered_prefix; i++) + linbuf1[i] = linbuf0[i] - buffer0 + buffer1; + + /* Record the line buffer, adjusted so that + linbuf[0] points at the first differing line. */ + filevec[0].linbuf = linbuf0 + buffered_prefix; + filevec[1].linbuf = linbuf1 + buffered_prefix; + filevec[0].linbuf_base = filevec[1].linbuf_base = - buffered_prefix; + filevec[0].alloc_lines = alloc_lines0 - buffered_prefix; + filevec[1].alloc_lines = alloc_lines1 - buffered_prefix; + filevec[0].prefix_lines = filevec[1].prefix_lines = lines; +} + +/* If 1 < k, then (2**k - prime_offset[k]) is the largest prime less + than 2**k. This table is derived from Chris K. Caldwell's list + <http://www.utm.edu/research/primes/lists/2small/>. */ + +static unsigned char const prime_offset[] = +{ + 0, 0, 1, 1, 3, 1, 3, 1, 5, 3, 3, 9, 3, 1, 3, 19, 15, 1, 5, 1, 3, 9, 3, + 15, 3, 39, 5, 39, 57, 3, 35, 1, 5, 9, 41, 31, 5, 25, 45, 7, 87, 21, + 11, 57, 17, 55, 21, 115, 59, 81, 27, 129, 47, 111, 33, 55, 5, 13, 27, + 55, 93, 1, 57, 25 +}; + +/* Verify that this host's size_t is not too wide for the above table. */ + +verify (enough_prime_offsets, + sizeof (size_t) * CHAR_BIT <= sizeof prime_offset); + +/* Given a vector of two file_data objects, read the file associated + with each one, and build the table of equivalence classes. + Return nonzero if either file appears to be a binary file. + If PRETEND_BINARY is nonzero, pretend they are binary regardless. */ + +bool +read_files (struct file_data filevec[], bool pretend_binary) +{ + int i; + bool skip_test = text | pretend_binary; + bool appears_binary = pretend_binary | sip (&filevec[0], skip_test); + + if (filevec[0].desc != filevec[1].desc) + appears_binary |= sip (&filevec[1], skip_test | appears_binary); + else + { + filevec[1].buffer = filevec[0].buffer; + filevec[1].bufsize = filevec[0].bufsize; + filevec[1].buffered = filevec[0].buffered; + } + if (appears_binary) + { + set_binary_mode (filevec[0].desc, 1); + set_binary_mode (filevec[1].desc, 1); + return 1; + } + + find_identical_ends (filevec); + + equivs_alloc = filevec[0].alloc_lines + filevec[1].alloc_lines + 1; + if (PTRDIFF_MAX / sizeof *equivs <= equivs_alloc) + xalloc_die (); + equivs = xmalloc (equivs_alloc * sizeof *equivs); + /* Equivalence class 0 is permanently safe for lines that were not + hashed. Real equivalence classes start at 1. */ + equivs_index = 1; + + /* Allocate (one plus) a prime number of hash buckets. Use a prime + number between 1/3 and 2/3 of the value of equiv_allocs, + approximately. */ + for (i = 9; (size_t) 1 << i < equivs_alloc / 3; i++) + continue; + nbuckets = ((size_t) 1 << i) - prime_offset[i]; + if (PTRDIFF_MAX / sizeof *buckets <= nbuckets) + xalloc_die (); + buckets = zalloc ((nbuckets + 1) * sizeof *buckets); + buckets++; + + for (i = 0; i < 2; i++) + find_and_hash_each_line (&filevec[i]); + + filevec[0].equiv_max = filevec[1].equiv_max = equivs_index; + + free (equivs); + free (buckets - 1); + + return 0; +} diff --git a/gnu/dist/diffutils/src/normal.c b/gnu/dist/diffutils/src/normal.c new file mode 100644 index 00000000000..be0a216115d --- /dev/null +++ b/gnu/dist/diffutils/src/normal.c @@ -0,0 +1,73 @@ +/* $NetBSD: normal.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* Normal-format output routines for GNU DIFF. + + Copyright (C) 1988, 1989, 1993, 1995, 1998, 2001 Free Software + Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" + +static void print_normal_hunk (struct change *); + +/* Print the edit-script SCRIPT as a normal diff. + INF points to an array of descriptions of the two files. */ + +void +print_normal_script (struct change *script) +{ + print_script (script, find_change, print_normal_hunk); +} + +/* Print a hunk of a normal diff. + This is a contiguous portion of a complete edit script, + describing changes in consecutive lines. */ + +static void +print_normal_hunk (struct change *hunk) +{ + lin first0, last0, first1, last1; + register lin i; + + /* Determine range of line numbers involved in each file. */ + enum changes changes = analyze_hunk (hunk, &first0, &last0, &first1, &last1); + if (!changes) + return; + + begin_output (); + + /* Print out the line number header for this hunk */ + print_number_range (',', &files[0], first0, last0); + fprintf (outfile, "%c", change_letter[changes]); + print_number_range (',', &files[1], first1, last1); + fprintf (outfile, "\n"); + + /* Print the lines that the first file has. */ + if (changes & OLD) + for (i = first0; i <= last0; i++) + print_1_line ("<", &files[0].linbuf[i]); + + if (changes == CHANGED) + fprintf (outfile, "---\n"); + + /* Print the lines that the second file has. */ + if (changes & NEW) + for (i = first1; i <= last1; i++) + print_1_line (">", &files[1].linbuf[i]); +} diff --git a/gnu/dist/diffutils/src/sdiff.c b/gnu/dist/diffutils/src/sdiff.c new file mode 100644 index 00000000000..4c65992d9cd --- /dev/null +++ b/gnu/dist/diffutils/src/sdiff.c @@ -0,0 +1,1222 @@ +/* $NetBSD: sdiff.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* sdiff - side-by-side merge of file differences + + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 2001, 2002 Free + Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include <c-stack.h> +#include <dirname.h> +#include <error.h> +#include <exitfail.h> +#include <freesoft.h> +#include <getopt.h> +#include <quotesys.h> +#include <stdio.h> +#include <xalloc.h> + +static char const authorship_msgid[] = N_("Written by Thomas Lord."); + +static char const copyright_string[] = + "Copyright (C) 2002 Free Software Foundation, Inc."; + +extern char const version_string[]; + +/* Size of chunks read from files which must be parsed into lines. */ +#define SDIFF_BUFSIZE ((size_t) 65536) + +char *program_name; + +static char const *editor_program = DEFAULT_EDITOR_PROGRAM; +static char const **diffargv; + +static char * volatile tmpname; +static FILE *tmp; + +#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK +static pid_t volatile diffpid; +#endif + +struct line_filter; + +static RETSIGTYPE catchsig (int); +static bool edit (struct line_filter *, char const *, lin, lin, struct line_filter *, char const *, lin, lin, FILE *); +static bool interact (struct line_filter *, struct line_filter *, char const *, struct line_filter *, char const *, FILE *); +static void checksigs (void); +static void diffarg (char const *); +static void fatal (char const *) __attribute__((noreturn)); +static void perror_fatal (char const *) __attribute__((noreturn)); +static void trapsigs (void); +static void untrapsig (int); + +#define NUM_SIGS (sizeof sigs / sizeof *sigs) +static int const sigs[] = { +#ifdef SIGHUP + SIGHUP, +#endif +#ifdef SIGQUIT + SIGQUIT, +#endif +#ifdef SIGTERM + SIGTERM, +#endif +#ifdef SIGXCPU + SIGXCPU, +#endif +#ifdef SIGXFSZ + SIGXFSZ, +#endif + SIGINT, + SIGPIPE +}; +#define handler_index_of_SIGINT (NUM_SIGS - 2) +#define handler_index_of_SIGPIPE (NUM_SIGS - 1) + +#if HAVE_SIGACTION + /* Prefer `sigaction' if available, since `signal' can lose signals. */ + static struct sigaction initial_action[NUM_SIGS]; +# define initial_handler(i) (initial_action[i].sa_handler) + static void signal_handler (int, RETSIGTYPE (*) (int)); +#else + static RETSIGTYPE (*initial_action[NUM_SIGS]) (); +# define initial_handler(i) (initial_action[i]) +# define signal_handler(sig, handler) signal (sig, handler) +#endif + +#if ! HAVE_SIGPROCMASK +# define sigset_t int +# define sigemptyset(s) (*(s) = 0) +# ifndef sigmask +# define sigmask(sig) (1 << ((sig) - 1)) +# endif +# define sigaddset(s, sig) (*(s) |= sigmask (sig)) +# ifndef SIG_BLOCK +# define SIG_BLOCK 0 +# endif +# ifndef SIG_SETMASK +# define SIG_SETMASK (! SIG_BLOCK) +# endif +# define sigprocmask(how, n, o) \ + ((how) == SIG_BLOCK ? *(o) = sigblock (*(n)) : sigsetmask (*(n))) +#endif + +static bool diraccess (char const *); +static int temporary_file (void); + +/* Options: */ + +/* Name of output file if -o specified. */ +static char const *output; + +/* Do not print common lines. */ +static bool suppress_common_lines; + +/* Value for the long option that does not have single-letter equivalents. */ +enum +{ + DIFF_PROGRAM_OPTION = CHAR_MAX + 1, + HELP_OPTION, + STRIP_TRAILING_CR_OPTION +}; + +static struct option const longopts[] = +{ + {"diff-program", 1, 0, DIFF_PROGRAM_OPTION}, + {"expand-tabs", 0, 0, 't'}, + {"help", 0, 0, HELP_OPTION}, + {"ignore-all-space", 0, 0, 'W'}, /* swap W and w for historical reasons */ + {"ignore-blank-lines", 0, 0, 'B'}, + {"ignore-case", 0, 0, 'i'}, + {"ignore-matching-lines", 1, 0, 'I'}, + {"ignore-space-change", 0, 0, 'b'}, + {"ignore-tab-expansion", 0, 0, 'E'}, + {"left-column", 0, 0, 'l'}, + {"minimal", 0, 0, 'd'}, + {"output", 1, 0, 'o'}, + {"speed-large-files", 0, 0, 'H'}, + {"strip-trailing-cr", 0, 0, STRIP_TRAILING_CR_OPTION}, + {"suppress-common-lines", 0, 0, 's'}, + {"text", 0, 0, 'a'}, + {"version", 0, 0, 'v'}, + {"width", 1, 0, 'w'}, + {0, 0, 0, 0} +}; + +static void try_help (char const *, char const *) __attribute__((noreturn)); +static void +try_help (char const *reason_msgid, char const *operand) +{ + if (reason_msgid) + error (0, 0, _(reason_msgid), operand); + error (EXIT_TROUBLE, 0, _("Try `%s --help' for more information."), + program_name); + abort (); +} + +static void +check_stdout (void) +{ + if (ferror (stdout)) + fatal ("write failed"); + else if (fclose (stdout) != 0) + perror_fatal (_("standard output")); +} + +static char const * const option_help_msgid[] = { + N_("-o FILE --output=FILE Operate interactively, sending output to FILE."), + "", + N_("-i --ignore-case Consider upper- and lower-case to be the same."), + N_("-E --ignore-tab-expansion Ignore changes due to tab expansion."), + N_("-b --ignore-space-change Ignore changes in the amount of white space."), + N_("-W --ignore-all-space Ignore all white space."), + N_("-B --ignore-blank-lines Ignore changes whose lines are all blank."), + N_("-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE."), + N_("--strip-trailing-cr Strip trailing carriage return on input."), + N_("-a --text Treat all files as text."), + "", + N_("-w NUM --width=NUM Output at most NUM (default 130) columns per line."), + N_("-l --left-column Output only the left column of common lines."), + N_("-s --suppress-common-lines Do not output common lines."), + "", + N_("-t --expand-tabs Expand tabs to spaces in output."), + "", + N_("-d --minimal Try hard to find a smaller set of changes."), + N_("-H --speed-large-files Assume large files and many scattered small changes."), + N_("--diff-program=PROGRAM Use PROGRAM to compare files."), + "", + N_("-v --version Output version info."), + N_("--help Output this help."), + 0 +}; + +static void +usage (void) +{ + char const * const *p; + + printf (_("Usage: %s [OPTION]... FILE1 FILE2\n"), program_name); + printf ("%s\n\n", _("Side-by-side merge of file differences.")); + for (p = option_help_msgid; *p; p++) + if (**p) + printf (" %s\n", _(*p)); + else + putchar ('\n'); + printf ("\n%s\n\n%s\n", + _("If a FILE is `-', read standard input."), + _("Report bugs to <bug-gnu-utils@gnu.org>.")); +} + +static void +cleanup (void) +{ +#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK + if (0 < diffpid) + kill (diffpid, SIGPIPE); +#endif + if (tmpname) + unlink (tmpname); +} + +static void exiterr (void) __attribute__((noreturn)); +static void +exiterr (void) +{ + cleanup (); + untrapsig (0); + checksigs (); + exit (EXIT_TROUBLE); +} + +static void +fatal (char const *msgid) +{ + error (0, 0, "%s", _(msgid)); + exiterr (); +} + +static void +perror_fatal (char const *msg) +{ + int e = errno; + checksigs (); + error (0, e, "%s", msg); + exiterr (); +} + +static void +ck_editor_status (int errnum, int status) +{ + if (errnum | status) + { + char const *failure_msgid = N_("subsidiary program `%s' failed"); + if (! errnum && WIFEXITED (status)) + switch (WEXITSTATUS (status)) + { + case 126: + failure_msgid = N_("subsidiary program `%s' not executable"); + break; + case 127: + failure_msgid = N_("subsidiary program `%s' not found"); + break; + } + error (0, errnum, _(failure_msgid), editor_program); + exiterr (); + } +} + +static FILE * +ck_fopen (char const *fname, char const *type) +{ + FILE *r = fopen (fname, type); + if (! r) + perror_fatal (fname); + return r; +} + +static void +ck_fclose (FILE *f) +{ + if (fclose (f)) + perror_fatal ("fclose"); +} + +static size_t +ck_fread (char *buf, size_t size, FILE *f) +{ + size_t r = fread (buf, sizeof (char), size, f); + if (r == 0 && ferror (f)) + perror_fatal (_("read failed")); + return r; +} + +static void +ck_fwrite (char const *buf, size_t size, FILE *f) +{ + if (fwrite (buf, sizeof (char), size, f) != size) + perror_fatal (_("write failed")); +} + +static void +ck_fflush (FILE *f) +{ + if (fflush (f) != 0) + perror_fatal (_("write failed")); +} + +static char const * +expand_name (char *name, bool is_dir, char const *other_name) +{ + if (strcmp (name, "-") == 0) + fatal ("cannot interactively merge standard input"); + if (! is_dir) + return name; + else + { + /* Yield NAME/BASE, where BASE is OTHER_NAME's basename. */ + char const *base = base_name (other_name); + size_t namelen = strlen (name), baselen = strlen (base); + bool insert_slash = *base_name (name) && name[namelen - 1] != '/'; + char *r = xmalloc (namelen + insert_slash + baselen + 1); + memcpy (r, name, namelen); + r[namelen] = '/'; + memcpy (r + namelen + insert_slash, base, baselen + 1); + return r; + } +} + + + +struct line_filter { + FILE *infile; + char *bufpos; + char *buffer; + char *buflim; +}; + +static void +lf_init (struct line_filter *lf, FILE *infile) +{ + lf->infile = infile; + lf->bufpos = lf->buffer = lf->buflim = xmalloc (SDIFF_BUFSIZE + 1); + lf->buflim[0] = '\n'; +} + +/* Fill an exhausted line_filter buffer from its INFILE */ +static size_t +lf_refill (struct line_filter *lf) +{ + size_t s = ck_fread (lf->buffer, SDIFF_BUFSIZE, lf->infile); + lf->bufpos = lf->buffer; + lf->buflim = lf->buffer + s; + lf->buflim[0] = '\n'; + checksigs (); + return s; +} + +/* Advance LINES on LF's infile, copying lines to OUTFILE */ +static void +lf_copy (struct line_filter *lf, lin lines, FILE *outfile) +{ + char *start = lf->bufpos; + + while (lines) + { + lf->bufpos = (char *) memchr (lf->bufpos, '\n', lf->buflim - lf->bufpos); + if (! lf->bufpos) + { + ck_fwrite (start, lf->buflim - start, outfile); + if (! lf_refill (lf)) + return; + start = lf->bufpos; + } + else + { + --lines; + ++lf->bufpos; + } + } + + ck_fwrite (start, lf->bufpos - start, outfile); +} + +/* Advance LINES on LF's infile without doing output */ +static void +lf_skip (struct line_filter *lf, lin lines) +{ + while (lines) + { + lf->bufpos = (char *) memchr (lf->bufpos, '\n', lf->buflim - lf->bufpos); + if (! lf->bufpos) + { + if (! lf_refill (lf)) + break; + } + else + { + --lines; + ++lf->bufpos; + } + } +} + +/* Snarf a line into a buffer. Return EOF if EOF, 0 if error, 1 if OK. */ +static int +lf_snarf (struct line_filter *lf, char *buffer, size_t bufsize) +{ + for (;;) + { + char *start = lf->bufpos; + char *next = (char *) memchr (start, '\n', lf->buflim + 1 - start); + size_t s = next - start; + if (bufsize <= s) + return 0; + memcpy (buffer, start, s); + if (next < lf->buflim) + { + buffer[s] = 0; + lf->bufpos = next + 1; + return 1; + } + if (! lf_refill (lf)) + return s ? 0 : EOF; + buffer += s; + bufsize -= s; + } +} + + + +int +main (int argc, char *argv[]) +{ + int opt; + char const *prog; + + exit_failure = EXIT_TROUBLE; + initialize_main (&argc, &argv); + program_name = argv[0]; + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + c_stack_action (c_stack_die); + + prog = getenv ("EDITOR"); + if (prog) + editor_program = prog; + + diffarg (DEFAULT_DIFF_PROGRAM); + + /* parse command line args */ + while ((opt = getopt_long (argc, argv, "abBdHiI:lo:stvw:W", longopts, 0)) + != -1) + { + switch (opt) + { + case 'a': + diffarg ("-a"); + break; + + case 'b': + diffarg ("-b"); + break; + + case 'B': + diffarg ("-B"); + break; + + case 'd': + diffarg ("-d"); + break; + + case 'E': + diffarg ("-E"); + break; + + case 'H': + diffarg ("-H"); + break; + + case 'i': + diffarg ("-i"); + break; + + case 'I': + diffarg ("-I"); + diffarg (optarg); + break; + + case 'l': + diffarg ("--left-column"); + break; + + case 'o': + output = optarg; + break; + + case 's': + suppress_common_lines = 1; + break; + + case 't': + diffarg ("-t"); + break; + + case 'v': + printf ("sdiff %s\n%s\n\n%s\n\n%s\n", + version_string, copyright_string, + _(free_software_msgid), _(authorship_msgid)); + check_stdout (); + return EXIT_SUCCESS; + + case 'w': + diffarg ("-W"); + diffarg (optarg); + break; + + case 'W': + diffarg ("-w"); + break; + + case DIFF_PROGRAM_OPTION: + diffargv[0] = optarg; + break; + + case HELP_OPTION: + usage (); + check_stdout (); + return EXIT_SUCCESS; + + case STRIP_TRAILING_CR_OPTION: + diffarg ("--strip-trailing-cr"); + break; + + default: + try_help (0, 0); + } + } + + if (argc - optind != 2) + { + if (argc - optind < 2) + try_help ("missing operand after `%s'", argv[argc - 1]); + else + try_help ("extra operand `%s'", argv[optind + 2]); + } + + if (! output) + { + /* easy case: diff does everything for us */ + if (suppress_common_lines) + diffarg ("--suppress-common-lines"); + diffarg ("-y"); + diffarg ("--"); + diffarg (argv[optind]); + diffarg (argv[optind + 1]); + diffarg (0); + execvp (diffargv[0], (char **) diffargv); + perror_fatal (diffargv[0]); + } + else + { + char const *lname, *rname; + FILE *left, *right, *out, *diffout; + bool interact_ok; + struct line_filter lfilt; + struct line_filter rfilt; + struct line_filter diff_filt; + bool leftdir = diraccess (argv[optind]); + bool rightdir = diraccess (argv[optind + 1]); + + if (leftdir & rightdir) + fatal ("both files to be compared are directories"); + + lname = expand_name (argv[optind], leftdir, argv[optind + 1]); + left = ck_fopen (lname, "r"); + rname = expand_name (argv[optind + 1], rightdir, argv[optind]); + right = ck_fopen (rname, "r"); + out = ck_fopen (output, "w"); + + diffarg ("--sdiff-merge-assist"); + diffarg ("--"); + diffarg (argv[optind]); + diffarg (argv[optind + 1]); + diffarg (0); + + trapsigs (); + +#if ! (HAVE_WORKING_FORK || HAVE_WORKING_VFORK) + { + size_t cmdsize = 1; + char *p, *command; + int i; + + for (i = 0; diffargv[i]; i++) + cmdsize += quote_system_arg (0, diffargv[i]) + 1; + command = p = xmalloc (cmdsize); + for (i = 0; diffargv[i]; i++) + { + p += quote_system_arg (p, diffargv[i]); + *p++ = ' '; + } + p[-1] = 0; + errno = 0; + diffout = popen (command, "r"); + if (! diffout) + perror_fatal (command); + free (command); + } +#else + { + int diff_fds[2]; +# if HAVE_WORKING_VFORK + sigset_t procmask; + sigset_t blocked; +# endif + + if (pipe (diff_fds) != 0) + perror_fatal ("pipe"); + +# if HAVE_WORKING_VFORK + /* Block SIGINT and SIGPIPE. */ + sigemptyset (&blocked); + sigaddset (&blocked, SIGINT); + sigaddset (&blocked, SIGPIPE); + sigprocmask (SIG_BLOCK, &blocked, &procmask); +# endif + diffpid = vfork (); + if (diffpid < 0) + perror_fatal ("fork"); + if (! diffpid) + { + /* Alter the child's SIGINT and SIGPIPE handlers; + this may munge the parent. + The child ignores SIGINT in case the user interrupts the editor. + The child does not ignore SIGPIPE, even if the parent does. */ + if (initial_handler (handler_index_of_SIGINT) != SIG_IGN) + signal_handler (SIGINT, SIG_IGN); + signal_handler (SIGPIPE, SIG_DFL); +# if HAVE_WORKING_VFORK + /* Stop blocking SIGINT and SIGPIPE in the child. */ + sigprocmask (SIG_SETMASK, &procmask, 0); +# endif + close (diff_fds[0]); + if (diff_fds[1] != STDOUT_FILENO) + { + dup2 (diff_fds[1], STDOUT_FILENO); + close (diff_fds[1]); + } + + execvp (diffargv[0], (char **) diffargv); + _exit (errno == ENOEXEC ? 126 : 127); + } + +# if HAVE_WORKING_VFORK + /* Restore the parent's SIGINT and SIGPIPE behavior. */ + if (initial_handler (handler_index_of_SIGINT) != SIG_IGN) + signal_handler (SIGINT, catchsig); + if (initial_handler (handler_index_of_SIGPIPE) != SIG_IGN) + signal_handler (SIGPIPE, catchsig); + else + signal_handler (SIGPIPE, SIG_IGN); + + /* Stop blocking SIGINT and SIGPIPE in the parent. */ + sigprocmask (SIG_SETMASK, &procmask, 0); +# endif + + close (diff_fds[1]); + diffout = fdopen (diff_fds[0], "r"); + if (! diffout) + perror_fatal ("fdopen"); + } +#endif + + lf_init (&diff_filt, diffout); + lf_init (&lfilt, left); + lf_init (&rfilt, right); + + interact_ok = interact (&diff_filt, &lfilt, lname, &rfilt, rname, out); + + ck_fclose (left); + ck_fclose (right); + ck_fclose (out); + + { + int wstatus; + int werrno = 0; + +#if ! (HAVE_WORKING_FORK || HAVE_WORKING_VFORK) + wstatus = pclose (diffout); + if (wstatus == -1) + werrno = errno; +#else + ck_fclose (diffout); + while (waitpid (diffpid, &wstatus, 0) < 0) + if (errno == EINTR) + checksigs (); + else + perror_fatal ("waitpid"); + diffpid = 0; +#endif + + if (tmpname) + { + unlink (tmpname); + tmpname = 0; + } + + if (! interact_ok) + exiterr (); + + ck_editor_status (werrno, wstatus); + untrapsig (0); + checksigs (); + exit (WEXITSTATUS (wstatus)); + } + } + return EXIT_SUCCESS; /* Fool `-Wall'. */ +} + +static void +diffarg (char const *a) +{ + static size_t diffargs, diffarglim; + + if (diffargs == diffarglim) + { + if (! diffarglim) + diffarglim = 16; + else if (PTRDIFF_MAX / (2 * sizeof *diffargv) <= diffarglim) + xalloc_die (); + else + diffarglim *= 2; + diffargv = xrealloc (diffargv, diffarglim * sizeof *diffargv); + } + diffargv[diffargs++] = a; +} + + + + +/* Signal handling */ + +static bool volatile ignore_SIGINT; +static int volatile signal_received; +static bool sigs_trapped; + +static RETSIGTYPE +catchsig (int s) +{ +#if ! HAVE_SIGACTION + signal (s, SIG_IGN); +#endif + if (! (s == SIGINT && ignore_SIGINT)) + signal_received = s; +} + +#if HAVE_SIGACTION +static struct sigaction catchaction; + +static void +signal_handler (int sig, RETSIGTYPE (*handler) (int)) +{ + catchaction.sa_handler = handler; + sigaction (sig, &catchaction, 0); +} +#endif + +static void +trapsigs (void) +{ + int i; + +#if HAVE_SIGACTION + catchaction.sa_flags = SA_RESTART; + sigemptyset (&catchaction.sa_mask); + for (i = 0; i < NUM_SIGS; i++) + sigaddset (&catchaction.sa_mask, sigs[i]); +#endif + + for (i = 0; i < NUM_SIGS; i++) + { +#if HAVE_SIGACTION + sigaction (sigs[i], 0, &initial_action[i]); +#else + initial_action[i] = signal (sigs[i], SIG_IGN); +#endif + if (initial_handler (i) != SIG_IGN) + signal_handler (sigs[i], catchsig); + } + +#ifdef SIGCHLD + /* System V fork+wait does not work if SIGCHLD is ignored. */ + signal (SIGCHLD, SIG_DFL); +#endif + + sigs_trapped = 1; +} + +/* Untrap signal S, or all trapped signals if S is zero. */ +static void +untrapsig (int s) +{ + int i; + + if (sigs_trapped) + for (i = 0; i < NUM_SIGS; i++) + if ((! s || sigs[i] == s) && initial_handler (i) != SIG_IGN) +#if HAVE_SIGACTION + sigaction (sigs[i], &initial_action[i], 0); +#else + signal (sigs[i], initial_action[i]); +#endif +} + +/* Exit if a signal has been received. */ +static void +checksigs (void) +{ + int s = signal_received; + if (s) + { + cleanup (); + + /* Yield an exit status indicating that a signal was received. */ + untrapsig (s); + kill (getpid (), s); + + /* That didn't work, so exit with error status. */ + exit (EXIT_TROUBLE); + } +} + + +static void +give_help (void) +{ + fprintf (stderr, "%s", _("\ +ed:\tEdit then use both versions, each decorated with a header.\n\ +eb:\tEdit then use both versions.\n\ +el:\tEdit then use the left version.\n\ +er:\tEdit then use the right version.\n\ +e:\tEdit a new version.\n\ +l:\tUse the left version.\n\ +r:\tUse the right version.\n\ +s:\tSilently include common lines.\n\ +v:\tVerbosely include common lines.\n\ +q:\tQuit.\n\ +")); +} + +static int +skip_white (void) +{ + int c; + for (;;) + { + c = getchar (); + if (! ISSPACE (c) || c == '\n') + break; + checksigs (); + } + if (ferror (stdin)) + perror_fatal (_("read failed")); + return c; +} + +static void +flush_line (void) +{ + int c; + while ((c = getchar ()) != '\n' && c != EOF) + continue; + if (ferror (stdin)) + perror_fatal (_("read failed")); +} + + +/* interpret an edit command */ +static bool +edit (struct line_filter *left, char const *lname, lin lline, lin llen, + struct line_filter *right, char const *rname, lin rline, lin rlen, + FILE *outfile) +{ + for (;;) + { + int cmd0, cmd1; + bool gotcmd = 0; + + cmd1 = 0; /* Pacify `gcc -W'. */ + + while (! gotcmd) + { + if (putchar ('%') != '%') + perror_fatal (_("write failed")); + ck_fflush (stdout); + + cmd0 = skip_white (); + switch (cmd0) + { + case 'l': case 'r': case 's': case 'v': case 'q': + if (skip_white () != '\n') + { + give_help (); + flush_line (); + continue; + } + gotcmd = 1; + break; + + case 'e': + cmd1 = skip_white (); + switch (cmd1) + { + case 'b': case 'd': case 'l': case 'r': + if (skip_white () != '\n') + { + give_help (); + flush_line (); + continue; + } + gotcmd = 1; + break; + case '\n': + gotcmd = 1; + break; + default: + give_help (); + flush_line (); + continue; + } + break; + + case EOF: + if (feof (stdin)) + { + gotcmd = 1; + cmd0 = 'q'; + break; + } + /* Fall through. */ + default: + flush_line (); + /* Fall through. */ + case '\n': + give_help (); + continue; + } + } + + switch (cmd0) + { + case 'l': + lf_copy (left, llen, outfile); + lf_skip (right, rlen); + return 1; + case 'r': + lf_copy (right, rlen, outfile); + lf_skip (left, llen); + return 1; + case 's': + suppress_common_lines = 1; + break; + case 'v': + suppress_common_lines = 0; + break; + case 'q': + return 0; + case 'e': + { + int fd; + + if (tmpname) + tmp = fopen (tmpname, "w"); + else + { + if ((fd = temporary_file ()) < 0) + perror_fatal ("mkstemp"); + tmp = fdopen (fd, "w"); + } + + if (! tmp) + perror_fatal (tmpname); + + switch (cmd1) + { + case 'd': + if (llen) + { + if (llen == 1) + fprintf (tmp, "--- %s %ld\n", lname, (long) lline); + else + fprintf (tmp, "--- %s %ld,%ld\n", lname, + (long) lline, (long) (lline + llen - 1)); + } + /* Fall through. */ + case 'b': case 'l': + lf_copy (left, llen, tmp); + break; + + default: + lf_skip (left, llen); + break; + } + + switch (cmd1) + { + case 'd': + if (rlen) + { + if (rlen == 1) + fprintf (tmp, "+++ %s %ld\n", rname, (long) rline); + else + fprintf (tmp, "+++ %s %ld,%ld\n", rname, + (long) rline, (long) (rline + rlen - 1)); + } + /* Fall through. */ + case 'b': case 'r': + lf_copy (right, rlen, tmp); + break; + + default: + lf_skip (right, rlen); + break; + } + + ck_fclose (tmp); + + { + int wstatus; + int werrno = 0; + ignore_SIGINT = 1; + checksigs (); + + { +#if ! (HAVE_WORKING_FORK || HAVE_WORKING_VFORK) + char *command = + xmalloc (quote_system_arg (0, editor_program) + + 1 + strlen (tmpname) + 1); + sprintf (command + quote_system_arg (command, editor_program), + " %s", tmpname); + wstatus = system (command); + if (wstatus == -1) + werrno = errno; + free (command); +#else + pid_t pid; + + pid = vfork (); + if (pid == 0) + { + char const *argv[3]; + int i = 0; + + argv[i++] = editor_program; + argv[i++] = tmpname; + argv[i] = 0; + + execvp (editor_program, (char **) argv); + _exit (errno == ENOEXEC ? 126 : 127); + } + + if (pid < 0) + perror_fatal ("fork"); + + while (waitpid (pid, &wstatus, 0) < 0) + if (errno == EINTR) + checksigs (); + else + perror_fatal ("waitpid"); +#endif + } + + ignore_SIGINT = 0; + ck_editor_status (werrno, wstatus); + } + + { + char buf[SDIFF_BUFSIZE]; + size_t size; + tmp = ck_fopen (tmpname, "r"); + while ((size = ck_fread (buf, SDIFF_BUFSIZE, tmp)) != 0) + { + checksigs (); + ck_fwrite (buf, size, outfile); + } + ck_fclose (tmp); + } + return 1; + } + default: + give_help (); + break; + } + } +} + + + +/* Alternately reveal bursts of diff output and handle user commands. */ +static bool +interact (struct line_filter *diff, + struct line_filter *left, char const *lname, + struct line_filter *right, char const *rname, + FILE *outfile) +{ + lin lline = 1, rline = 1; + + for (;;) + { + char diff_help[256]; + int snarfed = lf_snarf (diff, diff_help, sizeof diff_help); + + if (snarfed <= 0) + return snarfed != 0; + + checksigs (); + + if (diff_help[0] == ' ') + puts (diff_help + 1); + else + { + char *numend; + uintmax_t val; + lin llen, rlen, lenmax; + errno = 0; + llen = val = strtoumax (diff_help + 1, &numend, 10); + if (llen < 0 || llen != val || errno || *numend != ',') + fatal (diff_help); + rlen = val = strtoumax (numend + 1, &numend, 10); + if (rlen < 0 || rlen != val || errno || *numend) + fatal (diff_help); + + lenmax = MAX (llen, rlen); + + switch (diff_help[0]) + { + case 'i': + if (suppress_common_lines) + lf_skip (diff, lenmax); + else + lf_copy (diff, lenmax, stdout); + + lf_copy (left, llen, outfile); + lf_skip (right, rlen); + break; + + case 'c': + lf_copy (diff, lenmax, stdout); + if (! edit (left, lname, lline, llen, + right, rname, rline, rlen, + outfile)) + return 0; + break; + + default: + fatal (diff_help); + } + + lline += llen; + rline += rlen; + } + } +} + +/* Return nonzero if DIR is an existing directory. */ +static bool +diraccess (char const *dir) +{ + struct stat buf; + return stat (dir, &buf) == 0 && S_ISDIR (buf.st_mode); +} + +#ifndef P_tmpdir +# define P_tmpdir "/tmp" +#endif +#ifndef TMPDIR_ENV +# define TMPDIR_ENV "TMPDIR" +#endif + +/* Open a temporary file and return its file descriptor. Put into + tmpname the address of a newly allocated buffer that holds the + file's name. Use the prefix "sdiff". */ +static int +temporary_file (void) +{ + char const *tmpdir = getenv (TMPDIR_ENV); + char const *dir = tmpdir ? tmpdir : P_tmpdir; + char *buf = xmalloc (strlen (dir) + 1 + 5 + 6 + 1); + int fd; + int e; + sigset_t procmask; + sigset_t blocked; + sprintf (buf, "%s/sdiffXXXXXX", dir); + sigemptyset (&blocked); + sigaddset (&blocked, SIGINT); + sigprocmask (SIG_BLOCK, &blocked, &procmask); + fd = mkstemp (buf); + e = errno; + if (0 <= fd) + tmpname = buf; + sigprocmask (SIG_SETMASK, &procmask, 0); + errno = e; + return fd; +} diff --git a/gnu/dist/diffutils/src/side.c b/gnu/dist/diffutils/src/side.c new file mode 100644 index 00000000000..1ad8c4ec86e --- /dev/null +++ b/gnu/dist/diffutils/src/side.c @@ -0,0 +1,285 @@ +/* $NetBSD: side.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* sdiff-format output routines for GNU DIFF. + + Copyright (C) 1991, 1992, 1993, 1998, 2001, 2002 Free Software + Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. No author or distributor + accepts responsibility to anyone for the consequences of using it + or for whether it serves any particular purpose or works at all, + unless he says so in writing. Refer to the GNU DIFF General Public + License for full details. + + Everyone is granted permission to copy, modify and redistribute + GNU DIFF, but only under the conditions described in the + GNU DIFF General Public License. A copy of this license is + supposed to have been given to you along with GNU DIFF so you + can know your rights and responsibilities. It should be in a + file named COPYING. Among other things, the copyright notice + and this notice must be preserved on all copies. */ + +#include "diff.h" + +static void print_sdiff_common_lines (lin, lin); +static void print_sdiff_hunk (struct change *); + +/* Next line number to be printed in the two input files. */ +static lin next0, next1; + +/* Print the edit-script SCRIPT as a sdiff style output. */ + +void +print_sdiff_script (struct change *script) +{ + begin_output (); + + next0 = next1 = - files[0].prefix_lines; + print_script (script, find_change, print_sdiff_hunk); + + print_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines); +} + +/* Tab from column FROM to column TO, where FROM <= TO. Yield TO. */ + +static unsigned int +tab_from_to (unsigned int from, unsigned int to) +{ + FILE *out = outfile; + unsigned int tab; + + if (!expand_tabs) + for (tab = from + TAB_WIDTH - from % TAB_WIDTH; tab <= to; tab += TAB_WIDTH) + { + putc ('\t', out); + from = tab; + } + while (from++ < to) + putc (' ', out); + return to; +} + +/* + * Print the text for half an sdiff line. This means truncate to width + * observing tabs, and trim a trailing newline. Returns the last column + * written (not the number of chars). + */ +static unsigned int +print_half_line (char const *const *line, unsigned int indent, + unsigned int out_bound) +{ + FILE *out = outfile; + register unsigned int in_position = 0; + register unsigned int out_position = 0; + register char const *text_pointer = line[0]; + register char const *text_limit = line[1]; + + while (text_pointer < text_limit) + { + register unsigned char c = *text_pointer++; + + switch (c) + { + case '\t': + { + unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH; + if (in_position == out_position) + { + unsigned int tabstop = out_position + spaces; + if (expand_tabs) + { + if (out_bound < tabstop) + tabstop = out_bound; + for (; out_position < tabstop; out_position++) + putc (' ', out); + } + else + if (tabstop < out_bound) + { + out_position = tabstop; + putc (c, out); + } + } + in_position += spaces; + } + break; + + case '\r': + { + putc (c, out); + tab_from_to (0, indent); + in_position = out_position = 0; + } + break; + + case '\b': + if (in_position != 0 && --in_position < out_bound) + { + if (out_position <= in_position) + /* Add spaces to make up for suppressed tab past out_bound. */ + for (; out_position < in_position; out_position++) + putc (' ', out); + else + { + out_position = in_position; + putc (c, out); + } + } + break; + + case '\f': + case '\v': + control_char: + if (in_position < out_bound) + putc (c, out); + break; + + default: + if (! ISPRINT (c)) + goto control_char; + /* falls through */ + case ' ': + if (in_position++ < out_bound) + { + out_position = in_position; + putc (c, out); + } + break; + + case '\n': + return out_position; + } + } + + return out_position; +} + +/* + * Print side by side lines with a separator in the middle. + * 0 parameters are taken to indicate white space text. + * Blank lines that can easily be caught are reduced to a single newline. + */ + +static void +print_1sdiff_line (char const *const *left, char sep, + char const *const *right) +{ + FILE *out = outfile; + unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset; + unsigned int col = 0; + bool put_newline = 0; + + if (left) + { + put_newline |= left[1][-1] == '\n'; + col = print_half_line (left, 0, hw); + } + + if (sep != ' ') + { + col = tab_from_to (col, (hw + c2o - 1) / 2) + 1; + if (sep == '|' && put_newline != (right[1][-1] == '\n')) + sep = put_newline ? '/' : '\\'; + putc (sep, out); + } + + if (right) + { + put_newline |= right[1][-1] == '\n'; + if (**right != '\n') + { + col = tab_from_to (col, c2o); + print_half_line (right, col, hw); + } + } + + if (put_newline) + putc ('\n', out); +} + +/* Print lines common to both files in side-by-side format. */ +static void +print_sdiff_common_lines (lin limit0, lin limit1) +{ + lin i0 = next0, i1 = next1; + + if (!suppress_common_lines && (i0 != limit0 || i1 != limit1)) + { + if (sdiff_merge_assist) + { + long len0 = limit0 - i0; + long len1 = limit1 - i1; + fprintf (outfile, "i%ld,%ld\n", len0, len1); + } + + if (!left_column) + { + while (i0 != limit0 && i1 != limit1) + print_1sdiff_line (&files[0].linbuf[i0++], ' ', + &files[1].linbuf[i1++]); + while (i1 != limit1) + print_1sdiff_line (0, ')', &files[1].linbuf[i1++]); + } + while (i0 != limit0) + print_1sdiff_line (&files[0].linbuf[i0++], '(', 0); + } + + next0 = limit0; + next1 = limit1; +} + +/* Print a hunk of an sdiff diff. + This is a contiguous portion of a complete edit script, + describing changes in consecutive lines. */ + +static void +print_sdiff_hunk (struct change *hunk) +{ + lin first0, last0, first1, last1; + register lin i, j; + + /* Determine range of line numbers involved in each file. */ + enum changes changes = + analyze_hunk (hunk, &first0, &last0, &first1, &last1); + if (!changes) + return; + + /* Print out lines up to this change. */ + print_sdiff_common_lines (first0, first1); + + if (sdiff_merge_assist) + { + long len0 = last0 - first0 + 1; + long len1 = last1 - first1 + 1; + fprintf (outfile, "c%ld,%ld\n", len0, len1); + } + + /* Print ``xxx | xxx '' lines */ + if (changes == CHANGED) + { + for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++) + print_1sdiff_line (&files[0].linbuf[i], '|', &files[1].linbuf[j]); + changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0); + next0 = first0 = i; + next1 = first1 = j; + } + + /* Print `` > xxx '' lines */ + if (changes & NEW) + { + for (j = first1; j <= last1; ++j) + print_1sdiff_line (0, '>', &files[1].linbuf[j]); + next1 = j; + } + + /* Print ``xxx < '' lines */ + if (changes & OLD) + { + for (i = first0; i <= last0; ++i) + print_1sdiff_line (&files[0].linbuf[i], '<', 0); + next0 = i; + } +} diff --git a/gnu/dist/diffutils/src/system.h b/gnu/dist/diffutils/src/system.h new file mode 100644 index 00000000000..0fa5e58b4fd --- /dev/null +++ b/gnu/dist/diffutils/src/system.h @@ -0,0 +1,403 @@ +/* $NetBSD: system.h,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +/* System dependent declarations. + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include <config.h> + +/* Don't bother to support K&R C compilers any more; it's not worth + the trouble. These macros prevent some library modules from being + compiled in K&R C mode. */ +#define PARAMS(Args) Args +#define PROTOTYPES 1 + +/* Define `__attribute__' and `volatile' first + so that they're used consistently in all system includes. */ +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__ +# define __attribute__(x) +#endif +#if defined const && !defined volatile +# define volatile +#endif + +/* Verify a requirement at compile-time (unlike assert, which is runtime). */ +#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } + + +/* Determine whether an integer type is signed, and its bounds. + This code assumes two's (or one's!) complement with no holes. */ + +/* The extra casts work around common compiler bugs, + e.g. Cray C 5.0.3.0 when t == time_t. */ +#ifndef TYPE_SIGNED +# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) +#endif +#ifndef TYPE_MINIMUM +# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \ + ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \ + : (t) 0)) +#endif +#ifndef TYPE_MAXIMUM +# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t))) +#endif + +#include <sys/types.h> +#include <sys/stat.h> + +#if STAT_MACROS_BROKEN +# undef S_ISBLK +# undef S_ISCHR +# undef S_ISDIR +# undef S_ISFIFO +# undef S_ISREG +# undef S_ISSOCK +#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 +#if !defined S_ISBLK && defined S_IFBLK +# define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) +#endif +#if !defined S_ISCHR && defined S_IFCHR +# define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) +#endif +#if !defined S_ISFIFO && defined S_IFFIFO +# define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO) +#endif +#if !defined S_ISSOCK && defined S_IFSOCK +# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) +#endif +#ifndef S_IXUSR +# define S_IXUSR 0100 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0010 +#endif +#ifndef S_IXOTH +# define S_IXOTH 0001 +#endif + +#if HAVE_UNISTD_H +# include <unistd.h> +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 +#endif +#ifndef SEEK_CUR +# define SEEK_CUR 1 +#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 + +#if HAVE_TIME_H +# include <time.h> +#else +# include <sys/time.h> +#endif + +#if HAVE_FCNTL_H +# include <fcntl.h> +#else +# if HAVE_SYS_FILE_H +# include <sys/file.h> +# endif +#endif + +#if !HAVE_DUP2 +# define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t)) +#endif + +#ifndef O_RDONLY +# define O_RDONLY 0 +#endif +#ifndef O_RDWR +# define O_RDWR 2 +#endif +#ifndef S_IRUSR +# define S_IRUSR 0400 +#endif +#ifndef S_IWUSR +# define S_IWUSR 0200 +#endif + +#if HAVE_SYS_WAIT_H +# include <sys/wait.h> +#endif +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +#ifndef STAT_BLOCKSIZE +# if HAVE_STRUCT_STAT_ST_BLKSIZE +# define STAT_BLOCKSIZE(s) ((s).st_blksize) +# else +# define STAT_BLOCKSIZE(s) (8 * 1024) +# endif +#endif + +#if HAVE_DIRENT_H +# include <dirent.h> +# define NAMLEN(dirent) strlen ((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) ((dirent)->d_namlen) +# if HAVE_SYS_NDIR_H +# include <sys/ndir.h> +# endif +# if HAVE_SYS_DIR_H +# include <sys/dir.h> +# endif +# if HAVE_NDIR_H +# include <ndir.h> +# endif +#endif + +#if HAVE_STDLIB_H +# include <stdlib.h> +#else +# ifndef getenv + char *getenv (); +# endif +#endif +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#if !EXIT_FAILURE +# undef EXIT_FAILURE /* Sony NEWS-OS 4.0C defines EXIT_FAILURE to 0. */ +# define EXIT_FAILURE 1 +#endif +#define EXIT_TROUBLE 2 + +#include <limits.h> +#ifndef SSIZE_MAX +# define SSIZE_MAX TYPE_MAXIMUM (ssize_t) +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifndef PTRDIFF_MAX +# define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t) +#endif +#ifndef SIZE_MAX +# define SIZE_MAX TYPE_MAXIMUM (size_t) +#endif +#ifndef UINTMAX_MAX +# define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t) +#endif +#if ! HAVE_STRTOUMAX && ! defined strtoumax +uintmax_t strtoumax (char const *, char **, int); +#endif + +#include <stddef.h> + +#if STDC_HEADERS || HAVE_STRING_H +# include <string.h> +#else +# if !HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr (), *strrchr (); +# if !HAVE_MEMCHR +# define memcmp(s1, s2, n) bcmp (s1, s2, n) +# define memcpy(d, s, n) bcopy (s, d, n) +void *memchr (); +# endif +#endif + +#if HAVE_LOCALE_H +# include <locale.h> +#else +# define setlocale(category, locale) +#endif + +#include <gettext.h> + +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#include <ctype.h> + +/* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given + as an argument to <ctype.h> macros like `isspace'. */ +#if STDC_HEADERS +# define CTYPE_DOMAIN(c) 1 +#else +# define CTYPE_DOMAIN(c) ((unsigned int) (c) <= 0177) +#endif +#define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c)) +#define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c)) + +#if STDC_HEADERS +# define TOLOWER(c) tolower (c) +#else +# ifndef _tolower +# define _tolower(c) tolower (c) +# endif +# define TOLOWER(c) (CTYPE_DOMAIN (c) && isupper (c) ? _tolower (c) : (c)) +#endif + +/* ISDIGIT differs from isdigit, as follows: + - Its arg may be any int or unsigned int; it need not be an unsigned char. + - It's guaranteed to evaluate its argument exactly once. + - It's typically faster. + POSIX 1003.1-2001 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) + +#include <errno.h> +#if !STDC_HEADERS + extern int errno; +#endif + +#include <signal.h> +#ifndef SA_RESTART +# ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */ +# define SA_RESTART SA_INTERRUPT +# else +# define SA_RESTART 0 +# endif +#endif +#if !defined SIGCHLD && defined SIGCLD +# define SIGCHLD SIGCLD +#endif + +#undef MIN +#undef MAX +#define MIN(a, b) ((a) <= (b) ? (a) : (b)) +#define MAX(a, b) ((a) >= (b) ? (a) : (b)) + +#if HAVE_STDBOOL_H +# include <stdbool.h> +#else +# define bool unsigned char +#endif + +#if HAVE_VFORK_H +# include <vfork.h> +#endif + +#if ! HAVE_WORKING_VFORK +# define vfork fork +#endif + +/* Type used for fast comparison of several bytes at a time. */ + +#ifndef word +# define word uintmax_t +#endif + +/* The integer type of a line number. Since files are read into main + memory, ptrdiff_t should be wide enough. */ + +typedef ptrdiff_t lin; +#define LIN_MAX PTRDIFF_MAX +verify (lin_is_signed, TYPE_SIGNED (lin)); +verify (lin_is_wide_enough, sizeof (ptrdiff_t) <= sizeof (lin)); +verify (lin_is_printable_as_long, sizeof (lin) <= sizeof (long)); + +/* This section contains POSIX-compliant defaults for macros + that are meant to be overridden by hand in config.h as needed. */ + +#ifndef file_name_cmp +# define file_name_cmp strcmp +#endif + +#ifndef initialize_main +# define initialize_main(argcp, argvp) +#endif + +#ifndef NULL_DEVICE +# define NULL_DEVICE "/dev/null" +#endif + +/* Do struct stat *S, *T describe the same special file? */ +#ifndef same_special_file +# if HAVE_ST_RDEV && defined S_ISBLK && defined S_ISCHR +# define same_special_file(s, t) \ + (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \ + || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \ + && (s)->st_rdev == (t)->st_rdev) +# else +# define same_special_file(s, t) 0 +# endif +#endif + +/* Do struct stat *S, *T describe the same file? Answer -1 if unknown. */ +#ifndef same_file +# define same_file(s, t) \ + ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \ + || same_special_file (s, t)) +#endif + +/* Do struct stat *S, *T have the same file attributes? + + POSIX says that two files are identical if st_ino and st_dev are + the same, but many filesystems incorrectly assign the same (device, + inode) pair to two distinct files, including: + + - GNU/Linux NFS servers that export all local filesystems as a + single NFS filesystem, if a local device number (st_dev) exceeds + 255, or if a local inode number (st_ino) exceeds 16777215. + + - Network Appliance NFS servers in snapshot directories; see + Network Appliance bug #195. + + - ClearCase MVFS; see bug id ATRia04618. + + Check whether two files that purport to be the same have the same + attributes, to work around instances of this common bug. Do not + inspect all attributes, only attributes useful in checking for this + bug. + + It's possible for two distinct files on a buggy filesystem to have + the same attributes, but it's not worth slowing down all + implementations (or complicating the configuration) to cater to + these rare cases in buggy implementations. */ + +#ifndef same_file_attributes +# define same_file_attributes(s, t) \ + ((s)->st_mode == (t)->st_mode \ + && (s)->st_nlink == (t)->st_nlink \ + && (s)->st_uid == (t)->st_uid \ + && (s)->st_gid == (t)->st_gid \ + && (s)->st_size == (t)->st_size \ + && (s)->st_mtime == (t)->st_mtime \ + && (s)->st_ctime == (t)->st_ctime) +#endif diff --git a/gnu/dist/diffutils/src/util.c b/gnu/dist/diffutils/src/util.c new file mode 100644 index 00000000000..0208c7efb18 --- /dev/null +++ b/gnu/dist/diffutils/src/util.c @@ -0,0 +1,758 @@ +/* $NetBSD: util.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */ + +/* Support routines for GNU DIFF. + + Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of GNU DIFF. + + GNU DIFF is free software; you can redistribute it and/or modify + it under the 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 DIFF is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include "diff.h" +#include <dirname.h> +#include <error.h> +#include <quotesys.h> +#include <regex.h> +#include <xalloc.h> + +char const pr_program[] = PR_PROGRAM; + +/* Queue up one-line messages to be printed at the end, + when -l is specified. Each message is recorded with a `struct msg'. */ + +struct msg +{ + struct msg *next; + char args[1]; /* Format + 4 args, each '\0' terminated, concatenated. */ +}; + +/* Head of the chain of queues messages. */ + +static struct msg *msg_chain; + +/* Tail of the chain of queues messages. */ + +static struct msg **msg_chain_end = &msg_chain; + +/* Use when a system call returns non-zero status. + NAME should normally be the file name. */ + +void +perror_with_name (char const *name) +{ + error (0, errno, "%s", name); +} + +/* Use when a system call returns non-zero status and that is fatal. */ + +void +pfatal_with_name (char const *name) +{ + int e = errno; + print_message_queue (); + error (EXIT_TROUBLE, e, "%s", name); + abort (); +} + +/* Print an error message containing MSGID, then exit. */ + +void +fatal (char const *msgid) +{ + print_message_queue (); + error (EXIT_TROUBLE, 0, "%s", _(msgid)); + abort (); +} + +/* Like printf, except if -l in effect then save the message and print later. + This is used for things like "Only in ...". */ + +void +message (char const *format_msgid, char const *arg1, char const *arg2) +{ + message5 (format_msgid, arg1, arg2, 0, 0); +} + +void +message5 (char const *format_msgid, char const *arg1, char const *arg2, + char const *arg3, char const *arg4) +{ + if (paginate) + { + char *p; + char const *arg[5]; + int i; + size_t size[5]; + size_t total_size = offsetof (struct msg, args); + struct msg *new; + + arg[0] = format_msgid; + arg[1] = arg1; + arg[2] = arg2; + arg[3] = arg3 ? arg3 : ""; + arg[4] = arg4 ? arg4 : ""; + + for (i = 0; i < 5; i++) + total_size += size[i] = strlen (arg[i]) + 1; + + new = xmalloc (total_size); + + for (i = 0, p = new->args; i < 5; p += size[i++]) + memcpy (p, arg[i], size[i]); + + *msg_chain_end = new; + new->next = 0; + msg_chain_end = &new->next; + } + else + { + if (sdiff_merge_assist) + putchar (' '); + printf (_(format_msgid), arg1, arg2, arg3, arg4); + } +} + +/* Output all the messages that were saved up by calls to `message'. */ + +void +print_message_queue (void) +{ + char const *arg[5]; + int i; + struct msg *m = msg_chain; + + while (m) + { + struct msg *next = m->next; + arg[0] = m->args; + for (i = 0; i < 4; i++) + arg[i + 1] = arg[i] + strlen (arg[i]) + 1; + printf (_(arg[0]), arg[1], arg[2], arg[3], arg[4]); + free (m); + m = next; + } +} + +/* Call before outputting the results of comparing files NAME0 and NAME1 + to set up OUTFILE, the stdio stream for the output to go to. + + Usually, OUTFILE is just stdout. But when -l was specified + we fork off a `pr' and make OUTFILE a pipe to it. + `pr' then outputs to our stdout. */ + +static char const *current_name0; +static char const *current_name1; +static bool currently_recursive; + +void +setup_output (char const *name0, char const *name1, bool recursive) +{ + current_name0 = name0; + current_name1 = name1; + currently_recursive = recursive; + outfile = 0; +} + +#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK +static pid_t pr_pid; +#endif + +void +begin_output (void) +{ + char *name; + + if (outfile != 0) + return; + + /* Construct the header of this piece of diff. */ + name = xmalloc (strlen (current_name0) + strlen (current_name1) + + strlen (switch_string) + 7); + + /* POSIX 1003.1-2001 specifies this format. But there are some bugs in + the standard: it says that we must print only the last component + of the pathnames, and it requires two spaces after "diff" if + there are no options. These requirements are silly and do not + match historical practice. */ + sprintf (name, "diff%s %s %s", switch_string, current_name0, current_name1); + + if (paginate) + { + if (fflush (stdout) != 0) + pfatal_with_name (_("write failed")); + + /* Make OUTFILE a pipe to a subsidiary `pr'. */ + { +#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK + int pipes[2]; + + if (pipe (pipes) != 0) + pfatal_with_name ("pipe"); + + pr_pid = vfork (); + if (pr_pid < 0) + pfatal_with_name ("fork"); + + if (pr_pid == 0) + { + close (pipes[1]); + if (pipes[0] != STDIN_FILENO) + { + if (dup2 (pipes[0], STDIN_FILENO) < 0) + pfatal_with_name ("dup2"); + close (pipes[0]); + } + + execl (pr_program, pr_program, "-h", name, 0); + _exit (errno == ENOEXEC ? 126 : 127); + } + else + { + close (pipes[0]); + outfile = fdopen (pipes[1], "w"); + if (!outfile) + pfatal_with_name ("fdopen"); + } +#else + char *command = xmalloc (sizeof pr_program - 1 + 7 + + quote_system_arg ((char *) 0, name) + 1); + char *p; + sprintf (command, "%s -f -h ", pr_program); + p = command + sizeof pr_program - 1 + 7; + p += quote_system_arg (p, name); + *p = 0; + errno = 0; + outfile = popen (command, "w"); + if (!outfile) + pfatal_with_name (command); + free (command); +#endif + } + } + else + { + + /* If -l was not specified, output the diff straight to `stdout'. */ + + outfile = stdout; + + /* If handling multiple files (because scanning a directory), + print which files the following output is about. */ + if (currently_recursive) + printf ("%s\n", name); + } + + free (name); + + /* A special header is needed at the beginning of context output. */ + switch (output_style) + { + case OUTPUT_CONTEXT: + print_context_header (files, 0); + break; + + case OUTPUT_UNIFIED: + print_context_header (files, 1); + break; + + default: + break; + } +} + +/* Call after the end of output of diffs for one file. + Close OUTFILE and get rid of the `pr' subfork. */ + +void +finish_output (void) +{ + if (outfile != 0 && outfile != stdout) + { + int wstatus; + int werrno = 0; + if (ferror (outfile)) + fatal ("write failed"); +#if ! (HAVE_WORKING_FORK || HAVE_WORKING_VFORK) + wstatus = pclose (outfile); + if (wstatus == -1) + werrno = errno; +#else + if (fclose (outfile) != 0) + pfatal_with_name (_("write failed")); + if (waitpid (pr_pid, &wstatus, 0) < 0) + pfatal_with_name ("waitpid"); +#endif + if (! werrno && WIFEXITED (wstatus) && WEXITSTATUS (wstatus) == 127) + error (EXIT_TROUBLE, 0, _("subsidiary program `%s' not found"), + pr_program); + if (wstatus != 0) + error (EXIT_TROUBLE, werrno, _("subsidiary program `%s' failed"), + pr_program); + } + + outfile = 0; +} + +/* Compare two lines (typically one from each input file) + according to the command line options. + For efficiency, this is invoked only when the lines do not match exactly + but an option like -i might cause us to ignore the difference. + Return nonzero if the lines differ. */ + +bool +lines_differ (char const *s1, char const *s2) +{ + register unsigned char const *t1 = (unsigned char const *) s1; + register unsigned char const *t2 = (unsigned char const *) s2; + size_t column = 0; + + while (1) + { + register unsigned char c1 = *t1++; + register unsigned char c2 = *t2++; + + /* Test for exact char equality first, since it's a common case. */ + if (c1 != c2) + { + switch (ignore_white_space) + { + case IGNORE_ALL_SPACE: + /* For -w, just skip past any white space. */ + while (ISSPACE (c1) && c1 != '\n') c1 = *t1++; + while (ISSPACE (c2) && c2 != '\n') c2 = *t2++; + break; + + case IGNORE_SPACE_CHANGE: + /* For -b, advance past any sequence of white space in + line 1 and consider it just one space, or nothing at + all if it is at the end of the line. */ + if (ISSPACE (c1)) + { + while (c1 != '\n') + { + c1 = *t1++; + if (! ISSPACE (c1)) + { + --t1; + c1 = ' '; + break; + } + } + } + + /* Likewise for line 2. */ + if (ISSPACE (c2)) + { + while (c2 != '\n') + { + c2 = *t2++; + if (! ISSPACE (c2)) + { + --t2; + c2 = ' '; + break; + } + } + } + + if (c1 != c2) + { + /* If we went too far when doing the simple test + for equality, go back to the first non-white-space + character in both sides and try again. */ + if (c2 == ' ' && c1 != '\n' + && (unsigned char const *) s1 + 1 < t1 + && ISSPACE (t1[-2])) + { + --t1; + continue; + } + if (c1 == ' ' && c2 != '\n' + && (unsigned char const *) s2 + 1 < t2 + && ISSPACE (t2[-2])) + { + --t2; + continue; + } + } + + break; + + case IGNORE_TAB_EXPANSION: + if ((c1 == ' ' && c2 == '\t') + || (c1 == '\t' && c2 == ' ')) + { + size_t column2 = column; + for (;; c1 = *t1++) + { + if (c1 == ' ') + column++; + else if (c1 == '\t') + column += TAB_WIDTH - column % TAB_WIDTH; + else + break; + } + for (;; c2 = *t2++) + { + if (c2 == ' ') + column2++; + else if (c2 == '\t') + column2 += TAB_WIDTH - column2 % TAB_WIDTH; + else + break; + } + if (column != column2) + return 1; + } + break; + + case IGNORE_NO_WHITE_SPACE: + break; + } + + /* Lowercase all letters if -i is specified. */ + + if (ignore_case) + { + c1 = TOLOWER (c1); + c2 = TOLOWER (c2); + } + + if (c1 != c2) + break; + } + if (c1 == '\n') + return 0; + + column += c1 == '\t' ? TAB_WIDTH - column % TAB_WIDTH : 1; + } + + return 1; +} + +/* Find the consecutive changes at the start of the script START. + Return the last link before the first gap. */ + +struct change * +find_change (struct change *start) +{ + return start; +} + +struct change * +find_reverse_change (struct change *start) +{ + return start; +} + +/* Divide SCRIPT into pieces by calling HUNKFUN and + print each piece with PRINTFUN. + Both functions take one arg, an edit script. + + HUNKFUN is called with the tail of the script + and returns the last link that belongs together with the start + of the tail. + + PRINTFUN takes a subscript which belongs together (with a null + link at the end) and prints it. */ + +void +print_script (struct change *script, + struct change * (*hunkfun) (struct change *), + void (*printfun) (struct change *)) +{ + struct change *next = script; + + while (next) + { + struct change *this, *end; + + /* Find a set of changes that belong together. */ + this = next; + end = (*hunkfun) (next); + + /* Disconnect them from the rest of the changes, + making them a hunk, and remember the rest for next iteration. */ + next = end->link; + end->link = 0; +#ifdef DEBUG + debug_script (this); +#endif + + /* Print this hunk. */ + (*printfun) (this); + + /* Reconnect the script so it will all be freed properly. */ + end->link = next; + } +} + +/* Print the text of a single line LINE, + flagging it with the characters in LINE_FLAG (which say whether + the line is inserted, deleted, changed, etc.). */ + +void +print_1_line (char const *line_flag, char const *const *line) +{ + char const *base = line[0], *limit = line[1]; /* Help the compiler. */ + FILE *out = outfile; /* Help the compiler some more. */ + char const *flag_format = 0; + + /* If -T was specified, use a Tab between the line-flag and the text. + Otherwise use a Space (as Unix diff does). + Print neither space nor tab if line-flags are empty. */ + + if (line_flag && *line_flag) + { + flag_format = initial_tab ? "%s\t" : "%s "; + fprintf (out, flag_format, line_flag); + } + + output_1_line (base, limit, flag_format, line_flag); + + if ((!line_flag || line_flag[0]) && limit[-1] != '\n') + fprintf (out, "\n\\ %s\n", _("No newline at end of file")); +} + +/* Output a line from BASE up to LIMIT. + With -t, expand white space characters to spaces, and if FLAG_FORMAT + is nonzero, output it with argument LINE_FLAG after every + internal carriage return, so that tab stops continue to line up. */ + +void +output_1_line (char const *base, char const *limit, char const *flag_format, + char const *line_flag) +{ + if (!expand_tabs) + fwrite (base, limit - base, 1, outfile); + else + { + register FILE *out = outfile; + register unsigned char c; + register char const *t = base; + register unsigned int column = 0; + + while (t < limit) + switch ((c = *t++)) + { + case '\t': + { + unsigned int spaces = TAB_WIDTH - column % TAB_WIDTH; + column += spaces; + do + putc (' ', out); + while (--spaces); + } + break; + + case '\r': + putc (c, out); + if (flag_format && t < limit && *t != '\n') + fprintf (out, flag_format, line_flag); + column = 0; + break; + + case '\b': + if (column == 0) + continue; + column--; + putc (c, out); + break; + + default: + if (ISPRINT (c)) + column++; + putc (c, out); + break; + } + } +} + +char const change_letter[] = { 0, 'd', 'a', 'c' }; + +/* Translate an internal line number (an index into diff's table of lines) + into an actual line number in the input file. + The internal line number is I. FILE points to the data on the file. + + Internal line numbers count from 0 starting after the prefix. + Actual line numbers count from 1 within the entire file. */ + +lin +translate_line_number (struct file_data const *file, lin i) +{ + return i + file->prefix_lines + 1; +} + +/* Translate a line number range. This is always done for printing, + so for convenience translate to long rather than lin, so that the + caller can use printf with "%ld" without casting. */ + +void +translate_range (struct file_data const *file, + lin a, lin b, + long *aptr, long *bptr) +{ + *aptr = translate_line_number (file, a - 1) + 1; + *bptr = translate_line_number (file, b + 1) - 1; +} + +/* Print a pair of line numbers with SEPCHAR, translated for file FILE. + If the two numbers are identical, print just one number. + + Args A and B are internal line numbers. + We print the translated (real) line numbers. */ + +void +print_number_range (char sepchar, struct file_data *file, lin a, lin b) +{ + long trans_a, trans_b; + translate_range (file, a, b, &trans_a, &trans_b); + + /* Note: we can have B < A in the case of a range of no lines. + In this case, we should print the line number before the range, + which is B. */ + if (trans_b > trans_a) + fprintf (outfile, "%ld%c%ld", trans_a, sepchar, trans_b); + else + fprintf (outfile, "%ld", trans_b); +} + +/* Look at a hunk of edit script and report the range of lines in each file + that it applies to. HUNK is the start of the hunk, which is a chain + of `struct change'. The first and last line numbers of file 0 are stored in + *FIRST0 and *LAST0, and likewise for file 1 in *FIRST1 and *LAST1. + Note that these are internal line numbers that count from 0. + + If no lines from file 0 are deleted, then FIRST0 is LAST0+1. + + Return UNCHANGED if only ignorable lines are inserted or deleted, + OLD if lines of file 0 are deleted, + NEW if lines of file 1 are inserted, + and CHANGED if both kinds of changes are found. */ + +enum changes +analyze_hunk (struct change *hunk, + lin *first0, lin *last0, + lin *first1, lin *last1) +{ + struct change *next; + lin l0, l1; + lin show_from, show_to; + lin i; + bool trivial = ignore_blank_lines || ignore_regexp.fastmap; + size_t trivial_length = (int) ignore_blank_lines - 1; + /* If 0, ignore zero-length lines; + if SIZE_MAX, do not ignore lines just because of their length. */ + + char const * const *linbuf0 = files[0].linbuf; /* Help the compiler. */ + char const * const *linbuf1 = files[1].linbuf; + + show_from = show_to = 0; + + *first0 = hunk->line0; + *first1 = hunk->line1; + + next = hunk; + do + { + l0 = next->line0 + next->deleted - 1; + l1 = next->line1 + next->inserted - 1; + show_from += next->deleted; + show_to += next->inserted; + + for (i = next->line0; i <= l0 && trivial; i++) + { + char const *line = linbuf0[i]; + size_t len = linbuf0[i + 1] - line - 1; + if (len != trivial_length + && (! ignore_regexp.fastmap + || re_search (&ignore_regexp, line, len, 0, len, 0) < 0)) + trivial = 0; + } + + for (i = next->line1; i <= l1 && trivial; i++) + { + char const *line = linbuf1[i]; + size_t len = linbuf1[i + 1] - line - 1; + if (len != trivial_length + && (! ignore_regexp.fastmap + || re_search (&ignore_regexp, line, len, 0, len, 0) < 0)) + trivial = 0; + } + } + while ((next = next->link) != 0); + + *last0 = l0; + *last1 = l1; + + /* If all inserted or deleted lines are ignorable, + tell the caller to ignore this hunk. */ + + if (trivial) + return UNCHANGED; + + return (show_from ? OLD : UNCHANGED) | (show_to ? NEW : UNCHANGED); +} + +/* Concatenate three strings, returning a newly malloc'd string. */ + +char * +concat (char const *s1, char const *s2, char const *s3) +{ + char *new = xmalloc (strlen (s1) + strlen (s2) + strlen (s3) + 1); + sprintf (new, "%s%s%s", s1, s2, s3); + return new; +} + +/* Yield a new block of SIZE bytes, initialized to zero. */ + +void * +zalloc (size_t size) +{ + void *p = xmalloc (size); + memset (p, 0, size); + return p; +} + +/* Yield the newly malloc'd pathname + of the file in DIR whose filename is FILE. */ + +char * +dir_file_pathname (char const *dir, char const *file) +{ + char const *base = base_name (dir); + bool omit_slash = !*base || base[strlen (base) - 1] == '/'; + return concat (dir, "/" + omit_slash, file); +} + +void +debug_script (struct change *sp) +{ + fflush (stdout); + + for (; sp; sp = sp->link) + { + long line0 = sp->line0; + long line1 = sp->line1; + long deleted = sp->deleted; + long inserted = sp->inserted; + fprintf (stderr, "%3ld %3ld delete %ld insert %ld\n", + line0, line1, deleted, inserted); + } + + fflush (stderr); +} diff --git a/gnu/dist/diffutils/src/version.c b/gnu/dist/diffutils/src/version.c new file mode 100644 index 00000000000..b3cc515c7cd --- /dev/null +++ b/gnu/dist/diffutils/src/version.c @@ -0,0 +1,4 @@ +/* $NetBSD: version.c,v 1.1.1.1 2003/01/26 00:43:16 wiz Exp $ */ + +#include <config.h> +char const version_string[] = "(GNU diffutils) 2.8.1"; |
