Page MenuHomeFreeBSD

D46878.diff
No OneTemporary

D46878.diff

This file is larger than 256 KB, so syntax highlighting was skipped.
Index: contrib/diff/ABOUT-NLS
===================================================================
--- contrib/diff/ABOUT-NLS
+++ /dev/null
@@ -1,768 +0,0 @@
-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'.
-
- Special advice for Norwegian users: The language code for Norwegian
-bokma*l changed from `no' to `nb' recently (in 2003). During the
-transition period, while some message catalogs for this language are
-installed under `nb' and some older ones under `no', it's recommended
-for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
-older translations are used.
-
- In the `LANGUAGE' environment variable, but not in the `LANG'
-environment variable, `LL_CC' combinations can be abbreviated as `LL'
-to denote the language's main dialect. For example, `de' is equivalent
-to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
-(Portuguese as spoken in Portugal) in this context.
-
-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 January
-2004. The matrix shows, in regard of each package, for which languages
-PO files have been submitted to translation coordination, with a
-translation percentage of at least 50%.
-
- Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es
- +----------------------------------------------------+
- a2ps | [] [] [] [] |
- aegis | () |
- ant-phone | () |
- anubis | |
- ap-utils | |
- aspell | [] |
- bash | [] [] [] [] |
- batchelor | |
- bfd | [] [] |
- binutils | [] [] |
- bison | [] [] [] |
- bluez-pin | [] [] [] |
- clisp | |
- clisp | [] [] [] |
- console-tools | [] [] |
- coreutils | [] [] [] [] |
- cpio | [] [] [] |
- darkstat | [] () [] |
- diffutils | [] [] [] [] [] [] [] |
- e2fsprogs | [] [] [] |
- enscript | [] [] [] [] |
- error | [] [] [] [] [] |
- fetchmail | [] () [] [] [] [] |
- fileutils | [] [] [] |
- findutils | [] [] [] [] [] [] [] |
- flex | [] [] [] [] |
- fslint | |
- gas | [] |
- gawk | [] [] [] [] |
- gbiff | [] |
- gcal | [] |
- gcc | [] [] |
- gettext | [] [] [] [] [] |
- gettext-examples | [] [] [] [] |
- gettext-runtime | [] [] [] [] [] |
- gettext-tools | [] [] [] |
- gimp-print | [] [] [] [] [] |
- gliv | |
- glunarclock | [] [] |
- gnubiff | [] |
- gnucash | [] () [] [] |
- gnucash-glossary | [] () [] |
- gnupg | [] () [] [] [] [] |
- gpe-aerial | [] |
- gpe-beam | [] [] |
- gpe-calendar | [] [] |
- gpe-clock | [] [] |
- gpe-conf | [] [] |
- gpe-contacts | [] [] |
- gpe-edit | [] |
- gpe-go | [] |
- gpe-login | [] [] |
- gpe-ownerinfo | [] [] |
- gpe-sketchbook | [] [] |
- gpe-su | [] [] |
- gpe-taskmanager | [] [] |
- gpe-timesheet | [] |
- gpe-today | [] [] |
- gpe-todo | [] [] |
- gphoto2 | [] [] [] [] |
- gprof | [] [] [] |
- gpsdrive | () () () |
- gramadoir | [] |
- grep | [] [] [] [] [] [] |
- gretl | [] |
- gtick | [] () |
- hello | [] [] [] [] [] [] |
- id-utils | [] [] |
- indent | [] [] [] [] |
- iso_3166 | [] [] [] [] [] [] [] [] [] [] |
- iso_3166_1 | [] [] [] [] [] [] |
- iso_3166_2 | |
- iso_3166_3 | [] |
- iso_4217 | [] [] [] [] |
- iso_639 | |
- jpilot | [] [] [] |
- jtag | |
- jwhois | [] |
- kbd | [] [] [] [] [] |
- latrine | () |
- ld | [] [] |
- libc | [] [] [] [] [] [] |
- libgpewidget | [] [] |
- libiconv | [] [] [] [] [] |
- lifelines | [] () |
- lilypond | [] |
- lingoteach | |
- lingoteach_lessons | () () |
- lynx | [] [] [] [] |
- m4 | [] [] [] [] |
- mailutils | [] [] |
- make | [] [] [] |
- man-db | [] () [] [] () |
- minicom | [] [] [] |
- mysecretdiary | [] [] [] |
- nano | [] () [] [] [] |
- nano_1_0 | [] () [] [] [] |
- opcodes | [] |
- parted | [] [] [] [] [] |
- ptx | [] [] [] [] [] |
- python | |
- radius | [] |
- recode | [] [] [] [] [] [] [] |
- rpm | [] [] |
- screem | |
- scrollkeeper | [] [] [] [] [] [] |
- sed | [] [] [] [] [] [] |
- sh-utils | [] [] [] |
- shared-mime-info | |
- sharutils | [] [] [] [] [] [] |
- silky | () |
- skencil | [] () [] |
- sketch | [] () [] |
- soundtracker | [] [] [] |
- sp | [] |
- tar | [] [] [] [] |
- texinfo | [] [] [] |
- textutils | [] [] [] [] |
- tin | () () |
- tp-robot | |
- tuxpaint | [] [] [] [] [] [] [] |
- unicode-han-tra... | |
- unicode-transla... | |
- util-linux | [] [] [] [] [] |
- vorbis-tools | [] [] [] [] |
- wastesedge | () |
- wdiff | [] [] [] [] |
- wget | [] [] [] [] [] [] |
- xchat | [] [] [] [] |
- xfree86_xkb_xml | [] [] |
- xpad | [] |
- +----------------------------------------------------+
- af am ar az be bg bs ca cs da de el en en_GB eo es
- 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68
-
- et eu fa fi fr ga gl he hr hu id is it ja ko lg
- +-------------------------------------------------+
- a2ps | [] [] [] () () |
- aegis | |
- ant-phone | [] |
- anubis | [] |
- ap-utils | [] |
- aspell | [] [] |
- bash | [] [] |
- batchelor | [] [] |
- bfd | [] |
- binutils | [] [] |
- bison | [] [] [] [] |
- bluez-pin | [] [] [] [] [] |
- clisp | |
- clisp | [] |
- console-tools | |
- coreutils | [] [] [] [] [] [] |
- cpio | [] [] [] [] |
- darkstat | () [] [] [] |
- diffutils | [] [] [] [] [] [] [] |
- e2fsprogs | |
- enscript | [] [] |
- error | [] [] [] [] |
- fetchmail | [] |
- fileutils | [] [] [] [] [] [] |
- findutils | [] [] [] [] [] [] [] [] [] [] [] |
- flex | [] [] [] |
- fslint | [] |
- gas | [] |
- gawk | [] [] [] |
- gbiff | [] |
- gcal | [] |
- gcc | [] |
- gettext | [] [] [] |
- gettext-examples | [] [] |
- gettext-runtime | [] [] [] [] [] |
- gettext-tools | [] [] [] |
- gimp-print | [] [] |
- gliv | () |
- glunarclock | [] [] [] [] |
- gnubiff | [] |
- gnucash | () [] |
- gnucash-glossary | [] |
- gnupg | [] [] [] [] [] [] [] |
- gpe-aerial | [] |
- gpe-beam | [] |
- gpe-calendar | [] [] [] |
- gpe-clock | [] |
- gpe-conf | [] |
- gpe-contacts | [] [] |
- gpe-edit | [] [] |
- gpe-go | [] |
- gpe-login | [] [] |
- gpe-ownerinfo | [] [] [] |
- gpe-sketchbook | [] |
- gpe-su | [] |
- gpe-taskmanager | [] |
- gpe-timesheet | [] [] [] |
- gpe-today | [] [] |
- gpe-todo | [] [] |
- gphoto2 | [] [] [] |
- gprof | [] [] |
- gpsdrive | () () () |
- gramadoir | [] [] |
- grep | [] [] [] [] [] [] [] [] [] [] [] |
- gretl | [] [] |
- gtick | [] [] [] |
- hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
- id-utils | [] [] [] [] |
- indent | [] [] [] [] [] [] [] [] [] |
- iso_3166 | [] [] [] [] [] [] [] |
- iso_3166_1 | [] [] [] [] [] |
- iso_3166_2 | |
- iso_3166_3 | |
- iso_4217 | [] [] [] [] [] [] |
- iso_639 | |
- jpilot | [] () |
- jtag | [] |
- jwhois | [] [] [] [] |
- kbd | [] |
- latrine | [] |
- ld | [] |
- libc | [] [] [] [] [] [] |
- libgpewidget | [] [] [] [] |
- libiconv | [] [] [] [] [] [] [] [] [] |
- lifelines | () |
- lilypond | [] |
- lingoteach | [] [] |
- lingoteach_lessons | |
- lynx | [] [] [] [] |
- m4 | [] [] [] [] |
- mailutils | |
- make | [] [] [] [] [] [] |
- man-db | () () |
- minicom | [] [] [] [] |
- mysecretdiary | [] [] |
- nano | [] [] [] [] |
- nano_1_0 | [] [] [] [] |
- opcodes | [] |
- parted | [] [] [] |
- ptx | [] [] [] [] [] [] [] |
- python | |
- radius | [] |
- recode | [] [] [] [] [] [] |
- rpm | [] [] |
- screem | |
- scrollkeeper | [] |
- sed | [] [] [] [] [] [] [] [] [] |
- sh-utils | [] [] [] [] [] [] [] |
- shared-mime-info | [] [] [] |
- sharutils | [] [] [] [] [] |
- silky | () [] () () |
- skencil | [] |
- sketch | [] |
- soundtracker | [] [] |
- sp | [] () |
- tar | [] [] [] [] [] [] [] [] [] |
- texinfo | [] [] [] [] |
- textutils | [] [] [] [] [] [] |
- tin | [] () |
- tp-robot | [] |
- tuxpaint | [] [] [] [] [] [] [] [] [] |
- unicode-han-tra... | |
- unicode-transla... | [] [] |
- util-linux | [] [] [] [] () [] |
- vorbis-tools | [] |
- wastesedge | () |
- wdiff | [] [] [] [] [] [] |
- wget | [] [] [] [] [] [] [] |
- xchat | [] [] [] |
- xfree86_xkb_xml | [] [] |
- xpad | [] [] |
- +-------------------------------------------------+
- et eu fa fi fr ga gl he hr hu id is it ja ko lg
- 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0
-
- lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
- +-----------------------------------------------------+
- a2ps | [] [] () () [] [] [] |
- aegis | () () () |
- ant-phone | [] [] |
- anubis | [] [] [] [] [] [] |
- ap-utils | [] () [] |
- aspell | [] |
- bash | [] [] [] |
- batchelor | [] |
- bfd | [] |
- binutils | [] |
- bison | [] [] [] [] [] |
- bluez-pin | [] [] [] |
- clisp | |
- clisp | [] |
- console-tools | [] |
- coreutils | [] [] |
- cpio | [] [] [] [] [] |
- darkstat | [] [] [] [] |
- diffutils | [] [] [] [] [] [] |
- e2fsprogs | [] |
- enscript | [] [] [] [] |
- error | [] [] [] |
- fetchmail | [] [] () [] |
- fileutils | [] [] [] |
- findutils | [] [] [] [] [] |
- flex | [] [] [] [] |
- fslint | [] [] |
- gas | |
- gawk | [] [] [] |
- gbiff | [] [] |
- gcal | |
- gcc | |
- gettext | [] [] [] |
- gettext-examples | [] [] [] |
- gettext-runtime | [] [] [] [] |
- gettext-tools | [] [] |
- gimp-print | [] |
- gliv | [] [] [] |
- glunarclock | [] [] [] [] |
- gnubiff | [] |
- gnucash | [] [] () [] |
- gnucash-glossary | [] [] |
- gnupg | [] |
- gpe-aerial | [] [] [] [] |
- gpe-beam | [] [] [] [] |
- gpe-calendar | [] [] [] [] |
- gpe-clock | [] [] [] [] |
- gpe-conf | [] [] [] [] |
- gpe-contacts | [] [] [] [] |
- gpe-edit | [] [] [] [] |
- gpe-go | [] [] [] |
- gpe-login | [] [] [] [] |
- gpe-ownerinfo | [] [] [] [] |
- gpe-sketchbook | [] [] [] [] |
- gpe-su | [] [] [] [] |
- gpe-taskmanager | [] [] [] [] |
- gpe-timesheet | [] [] [] [] |
- gpe-today | [] [] [] [] |
- gpe-todo | [] [] [] [] |
- gphoto2 | [] |
- gprof | [] [] |
- gpsdrive | () () [] |
- gramadoir | () [] |
- grep | [] [] [] [] [] |
- gretl | |
- gtick | [] [] [] |
- hello | [] [] [] [] [] [] [] [] [] [] |
- id-utils | [] [] [] [] |
- indent | [] [] [] [] |
- iso_3166 | [] [] [] |
- iso_3166_1 | [] [] |
- iso_3166_2 | |
- iso_3166_3 | [] |
- iso_4217 | [] [] [] [] [] [] [] [] |
- iso_639 | [] |
- jpilot | () () |
- jtag | |
- jwhois | [] [] [] [] () |
- kbd | [] [] [] |
- latrine | [] |
- ld | |
- libc | [] [] [] [] |
- libgpewidget | [] [] [] |
- libiconv | [] [] [] [] [] |
- lifelines | |
- lilypond | |
- lingoteach | |
- lingoteach_lessons | |
- lynx | [] [] [] |
- m4 | [] [] [] [] [] |
- mailutils | [] [] [] |
- make | [] [] [] [] |
- man-db | [] |
- minicom | [] [] [] [] |
- mysecretdiary | [] [] [] |
- nano | [] [] [] [] [] |
- nano_1_0 | [] [] [] [] [] [] |
- opcodes | [] [] |
- parted | [] [] [] [] |
- ptx | [] [] [] [] [] [] [] [] |
- python | |
- radius | [] [] |
- recode | [] [] [] [] |
- rpm | [] [] [] |
- screem | |
- scrollkeeper | [] [] [] [] [] |
- sed | [] [] [] |
- sh-utils | [] [] |
- shared-mime-info | [] [] |
- sharutils | [] [] |
- silky | () |
- skencil | [] [] |
- sketch | [] [] |
- soundtracker | |
- sp | |
- tar | [] [] [] [] [] [] |
- texinfo | [] [] [] [] |
- textutils | [] [] |
- tin | |
- tp-robot | [] |
- tuxpaint | [] [] [] [] [] [] [] [] |
- unicode-han-tra... | |
- unicode-transla... | |
- util-linux | [] [] [] |
- vorbis-tools | [] [] [] |
- wastesedge | |
- wdiff | [] [] [] [] [] |
- wget | [] [] [] |
- xchat | [] [] [] |
- xfree86_xkb_xml | [] [] |
- xpad | [] [] |
- +-----------------------------------------------------+
- lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
- 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63
-
- sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
- +-----------------------------------------------------+
- a2ps | [] [] [] [] | 16
- aegis | | 0
- ant-phone | | 3
- anubis | [] [] | 9
- ap-utils | () | 3
- aspell | | 4
- bash | | 9
- batchelor | | 3
- bfd | [] [] | 6
- binutils | [] [] [] | 8
- bison | [] [] | 14
- bluez-pin | [] [] [] | 14
- clisp | | 0
- clisp | | 5
- console-tools | | 3
- coreutils | [] [] [] [] | 16
- cpio | [] [] | 14
- darkstat | [] [] [] () () | 12
- diffutils | [] [] [] | 23
- e2fsprogs | [] [] | 6
- enscript | [] [] | 12
- error | [] [] [] | 15
- fetchmail | [] [] | 11
- fileutils | [] [] [] [] [] | 17
- findutils | [] [] [] [] [] [] | 29
- flex | [] [] | 13
- fslint | | 3
- gas | [] | 3
- gawk | [] [] | 12
- gbiff | | 4
- gcal | [] [] | 4
- gcc | [] | 4
- gettext | [] [] [] [] [] | 16
- gettext-examples | [] [] [] [] [] | 14
- gettext-runtime | [] [] [] [] [] [] [] [] | 22
- gettext-tools | [] [] [] [] [] [] | 14
- gimp-print | [] [] | 10
- gliv | | 3
- glunarclock | [] [] [] | 13
- gnubiff | | 3
- gnucash | [] [] | 9
- gnucash-glossary | [] [] [] | 8
- gnupg | [] [] [] [] | 17
- gpe-aerial | [] | 7
- gpe-beam | [] | 8
- gpe-calendar | [] [] [] [] | 13
- gpe-clock | [] [] [] | 10
- gpe-conf | [] [] | 9
- gpe-contacts | [] [] [] | 11
- gpe-edit | [] [] [] [] [] | 12
- gpe-go | | 5
- gpe-login | [] [] [] [] [] | 13
- gpe-ownerinfo | [] [] [] [] | 13
- gpe-sketchbook | [] [] | 9
- gpe-su | [] [] [] | 10
- gpe-taskmanager | [] [] [] | 10
- gpe-timesheet | [] [] [] [] | 12
- gpe-today | [] [] [] [] [] | 13
- gpe-todo | [] [] [] [] | 12
- gphoto2 | [] [] [] | 11
- gprof | [] [] | 9
- gpsdrive | [] [] | 3
- gramadoir | [] | 5
- grep | [] [] [] [] | 26
- gretl | | 3
- gtick | | 7
- hello | [] [] [] [] [] | 34
- id-utils | [] [] | 12
- indent | [] [] [] [] | 21
- iso_3166 | [] [] [] [] [] [] [] | 27
- iso_3166_1 | [] [] [] | 16
- iso_3166_2 | | 0
- iso_3166_3 | | 2
- iso_4217 | [] [] [] [] [] [] | 24
- iso_639 | | 1
- jpilot | [] [] [] [] [] | 9
- jtag | [] | 2
- jwhois | () [] [] | 11
- kbd | [] [] | 11
- latrine | | 2
- ld | [] [] | 5
- libc | [] [] [] [] | 20
- libgpewidget | [] [] [] [] | 13
- libiconv | [] [] [] [] [] [] [] [] | 27
- lifelines | [] | 2
- lilypond | [] | 3
- lingoteach | | 2
- lingoteach_lessons | () | 0
- lynx | [] [] [] | 14
- m4 | [] [] | 15
- mailutils | | 5
- make | [] [] [] | 16
- man-db | [] | 5
- minicom | | 11
- mysecretdiary | [] [] | 10
- nano | [] [] [] [] | 17
- nano_1_0 | [] [] [] | 17
- opcodes | [] [] | 6
- parted | [] [] [] | 15
- ptx | [] [] | 22
- python | | 0
- radius | | 4
- recode | [] [] [] | 20
- rpm | [] [] | 9
- screem | [] [] | 2
- scrollkeeper | [] [] [] | 15
- sed | [] [] [] [] [] [] | 24
- sh-utils | [] [] | 14
- shared-mime-info | [] [] | 7
- sharutils | [] [] [] [] | 17
- silky | () | 3
- skencil | [] | 6
- sketch | [] | 6
- soundtracker | [] [] | 7
- sp | [] | 3
- tar | [] [] [] [] [] | 24
- texinfo | [] [] [] | 14
- textutils | [] [] [] [] | 16
- tin | | 1
- tp-robot | | 2
- tuxpaint | [] [] [] [] [] | 29
- unicode-han-tra... | | 0
- unicode-transla... | | 2
- util-linux | [] [] | 15
- vorbis-tools | | 8
- wastesedge | | 0
- wdiff | [] [] [] | 18
- wget | [] [] [] [] [] [] [] [] | 24
- xchat | [] [] [] [] [] | 15
- xfree86_xkb_xml | [] [] [] [] [] | 11
- xpad | | 5
- +-----------------------------------------------------+
- 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
- 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373
-
- 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 January 2004 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
-the use of `gettext' the only thing missing are the translations. The
-Free Translation Project is also available for packages which are not
-developed inside the GNU project. Therefore the information given above
-applies also for every other Free Software Project. Contact
-`translation@iro.umontreal.ca' to make the `.pot' files available to
-the translation teams.
-
Index: contrib/diff/AUTHORS
===================================================================
--- contrib/diff/AUTHORS
+++ /dev/null
@@ -1,112 +0,0 @@
-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
Index: contrib/diff/COPYING
===================================================================
--- contrib/diff/COPYING
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 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) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
Index: contrib/diff/ChangeLog
===================================================================
--- contrib/diff/ChangeLog
+++ /dev/null
@@ -1,3878 +0,0 @@
-2004-04-13 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.7.
- * configure.ac (AM_GNU_GETTEXT_VERSION): Add.
- (XGETTEXT): Restore from pre-2004-04-12 version. This fixes
- a bug that lost many msgids in doc/diffutils.pot.
- * bootstrap: New file.
- * exgettext: Don't generate a temporary file, as this runs afoul
- of "make distcheck" which operates with read-only directories.
- * Makefile.am (EXTRA_DIST): Add bootstrap.
- Remove config/config.rpath as it is deduced automatically these days.
-
-2004-04-12 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.6.
-
- * NEWS: Add news for 2.8.4, 2.8.6.
-
- * README: Move copyright notice to end. Defer to "configure
- --help" for special "configure" options. Suggest latest libiconv.
- Update version numbers of Autoconf etc. to current.
-
- * configure.ac: Quote various arguments better.
- (AC_CONFIG_MACRO_DIR): Add call, specifying "m4".
- (AC_CONFIG_HEADER): Replaces AM_CONFIG_HEADER.
- (gl_USE_SYSTEM_EXTENSIONS): Replaces AC_GNU_SOURCE.
- (AC_ISC_POSIX): Remove; nobody ports to ancient ISC any more.
- (AC_PROG_CPP, AC_PROG_INSTALL, AC_C_INLINE,
- AC_HEADER_STDBOOL, AC_HEADER_STDC, AM_GNU_GETTEXT, XGETTEXT,
- AC_HEADER_STAT, AC_FUNC_VPRINTF, jm_FUNC_GLIBC_UNLOCKED_IO,
- jm_FUNC_GNU_STRFTIME, jm_FUNC_MALLOC, jm_FUNC_REALLOC,
- jm_PREREQ_C_STACK, jm_PREREQ_ERROR, jm_PREREQ_HARD_LOCALE,
- jm_PREREQ_QUOTEARG, jm_PREREQ_REGEX, AC_FUNC_FNMATCH_GNU, jm_AC_DOS):
- Remove; not needed here, as our files don't use them directly
- or we rely on gnulib modules.
- (AC_C_CONST): Remove; we assume C89 now.
- (AC_CHECK_HEADERS): Remove libintl.h, limits.h, stdlib.h, string.h,
- time.h.
- (AC_CHECK_TYPE): Remove ptrdiff_t, ssize_t.
- (AC_CHECK_FUNCS): Remove diraccess, strchr, strerror, tmpnam).
- (AC_REPLACE_FUNCS): Remove memchr, mkstemp, strcasecmp.
- (GNULIB_AUTOCONF_SNIPPET): Add call. This replaces much of
- the above.
- (AC_CONFIG_FILES): Remove lib/posix/Makefile.
- (AC_CONFIG_COMMANDS): Remove.
-
- * doc/diff.texi (dircategory): Change to "Text creation and
- manipulation" from "GNU packages".
- (Translations): New node.
- (Overview): Improve quality of algorithm citations.
- (Binary): -q doesn't exactly cause diff to assume files are binary.
- (Normal): Place after Side by Side, since it's less important.
- (Detailed Context, Detailed Unified, Detailed ed,
- Detailed if-then-else, diff3 Hunks, Detailed diff3 Normal):
- Place at end of menu.
- (Detailed Unified): Mention that fractional timestamps are
- omitted on hosts that don't support them.
- Mention what happens when hunks contain just one line.
- (Line Group Formats, Reject Names): Fix duplicate-word typos.
- (Comparing Directories): Trailing white space and empty lines are
- ignored in the -X file.
- (diff Options): Add --strip-trailing-cr.
- (Projects): gnu -> gvc@gnu.org.
-
- * lib/Makefile.am (SUBDIRS): Remove.
- (EXTRA_DIST, noinst_HEADERS): Remove most entries.
- (libdiffutils_a_SOURCES): Now just lib_SOURCES.
- (lib_SOURCES): New macro.
- (DISTCLEANFILES, MOSTLYCLEANFILES): Set to empty now.
- (gnulib.mk): Include: this does most of the work eliminated
- by the above changes.
-
- * lib/inttostr.c (inttostr): Protect i < 0 by compile-time
- test intended to suppress compiler warnings.
- * lib/inttostr.h: Include limits.h unilaterally.
- (CHAR_BIT): Remove.
- (PARAMS): Remove; all uses changed.
- * lib/setmode.c (__attribute__): New macro.
- (set_binary_mode): Define only if HAVE_SETMODE_DOS.
- Otherwise define a dummy static char, as C89 requires
- that we define something.
- * lib/setmode.h (set_binary_mode): Return true, not 1.
-
- * src/analyze.c, src/context.c, src/diff.c, src/io.c, src/util.c:
- Do not include regex.h, as diff.h does this now.
-
- * src/cmp.c: Sort includes. Include <exit.h>, <unlocked-io.h>.
- (specify_comparison_type): Don't report an error if the comparison
- type has already been specified the same way as this one.
-
- * src/cmp.c (usage): Mention exit status.
- * src/diff.c (option_help_msgid): Likewise.
- * src/diff3.c (usage): Likewise.
- * src/sdiff.c (usage): Likewise.
-
- * src/cmp.c (main): Adjust to latest gnulib c_stack_action
- calling conventions.
- * src/diff.c (main): Likewise.
- * src/diff3.c (main): Likewise.
- * src/sdiff.c (main): Likewise.
-
- * src/cmp.c (main): Adjust to latest version_etc calling conventions.
- * src/diff.c (main): Likewise.
- * src/diff3.c (main): Likewise.
- * src/sdiff.c (main): Likewise.
-
- * src/diff.c: Include <exit.h>.
- (binary): Define to true if not declared.
- (longopts): Set tabsize flag to 1.
- (main): Don't output nanoseconds if platform lacks them.
- Don't treat files as binary if !binary.
- (set_mtime_to_now): Use 0, not NULL.
- (compare_files): Mark files as nonexistent if it looks like
- 'patch' created inaccessible regular empty files to denote
- nonexistent backups. Don't compare such files.
- Clear st_* members of status of nonexistent file.
- Remove now-unnecessary tests.
-
- * src/diff.h: Include regex.h, unlocked-io.h.
- (struct file_data.changed): Now char *, not bool *, to save
- space on hosts where bool takes more space than char.
- All uses changed.
-
- * src/diff3.c: Include unlocked-io.h.
- (strip_trailing_cr): New var.
- (STRIP_TRAILING_CR_OPTION): New enum.
- (longopts, main, option_help_msgid, read_diff):
- Add --strip-trailing-cr support.
- (read_diff): Exit with status 126 (not 127) if errno != ENOENT
- after failed execvp in child. Report this in parent.
-
- * src/dir.c: Include <strcase.h>.
- (failed_locale_specific_sorting): Renamed from failed_strcoll.
- All uses changed.
- (compare_names): Don't invoke strcasecmp first thing when
- ignore_file_name_case; if locale_specific_sorting, we should
- just use that.
-
- * src/ifdef.c (next_line): Remove; replace with...
- (next_line0, next_line1): New vars.
- (print_ifdef_script, print_ifdef_hunk):
- Use them to fix line-number computation bug.
-
- * src/io.c (find_and_hash_each_line): Don't convert char *
- to unsigned char *; just leave pointers as char *. This
- lessens the number of potentially-dangerous casts.
- * src/util.c (lines_differ): Likewise.
-
- * src/sdiff.c: Include <unlocked-io.h>, <exit.h>.
- (check_child_status): Renamed from ck_editor_status, and
- accept a new arg MAX_OK_STATUS. All callers changed.
- Handle status 126/127 as per POSIX.
- (edit): Likewise.
- (main): Likewise. Fix getopt typo: -E wasn't supported.
-
- * src/system.h (S_IRWXU, S_IRWXG, S_IRWXO): Define if not defined.
- (S_IXUSR, S_IXGRP, S_IXOTH): Remove.
- Include <time.h> unconditionally, since we can assume C89 now.
- Likewise for <stdlib.h>, <string.h>.
- (getenv, EXIT_SUCCESS, EXIT_FAILURE, SSIZE_MAX, strchr, strrchr,
- memcmp, memcpy): Remove decl; no longer needed.
- (strcasecoll, strcasecmp): Define if not built in.
- (CTYPE_DOMAIN, ISPRINT, ISSPACE, TOLOWER, _tolower, errno): Remove;
- we now assume C89 or better. All uses changed.
- Include <stdbool.h> unconditionally now, since gnulib supports it
- if the C compiler doesn't. All boolean uses of 0 and 1 now
- changed to false and true.
- (lin_is_printable_as_long_int): Renamed from lin_is_printable_as_long.
-
- * src/util.c (begin_output): Fix bug: 0 wasn't cast to char * arg,
- which led to undefined behavior on 64-bit hosts.
- Use more-standard test for exit status 126 versus 127.
- (finish_output): Likewise.
- (analyze_hunk): Do not cast bool to int.
-
-2004-03-15 Paul Eggert <eggert@twinsun.com>
-
- * src/cmp.c (main): Don't consider two files with the same name to
- be the same, if their initial skip values differ. This fixes a
- bug reported by Hideki Iwamoto in
- <http://mail.gnu.org/archive/html/bug-gnu-utils/2004-03/msg00024.html>.
-
-2004-03-11 Paul Eggert <eggert@twinsun.com>
-
- * src/analyze.c (diag): Return void, not lin, since the return
- value wasn't needed. All callers changed.
- (diag, diff_2_files):
- Use 'true' and 'false' instead of '1' and '0', when appropriate.
- (compareseq): Use lin const * local variables instead of lin *.
- Don't bother checking diag's return value.
- (shift_boundaries, build_reverse_script, build_script, diff_2_files):
- Use char arrays, not bool arrays, since
- sizeof (bool) might be greater than 1.
-
-2004-02-09 Paul Eggert <eggert@twinsun.com>
-
- * m4/setmode.m4 (AC_FUNC_SETMODE_DOS): AC_LIBOBJ(setmode) if
- we would return true.
-
-2002-10-14 Paul Eggert <eggert@twinsun.com>
-
- * src/Makefile.am (diff3.$(OBJEXT), diff.$(OBJEXT),
- sdiff.$(OBJEXT)): Rename from (misspelled) diff3.$(OBJECT),
- diff.$(OBJECT), sdiff.$(OBJECT). Patch by Paul D. Smith in
- <http://mail.gnu.org/pipermail/bug-gnu-utils/2002-October/003251.html>.
- Bug reported by Chris Bainbridge.
-
-2002-10-13 Paul Eggert <eggert@twinsun.com>
-
- * src/Makefile.am (MOSTLYCLEANFILES): Add paths.ht.
- (paths.h): Send output to paths.ht first, and then rename to
- paths.h at the end. This avoids problems if the disk is full.
- It also works around what appears to be a bug with GNU make -j
- (3.79.1); see <http://bugs.gentoo.org/show_bug.cgi?id=8934>.
-
-2002-06-27 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.4.
-
- * config/config.sub: Sync with latest version maintained in other
- packages.
-
- * lib/file-type.h: Protect against double inclusion. Detect
- whether <sys/stat.h> has been included. Fix from Jim Meyering.
-
- * src/analyze.c (briefly_report): Don't say "Binary files differ",
- since one of the files may not be a binary file.
- Bug reported by Dan Jacobson.
-
-2002-06-22 Paul Eggert <eggert@twinsun.com>
-
- * lib/c-stack.c (segv_handler, c_stack_action) [! defined
- SA_SIGINFO]: Do not assume SA_SIGINFO behavior.
- Bug reported by Jim Meyering on NetBSD 1.5.2.
-
-2002-06-16 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.3.
-
- * config/depcomp, config/missing, README: Update to automake 1.6.2.
-
- * po/LINGUAS: Add en_US.
- * po/en_US.po: New file.
- * po/POTFILES.in: Remove lib/freesoft.c.
- Add lib/file-type.c, lib/version-etc.c, lib/xmalloc.c.
-
-2002-06-15 Paul Eggert <eggert@twinsun.com>
-
- * doc/diff.texi (Special Files): Document behavior of symlink
- loops.
-
- * lib/Makefile.am (noinst_HEADERS): Remove freesoft.h.
- Add version-etc.h.
- (libdiffutils_a_SOURCES): Remove freesoft.c. Add version-etc.c.
- * lib/freesoft.c, lib/freesoft.h: Remove.
- * lib/version-etc.h (PARAMS): Remove; we now assume C89 at least.
-
- * lib/version-etc.h (version_etc): Remove package and version args.
- (version_etc_copyright): Remove.
- * lib/version-etc.c: Likewise.
- Do not include unlocked-io.h; no longer needed.
- Include gettext.h rather than libinto.h.
- (_): Define unconditionally.
- (version_etc): Adjust wording to match current GNU coding standards.
- Translate "(C)" if possible.
-
- * lib/version-etc.c, lib/version-etc.h: New files, taken from
- fileutils.
-
- * src/Makefile.am (cmp_SOURCES, diff3_SOURCES, sdiff_SOURCES,
- diff_SOURCES): Remove version.c.
- (MAINTAINERCLEANFILES, $(srcdir)/version.c): Remove.
-
- * src/cmp.c: Include version-etc.h, not freesoft.h.
- (copyright_notice): Remove.
- (main): Use version_etc to print version.
- * src/diff.c, src/diff3.c, src/sdiff.c: Likewise.
-
- * src/cmp.c (version_string): Remove decl.
- * src/diff.h, src/diff3.c, src/sdiff.c: Likewise.
-
-2002-06-11 Paul Eggert <eggert@twinsun.com>
-
- * lib/fnmatch.c, lib/fnmatch_loop.c (WIDE_CHAR_SUPPORT):
- New macro. Use it uniformly instead of
- (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H).
- It also uses HAVE_BTOWC, to fix a porting bug on Solaris 2.5.1
- reported by Vin Shelton.
- * m4/fnmatch.m4 (_AC_LIBOBJ_FNMATCH): Check for btowc.
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.2.
-
- * ABOUT-NLS, config/config.guess, config/config.sub,
- config/depcomp, config/texinfo.tex, lib/posix/regex.h,
- m4/c-bs-a.m4, m4/gettext.m4, m4/gnu-source.m4, m4/lib-link.m4,
- m4/malloc.m4:
- Update to recent version (maintained in other packages).
- * m4/prereq.m4 (jm_PREREQ_EXCLUSIVE): AC_FUNC_FNMATCH_GNU
- no longer takes a lib.
-
- * README: Incorporate contents from INSTALLME.
- * INSTALLME: Remove.
- * Makefile.am (EXTRA_DIST): Remove INSTALLME.
-
- * configure.ac (AC_GNU_SOURCE): Move up, so that it affects
- later compilations properly.
- (DEFAULT_DIFF_PROGRAM, AC_TYPE_SIGNAL): Remove.
- (jm_AC_TYPE_INTMAX_T): Add.
- (AC_FUNC_FNMATCH_GNU): Use this, instead of AC_FUNC_FNMATCH.
- (AC_CONFIG_LINKS): regex.hin renamed from regex_.h.
-
- * doc/diff.texi: Reword "@option{-f} and @option{--foo}" to
- "@option{-f} or @option{--foo}".
- Use @acronym instead of @sc where appropriate.
- (Specified Lines): Renamed from Specified Folding.
- (Comparison, Blank Lines):
- Clarify wordings for Blank Lines and Specified Lines nodes.
- (Binary): Mention --verbose and --print-bytes.
- (Tabs, sdiff Option Summary, diff Options):
- New option --tabsize=COLUMNS.
-
- * lib/Makefile.am (EXTRA_DIST): Add fnmatch_loop.c.
- (noinst_HEADERS): fnmatch_.h renamed from fnmatch.hin.
- regex_.h renamed from regex.hin.
- Add file-type.h.
- (libdiffutils_a_SOURCES): Add file-type.c.
- (DISTCLEANFILES): Remove fnmatch.hno, regex.hno.
-
- * lib/c-stack.c (__attribute__): New macro.
- (EOVERFLOW): Define if not defined.
- (stack_t): Define to struct sigaltstack if not defined or declared.
- Include <sys/resource.h>, <ucontext.h> if available.
- Include <stdio.h> if DEBUG.
- Do not include <inttypes.h> or <stdint.h>.
- (c_stack_die): Remove info and context args. All uses changed.
- (segv_action): Likewise.
- (alternate_signal_stack): Change uintmax_t to long, to ease porting.
- (get_stack_location, min_address_from_argv, max_address_from_argv,
- null_action): New functions.
- (stack_base, stack_size): New vars.
- (segv_handler): context arg may not be used.
- Use global stack_base, stack_size if
- ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC.
- Add debug code.
- Invoke die (rather than segv_action) to exit.
- (c_stack_action): Accept new argv arg, and simpler handler arg.
- All uses changed. Move code into new functions above.
- Allow null action.
- [! (defined SA_ONSTACK && defined _SC_PAGESIZE)]: Assume all segvs
- are stack overflows.
- (main) [DEBUG]: Describe what output should be like.
-
- * lib/c-stack.h (siginfo_t, c_stack_die): Remove decl.
-
- * lib/file-type.c, lib/file-type.h: New files. These contain code
- that was in src/diff.c, but is now librarified and spiffed up a
- bit. Jim Meyering suggested this.
-
- * lib/fnmatch.c (alloca, __builtin_expect): Define for non-GCC hosts.
- <strings.h>: Include only if HAVE_STRINGS_H.
- <stddef.h>: Include if we include stdlib.h.
- Do not comment out all code if ! HAVE_FNMATCH_GNU.
- (getenv): Do not declare if HAVE_DECL_GETENV.
- (__strchrnul, __wcschrnul): Remove; not used.
- (MEMPCPY): Use mempcpy if not _LIBC; use memcpy if neither _LIBC
- nor HAVE_MEMPCPY.
- (FOLD) [HANDLE_MULTIBYTE]: Do not pass wide char to ISUPPER.
- (STRLEN, STRCAT, MEMPCPY) [HANDLE_MULTIBYTE && !defined _LIBC]:
- Use wcslen rather than __wcslen, and likewise for wcscat, wmempcpy.
- (MEMPCPY) [HANDLE_MULTIBYTE]: Use wmempcpy if not _LIBC; use wmemcpy
- if neither _LIBC nor HAVE_WMEMPCPY.
- * lib/fnmatch_.h (__const): Do not define to empty, as this breaks
- Sun cc. The code doesn't work with K&R anyway.
- * lib/fnmatch_loop.c (struct patternlist.str): Size 1, not 0,
- as C89 requires this.
- (NEW_PATTERN): Use offsetof, not sizeof, since str now has size 1.
- * lib/fnmatch_.h: Import from glibc fnmatch.h.
- * lib/fnmatch.c, lib/fnmatch_loop.c: Import from glibc.
-
- * lib/posixver.c: Include posixver.h.
-
- * lib/regex_.h: Renamed from lib/regex.hin.
-
- * m4/c-stack.m4 (jm_PREREQ_C_STACK): Do not AC_REQUIRE
- jm_AC_TYPE_UINTMAX_T and do not use uintmax_t.
- Check for sys/resource.h, uccontext.h.
- Check for decls and existence of getcontext, sigaltstack.
- Check for stack_t.
-
- * m4/codeset.m4, m4/glibc21.m4, m4/lcmessage.m4: Remove.
-
- * m4/fnmatch.m4: Update to latest Autoconf CVS for AC_FUNC_FNMATCH_GNU.
- * m4/gnu-source.m4: Likewise, for AC_GNU_SOURCE (renamed from
- AC__GNU_SOURCE).
-
- * m4/mbstate_t.m4 (AC_TYPE_MBSTATE_T): Renamed from AC_MBSTATE_T.
- All uses changed. Upgrade to recent Autoconf CVS.
-
- * m4/stdbool.m4 (AC_HEADER_STDBOOL): Do not cast pointer to
- bool in integer constant expression; C99 does not allow it.
- Reported by Bruno Haible.
-
- * po/LINGUAS: Add hu, pt_BR.
- * po/hu.po, po/pt_BR.po: New files.
-
- * src/Makefile.am (noinst_HEADERS): Remove diff.h.
- (DEFS): Remove.
- (diff_sources): Add diff.h.
- (MOSTLYCLEANFILES): New macro.
- (cmp.$(OBJEXT) diff3.$(OBJECT) diff.$(OBJECT) sdiff.$(OBJECT)): Depend
- on paths.h.
- (paths.h): New rule.
-
- * src/analyze.c, src/cmp.c, src/diff.c, src/diff3.c, src/io.c,
- src/sdiff.c: Include <file-type.h>.
-
- * src/cmp.c: Include paths.h.
- (copyright_notice): Renamed from copyright_string.
- Now a msgid, so that copyright symbol can be translated.
- All uses changed.
- * src/diff.c, src/diff3.c, src/sdiff.c: Likewise.
-
- * src/diff.c: Include posixver.h.
- (TABSIZE_OPTION): New constant.
- (main): Allow widths up to SIZE_MAX.
- (filetype): Move to lib/file-type.c and rename to file_type.
- All uses changed.
-
- * src/diff.c (longopts, main, usage): New option --tabsize=COLUMNS.
- * src/io.c (find_and_hash_each_line): Likewise.
-
- * src/diff.h (TAB_WIDTH): Remove.
- (tabsize): New decl.
- (sdiff_half_width, sdiff_column2_offset): Now size_t rather than
- unsigned int.
-
- * src/diff3.c (skipwhite, readnum): New functions.
- (process_diff_control): Use them.
- (SKIPWHITE, READNUM): Remove.
- (read_diff): Don't worry about errno == ENOEXEC.
-
- * src/sdiff.c (catchsig, signal_handler, initial_action): Signal
- handlers return void, not RETSIGTYPE, since we no longer support
- K&R.
- (TABSIZE_OPTION): New constant.
- (longopts, usage, main): New option --tabsize=COLUMNS.
- (cleanup): New arg signo. All uses changed.
- (ck_editor_status, main, edit): Don't worry about ENOEXEC.
-
- * src/side.c (tab_from_to, print_half_line, print_1sdiff_line):
- New option --tabsize=COLUMNS.
-
- * src/system.h (S_ISBLK, S_ISCHR, S_ISDIR, S_ISFIFO, S_ISREG,
- S_ISSOCK): Remove; now in lib/file-type.h.
-
- * src/util.c (finish_output): Check for ENOEXEC.
- (lines_differ, output_1_line): New option --tabsize=COLUMNS.
- (analyze_hunk): If -b or -w is also specified, -B now considers
- lines to be empty if they contain only white space.
-
-2002-04-05 Paul Eggert <eggert@sic.twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.1.
-
- * configure.ac (AC_HEADER_STDBOOL): Add.
- (AC_CHECK_HEADERS): Remove stdbool.h.
- * m4/stdbool.m4: New file.
- * m4/prereq.m4 (jm_PREREQ_EXCLUDE):
- Use AC_HEADER_STDBOOL rather than AC_CHECK_HEADERS(stdbool.h).
- (jm_PREREQ_HASH): Likewise.
-
- * src/system.h (SSIZE_MAX): Define if limits.h doesn't.
-
- * src/analyze.c (diff_2_files): Assign PTRDIFF_MAX - 1 to a
- size_t variable, just in case there's a problem with ptrdiff_t
- versus size_t.
-
- * lib/cmpbuf.c (errno): Remove decl; K&R C is no longer supported.
- Include limits.h.
- (SIZE_MAX, SSIZE_MAX): Define if standard headers don't.
- (MIN): New macro.
- (block_read): Do not attempt to read more than SSIZE_MAX bytes, as the
- resulting behavior is implementation-defined. Work around bug in
- Tru64 5.1, which can't read more than INT_MAX bytes at a time.
- * src/cmp.c (cmp): Use block_read instead of read, to work
- around Tru64 5.1 bug.
- * src/diff3.c (read_diff): Likewise.
- * src/diff3.c: Include cmpbuf.h.
-
- * THANKS: Add Ulrich Drepper.
-
- * INSTALLME: Mention GNU texinfo.
-
- * doc/diff.texi:
- Use new @copying directive.
- Put @contents first, not last, since Texinfo now suggests this.
- Fix bug in -w documentation noted by Karl Berry.
- Mention links for speedup.
- New node "Speedups" for future speedups.
- Just say "Index", not "Concept Index".
-
-2002-03-26 Paul Eggert <eggert@twinsun.com>
-
- * src/Makefile.am:
- (INCLUDES): Remove this obsolete macro, replacing it with:
- (AM_CPPFLAGS): New macro.
-
-2002-03-26 Albert Chin-A-Young <china@thewrittenword.com>
-
- * src/Makefile.am (datadir): Remove, as it conflicts with --datadir.
-
-2002-03-26 Paul Eggert <eggert@twinsun.com>
-
- * doc/diff.texi (dircategory GNU packages): Fix typo: a "* " was
- missing before the menu entry. Bug diagnosed by Adam Heath.
- Also, put this dircategory after the Individual utilities dircategory,
- to work around a compatibility problem with Debian install-info.
-
-2002-03-24 Eli Zaretskii <eliz@is.elta.co.il>
-
- * src/io.c (sip): Do not mishandle buffered count when reverting
- to text mode.
-
-2002-03-23 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.8.
- * configure.ac (AC_PREREQ): 2.53.
- * INSTALLME: Upgrade to gettext 0.11.1 and help2man 1.27.
-
- * doc/diff.texi: Upgrade the description of `patch' to GNU patch
- 2.5.4, and revamp the documentation accordingly.
-
- * src/diff.c (main): Fix typo that prevented diff -y from working.
- Bug reported by Mitsuru Chinen.
-
-2002-03-15 Paul Eggert <eggert@twinsun.com>
-
- * lib/c-stack.c (c_stack_die) [!HAVE_SIGINFO_T]: Don't use info.
- Bug reported by Eli Zaretskii.
-
-2002-03-15 Eli Zaretskii <eliz@is.elta.co.il>
-
- * ms/config.sed: Tweak editing of install-info-am target.
-
-2002-03-12 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.7.10.
-
- * NEWS: cmp -l -s and cmp -s -l are not allowed.
- Deprecate diff -h, -H, -L, -P, --inhibit-hunk-merge.
-
- * configure.ac (jm_PREREQ_HARD_LOCALE): Add.
- (AM_INIT_AUTOMAKE): Do not distribute shar file.
-
- * doc/diff.texi (Overview): byte != character.
- (Detailed Context, Detailed Unified, Alternate Names, diff Options):
- Do not document diff -L.
- (Comparing Directories, Making Patches, diff Options):
- Do not document diff -P.
- (diff Performance, sdiff Option Summary, diff Options, sdiff Options):
- Do not document diff -H.
- (diff Performance, diff Options): Do not document --horizon-lines.
- (cmp Options): Prefer -b to -c.
- (cmp Options, diff Options, diff3 Options, patch Options,
- sdiff Options): Put short options next to the similar long options.
- Document --help, and use the same wording for --verbose.
- (diff3 Options): Fix typo in description of -E, which used wrongly used
- "-e" instead of "-E".
-
- * lib/hard-locale.c (alloca): Remove.
- Include stdlib.h if available, for malloc.
- (hard_locale): Use malloc, not alloca, so that we need not worry about
- alloca issues. Test for storage allocation failure.
-
- * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_HARD_LOCALE.
- (jm_PREREQ_HARD_LOCALE): New macro.
-
- * src/cmp.c (specify_comparison_type): New function.
- (check_stdout): "indices and codes" -> "byte numbers and values"
- (main): Detect clashing options.
- (cmp): Use "byte" rather than "char" if a translation for "byte"
- is available, even when in the POSIX locale.
-
- * src/diff.c (option_help_msgid): Do not document -L, -P,
- --horizon-lines, --inhibit-hunk-merge, -H.
- * src/diff.h: -L -> --label
-
-2002-03-11 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT): Version 2.7.9.
-
- * INSTALLME: Update to autoconf 2.53, automake 1.6, help2man
- 1.25 with patch.
-
- * configure.ac (AC_INIT):
- Change package name from diff to diffutils.
- (AM_INIT_AUTOMAKE): Use new form, with option gnits,
- rather than old from that duplicated AC_INIT.
- (AM_MISSING_PROG): Add help2man.
- (REGEX_MALLOC): Define.
- (AC_CONFIG_FILES): Add man/Makefile.
-
- * Makefile.am (AUTOMAKE_OPTIONS): Remove.
- * doc/Makefile.am (AUTOMAKE_OPTIONS): Remove.
- * lib/Makefile.am (AUTOMAKE_OPTIONS): Likewise.
- * ms/Makefile.am (AUTOMAKE_OPTIONS): Likewise.
- * src/Makefile.am (AUTOMAKE_OPTIONS): Likewise.
-
- * lib/c-stack.c: Include <errno.h>
- (ENOTSUP): Define if errno.h doesn't.
- (SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_SIGINFO, SIGSTKSZ,
- _SC_PAGESIZE, ALTERNATE_STACK_SIZE, stack_t, sigaltstack):
- Remove; we now assume them all when
- HAVE_XSI_STACK_OVERFLOW_HEURISTIC, so we don't need
- substitutes.
- (<ucontext.h>): Include only if HAVE_XSI_STACK_OVERFLOW_HEURISTIC.
- (alternate_signal_stack): Now of size SIGSTKSZ.
- (segv_handler): Simplify, under the assumption that
- HAVE_XSI_STACK_OVERFLOW_HEURISTIC is nonzero.
- (c_stack_action): Likewise.
- (exit_failure) [DEBUG]: Initialize to 0, not 1.
- (recurse, main) [DEBUG]: Remove main args.
-
- * m4/c-stack.m4 (AC_SYS_XSI_STACK_OVERFLOW_HEURISTIC): Change
- wording of message. Do not check for stdbool.h or ucontext.h,
- or for ucontext_t or sigaction or sigaltstack.
-
- * po/LINGUAS: Add zh_TW.
-
- * Makefile.am (SUBDIRS): Add man.
- * man/Makefile.am: New file.
- * src/cmp.c (usage): Reword for help2man.
- * src/diff.c (option_help_msgid): Likewise.
- * src/diff3.c (option_help_msgid, usage): Likewise.
- * src/sdiff3.c (option_help_msgid, usage): Likewise.
- Reword for help2man.
-
- * THANKS: Add email address for Tower.
-
- * config/config.guess, config/config.sub, config/depcomp,
- config/install-sh, config/mdate-sh, config/missing,
- config/mkinstalldirs, config/texinfo.tex: Update
- to recent version (maintained in other packages).
-
-2002-03-04 Bruno Haible <haible@ilog.fr>
-
- * m4/gettext.m4 (AM_GNU_GETTEXT): Set LIBINTL and LTLIBINTL to empty if
- no preinstalled GNU gettext was found.
-
-2002-03-02 Eli Zaretskii <eliz@is.elta.co.il>
-
- * ms/config.sed: Tweak editing of install-info-am and
- uninstall-info-am targets, to include 8+3-butchered names of Info
- files.
-
-2002-02-28 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT, AM_INIT_AUTOMAKE): Version 2.7.8.
-
- * doc/diff.texi: Add vr index.
- Update copyright to 2002.
- (Standards conformance): New chapter.
- (Binary): Differing binary files are trouble unless the user asked for
- brief output.
- (Detailed Context): Prefer ISO time stamp format in discussion.
- (Detailed Unified, Pagination): Likewise.
- (Less Context): Likewise. Also use short option.
- (Alternate Names): Separate option from arg.
- (Making Patches): Mention -U 2.
- (diff Options): Deprecate -LINES, as POSIX 1003.1-2001 does not
- allow it.
-
- * INSTALLME: Update advice for Solaris installation problems.
- We no longer use a test version of gettext.
- Autoconf test version updated from 2.52f to 2.52h.
- POSIX 1003.1-2001 patch for Automake.
-
- * configure.ac (AC__GNU_SOURCE): Add this,
- replacing AH_VERBATIM of _GNU_SOURCE.
- (tempname): Use AC_LIBOBJS, not LIBOBJS=, as now required by autoconf.
- (jm_PREREQ_C_STACK): Add.
- (AC_CONFIG_FILES): Remove intl/Makefile.
- (AM_GNU_GETTEXT): Add external arg, from gettext 0.11.
-
- * lib/c-stack.c, lib/c-stack.h, lib/exitfail.c, lib/exitfail.h,
- lib/posixver.c, lib/posixver.h, m4/c-stack.m4, m4/gnu-source.m4,
- po/cs.po, po/ja.po: New files.
-
- * intl/ChangeLog, intl/Makefile.in, intl/VERSION,
- intl/bindtextdom.c, intl/config.charset, intl/dcgettext.c,
- intl/dcigettext.c, intl/dcngettext.c, intl/dgettext.c,
- intl/dngettext.c, intl/explodename.c, intl/finddomain.c,
- intl/gettext.c, intl/gettextP.h, intl/gmo.h, intl/hash-string.h,
- intl/intl-compat.c, intl/l10nflist.c, intl/libgnuintl.h,
- intl/loadinfo.h, intl/loadmsgcat.c, intl/localcharset.c,
- intl/locale.alias, intl/localealias.c, intl/localename.c,
- intl/ngettext.c, intl/os2compat.c, intl/os2compat.h, intl/osdep.c,
- intl/plural-eval.c, intl/plural-exp.c, intl/plural-exp.h,
- intl/plural.c, intl/plural.y, intl/ref-add.sin, intl/ref-del.sin,
- intl/textdomain.c, m4/isc-posix.m4, m4/libtool.m4: Remove.
-
- * ABOUT-NLS: Update to Gettext 0.11.
-
- * Makefile.am (SUBDIRS): Remove intl.
-
- * config/config.guess, config/config.rpath, config/config.sub,
- config/texinfo.tex, config/depcomp, config/texinfo.tex,
- lib/tempname.c: Update to latest version from other packages.
-
- * lib/xalloc.h (xalloc_exit_failure): Remove; subsumed by exit_failure.
- * lib/xmalloc.c: Include exitfail.h.
- (xalloc_exit_failure): Remove; subsumed by exit_failure.
- All uses changed.
-
- * lib/Makefile.am (noinst_HEADERS): Add c-stack.h, exitfail.h.
- (libdiffutils_a_SOURCES): Add c-stack.c, exitfail.c, quotesys.c.
- (INCLUDES): Remove.
-
- * lib/cmpbuf.h (buffer_lcm): New arg LCM_MAX.
- * lib/cmpbuf.c: Include errno.h.
- (errno): Declare if !STDC_HEADERS.
- Include signal.h.
- (SA_RESTART): Define if not already defined.
- Include <inttypes.h>.
- (PTRDIFF_MAX): Define if not already defined.
- (TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): Likewise.
- (block_read): Accommodate ancient AIX hosts that set errno to EINTR
- after uncaught SIGCONT.
- (buffer_lcm): Return a reasonable size if the multiple is too large.
- New arg LCM_MAX. All callers changed.
-
- * lib/hard-locale.c: Include "hard-locale.h".
- (hard_locale): Ignore ENABLE_NLS, since we want to operate on
- locales other than LC_MESSAGES.
-
- * m4/prereq.m4 (jm_PREREQ): Add jm_PREREQ_POSIXVER.
- (jm_PREREQ_POSIXVER): New macro.
-
- * m4/setmode.m4 (AC_FUNC_SETMODE_DOS):
- Check for fcntl.h and unistd.h unconditionally.
- Suggested by Bruno Haible.
-
- * po/LINGUAS: Add cs, ja.
- * po/POTFILES.in: Add lib/c-stack.c, src/dir.c.
-
- * src/Makefile.am (datadir): @DATADIRNAME@ -> share.
- (INCLUDES): Remove intl.
- (LDADD): Change INTLLIBS to LIBINTL.
- No longer need to link libdiffutils.a twice.
-
- * src/analyze.c (diff_2_files):
- Avoid arithmetic overflow in buffer size calculation.
-
- * src/cmp.c: Include c-stack.h, exitfail.h.
- (hard_locale_LC_MESSAGES): Depend on ENABLE_NLS.
- (try_help, check_stdout, main, cmp): 2 -> EXIT_TROUBLE.
- (main): Check for stack overflow.
- 0 -> EXIT_SUCCESS.
- 1 -> EXIT_FAILURE.
- (cmp): Likewise.
- Accommodate ancient AIX hosts that set errno to
- EINTR after uncaught SIGCONT.
-
- * src/context.c (pr_context_hunk):
- Do not dump core if an enormous context causes an
- arithmetic overflow.
- (pr_unidiff_hunk): Likewise.
- (find_hunk): Likewise.
-
- * src/diff.h: unsigned -> unsigned int.
- * src/diff.c: Include c-stack.h, exitfail.h.
- Do not include signal.h.
- (specify_style, specify_value): Bring these routines back, as POSIX
- requires that the order of options not matter.
- (shortopts): New constant.
- (group_format_option, line_format_option): New constants.
- (main): 0 -> EXIT_SUCCESS, 1 -> EXIT_FAILURE, 2 -> EXIT_TROUBLE.
- Ensure that order of options does not matter.
- Check for stack overflow.
- If contexts overflow, substitute LIN_MAX, as that's good enough.
- If multiple contexts are specified, use their maximum.
- -c is equivalent to -C 3 now, instead of having an implicit context;
- likewise for -u and -U 3.
- Use specify_style and specify_value.
- (SIGCHLD): Do not define; now done in a header.
- Use new style time stamp format for -u / -U.
- Reject numeric-string options if operating in POSIX 1003.1-2001 mode.
- Avoid overflow problems with tab width.
- Simplify from-file and to-file code.
- (usage): Do not mention obsolete options.
- (filetype): Do not mention whether a file is executable.
- Add typed memory objects.
- (compare_files): 0 -> EXIT_SUCCESS, 1 -> EXIT_FAILURE, 2 ->
- EXIT_TROUBLE.
-
- * src/diff3.c: Include c-stack.h, exitfail.h.
- (ALLOCATE): Remove. All uses changed to xmalloc, or to xmalloc plus
- an overflow check.
- (myread): Remove.
- (main): Check for stack overflow.
- 0 -> EXIT_SUCCESS, 1 -> EXIT_FAIULRE, 2 -> EXIT_TROUBLE.
- (try_help): Likewise.
- (process_diff): Check for integer overflow, to avoid core dumps.
- 2 -> EXIT_TROUBLE.
- (read_diff): Exit with status 126 if the file is not executable,
- for compatibility with POSIX 1003.1-2001.
- Accommodate ancient AIX hosts that set errno to EINTR after uncaught
- SIGCONT.
- Check for integer overflow to avoid core dumps.
- (fatal, perror_with_exit): 2 -> EXIT_TROUBLE.
-
- * src/dir.c (dir_read):
- Ignore st_size of directories: POSIX says it's garbage.
- Check for integer overflow to avoid core dumps.
- (diff_dirs): 0 -> EXIT_SUCCESS, 2 -> EXIT_TROUBLE.
-
- * src/ifdef.c: Include <xalloc.h>.
- (format_group, print_ifdef_lines): Avoid core dumps with bad formats.
- (do_printf_spec): Avoid alloca.
-
- * src/io.c (sip):
- Avoid integer overflow and core dumps if buffer alignments are
- preposterously incompatible.
- (slurp): Do not dump core if the file is growing as we read it.
- If a regular file grows, keep reading until we catch up with its EOF.
- (find_and_hash_each_line): Check for integer overflow to avoid cores.
- (GUESS_LINES): Remove.
- (guess_lines): New function. Avoid integer overflow.
- (find_identical_ends): Use it.
- Avoid integer overflow and possible core dumps.
-
- * src/sdiff.c: Include c-stack.h, exitfail.h. Do not include signal.h.
- 0 -> EXIT_SUCCESS, 1 -> EXIT_FAILURE, 2 -> EXIT_TROUBLE.
- (ck_editor_status): New function.
- (main): Check for stack overflow.
- Adopt POSIX convention for subsidiary programs not found.
- (diffarg): Check for integer overflow to avoid core dumps.
- (trapsigs): Remove SA_INTERRUPT special case; now done by header.
- (SIGCHLD): Likewise.
- (edit): Adopt POSIX convention for subsidiary programs not found.
-
- * src/side.c: unsigned -> unsigned int.
-
- * src/system.h: Don't use alloca or include <alloca.h>.
- unsigned -> unsigned int
- (EXIT_SUCCESS, EXIT_FAILURE, EXIT_TROUBLE): Define if not defined.
- Include signal.h.
- (SA_RESTART): Define if not defined.
- (SIGCHLD): Likewise.
-
- * src/util.c: 2 -> EXIT_TROUBLE.
- Adopt POSIX convention for ENOEXEC and exit status 126.
- unsigned -> unsigned int
-
-2002-01-24 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AC_INIT, AM_INIT_AUTOMAKE): Version 2.7.7.
-
- * intl/plural.c: Regenerate with Bison 1.31.
-
- * ABOUT-NLS, intl/*: Update to Gettext 0.11-pre5++.
- * INSTALL: Update to Autoconf 2.52f.
-
- * INSTALLME: New file.
- * Makefile.am (EXTRA_DIST): Add config/config.rpath, INSTALLME.
- (DISTCLEANFILES): Remove.
- * NEWS: Reformat for imminent 2.8 release.
- * README: Mention INSTALLME.
- * README-alpha: Move most of contents to INSTALLME.
- * THANKS: Add Bruno Haible, Jim Meyering, and Eli Zaretskii.
-
- * config: New subdirectory, containing the following files from .:
- config.guess, config.sub, depcomp, missing, install-sh, mkinstalldirs.
- Move the following files here from doc: texinfo.tex, mdate-sh.
- * config/config.guess, config/config.sub, config/texinfo.tex:
- Update to latest version from FSF.
- * config/config.rpath: New file, from Gettext 0.11-pre5++.
-
- * configure.ac (AC_INIT): Use new 3-arg form.
- (AC_CONFIG_SRCDIR): Specify src/diff.c here, not in AC_INIT.
- (ALL_LINGUAS): Remove: now in po/LINGUAS as per Gettext 0.11.
- (AC_CONFIG_AUX_DIR): New macro invocation.
-
- * lib/Makefile.am (noinst_HEADERS): Add gettext.h.
- * lib/gettext.h: New file, from Gettext 0.11-pre5++.
- * lib/prepargs.c: Include <string.h>. Reported by Bruno Haible.
-
- * m4/codeset.m4, m4/gettext.m4, glibc21.m4, iconv.m4, isc-posix.m4,
- lcmessage.m4, progtest.m4: Upgrade to Gettext 0.11-pre5++.
- * m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: New files, from
- Gettext 0.11-pre5++.
-
- * po/LINGUAS: New file.
- * po/Makefile.in.in: Upgrade to Gettext 0.11-pre5++.
- * po/Makevars, po/Rules-quot, po/boldquot.sed: New files,
- from Gettext 0.11-pre5++.
-
- * src/cmp.c (copyright_string): Update to 2002.
- * src/diff.c (copyright_string): Likewise.
- * src/diff3.c (copyright_string): Likewise.
- * src/sdiff.c (copyright_string): Likewise.
-
- * src/cmp.c (specify_ignore_initial): Renamed from
- parse_ignore_initial, with different signature, to take the
- maximum of multiple options rather than the last one.
- All uses changed.
-
- * src/cmp.c (bytes, specify_ignore_initial, cmp): Use UINTMAX_MAX
- instead of (uintmax_t) -1, to avoid warnings on some compilers.
- * src/io.c (file_block_read): Likewise, for SIZE_MAX.
-
- * src/cmp.c (usage): Reformat messages to ease translation.
- * src/diff3.c (usage): Likewise.
- * src/sdiff.c (usage): Likewise.
-
- * src/cmp.c (main): Two files with the same name are identical
- only if the same offset is specified.
- (block_compare_and_count): Avoid cast to unsigned char.
-
- * src/diff3.c (main): Remove unused variable.
-
- * src/dir.c: Include <setjmp.h>
- (struct dirdata): New member nnames.
- (locale_specific_sorting, failed_strcoll): New vars.
- (dir_read): Renamed from dir_sort. Don't sort the dir.
- Set new nnames member of struct dirdata. All callers changed.
- (compare_names): Don't check for errno after strcasecmp.
- Use strcoll only if locale_specific_sorting is nonzero.
- If strcoll fails, longjmp out rather than returning a value
- that might result in an invalid comparison function that might
- make qsort dump core.
- (diff_dirs): Sort the directory ourselves. Use setjmp to recover
- from strcoll failure, falling back on native byte comparison.
- Make local variables volatile if they need to preserve their value
- after setjmp/longjmp.
-
- * src/sdiff.c (handler_index_of_SIGINT, handler_index_of_SIGPIPE):
- New macros.
- (main): Do not confuse signal numbers with their indices.
- Bug reported by Bruno Haible.
- (edit): Cat lin to long before printing with %ld, since lin might
- be narrow than long.
-
- * src/system.h (UINTMAX_MAX): New macro.
- Include gettext.h, not libgettext.h.
- (N_): Do not wrap arg in parentheses. Fix from Bruno Haible.
-
- * src/util.c (finish_output): Ensure that werrno is initialized.
- (lines_differ): Have an explicit do-nothing case for
- IGNORE_NO_WHITE_SPACE, to pacify gcc -Wall.
-
-2001-12-29 Eli Zaretskii <eliz@is.elta.co.il>
-
- * src/sdiff.c (interact): After extracting rlen from the editor
- command, test for a terminating null character, not for a newline.
-
- * ms/config.bat: Allow longer source directory names without
- overflowing the line length limits. Create the cache in the
- build directory, not in the source directory
- * ms/config.sed: Fix AC_CONFIG_LINKS for when symlinks are
- unavailable.
-
-2001-12-23 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 2.7.6.
-
- * configure.ac (ALL_LINGUAS): Add tr.
-
- * src/util.c (begin_output):
- Have child exit with status 127 rather than reporting
- failure on its own. Set errno to 0 before invoking popen.
- (finish_output): Report errno on pclose failure.
- Distinguish between subsidiary program not found, and failure.
-
- * src/sdiff.c (not_found, execdiff): Remove.
- (DIFF_PROGRAM_OPTION): New constant.
- (longopts, option_help_msgid, main): Add --diff-program=PROGRAM.
- (check_stdout): New function.
- (main): Remove DIFF_PROGRAM. Check stdout after printing version.
- Use check_stdout after printing help. Use execvp/perror_fatail rather
- than execdiff. Set errno to 0 before invoking popen.
- Check for pclose failure properly.
- (main, edit): If child exec fails, exit with 127 rather than trying to
- print diagnostic.
- Distinguish between subsidiary program failing and not being found.
- (edit): Handle signals the same way, regardless of whether we're using
- system or fork+exec. Check for system returning -1.
-
- * src/diff3.c (DIFF_PROGRAM_OPTION, HELP_OPTION): New constants.
- (longopts, main): Use them.
- (longopts, main, option_help_msgid): New option --diff-option=PROGRAM.
- (main): Remove DIFF_PROGRAM support.
- Check stdout after printing version.
- (check_stdout): Report errno info if fclose fails.
- (read_diff): Have child exit with status 127 when program is not found,
- rather than trying to have the child report failure. Check for
- pclose returning -1.
-
- * src/diff.c (DEFAULT_WIDTH): Remove.
- (main): Use 130 instead of DEFAULT_WIDTH, since it's not really
- builder-settable. Do not prepend DIFF_OPTIONS.
- (check-stdout): If fclose (stdout) fails, print errno info.
- (option_help_msgid): Default context is 3, not 2.
- (usage): Work even if ptrdiff_t is wider than int.
-
- * doc/diff.texi (diff Options): Remove DIFF_OPTIONS.
- (Invoking diff3, Invoking sdiff): Remove DIFF_PROGRAM.
- (diff3 Options, sdiff Options): Add --diff-program.
-
- * src/cmp.c (valid_suffixes):
- Add '0', to support suffixes like "MB" and "MiB".
- (check_stdout): Don't assume that the translations of "write failed"
- and of "standard output" lack '%'.
- (main): Check stdout after printing version.
-
- * lib/setmode.c: [HAVE_FCNTL_H && HAVE_SETMODE_DOS]: Include <fcntl.h>.
- [!HAVE_SETMODE_DOS]: Do not include <unistd.h>.
- (set_binary_mode): Return mode (not 1) if fd is a tty.
- Do not assume that O_TEXT is zero.
-
- * doc/diff.texi (cmp Options):
- In byte counts, a plain suffix (without any integer)
- is assumed to modify the integer 1. Index terms like "kibibyte".
- Document plain "k".
-
- (Reporting Bugs): Mention bug-report archive and test version
- location. Ask for "diff --version" in bug reports.
-
-2001-12-13 Paul Eggert <eggert@twinsun.com>
-
- * src/diff.c (DEFAULT_WIDTH): Remove; couldn't be changed without
- also changing option_help_msgid. All uses replaced with 130.
-
- * lib/setmode.c: Include fcntl.h and unistd.h only if
- HAVE_SETMODE_DOS.
- (setmode): Assume a file is binary unless the mode is O_TEXT.
- * ms/README: Fix minor typos.
-
-2001-12-13 Eli Zaretskii <eliz@is.elta.co.il>
-
- * ms/README: New file.
-
- * lib/setmode.c (set_binary_mode) [HAVE_SETMODE_DOS]: Don't assume
- O_TEXT has a zero value. If FD is a terminal device, do nothing
- and return MODE, thus pretending that it was already in the
- requested MODE.
- [HAVE_FCNTL_H]: Include fcntl.h (needed for O_BINARY).
-
- * ms/config.sed: Remove the split prevention of config.status.
- Fix Sed commands for converting absolute file names into
- top_srcdir-relative ones.
-
- * ms/config.bat: Fix typos.
-
-2001-12-12 Neal H Walfield <neal@cs.uml.edu>
-
- * diff.c (option_help_msgid): Correct the default context width
- from 2 to 3.
-
-2001-12-11 Paul Eggert <eggert@twinsun.com>
-
- * m4/Makefile.am.in: Remove jm-glibc-io.m4
-
- * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 2.7.5.
-
- * configure.ac (PR_PROGRAM): Use AC_DEFINE_UNQUOTED, so that
- $PR_PROGRAM is expanded by sh.
- (ptrdiff_t, ssize_t): Use AC_CHECK_TYPE with a default of int,
- not AC_CHECK_TYPES.
- (jm_AC_DOS, AC_FUNC_SETMODE_DOS): New macros.
- (AC_CONFIG_FILES): Add ms/Makefile.
-
- * doc/diff.texi: Add --no-ignore-file-name-case.
- File name case sensitivity now affects file name exclusion.
- Fix typos.
-
- * src/util.c: Include dirname.h.
- (dir_file_pathname): Use base_name rather than file_name_lastdirchar.
-
- * src/system.h (S_IXUSR, S_IXGRP, S_IXOTH): New macros.
- Include <libgettext.h> rather than rolling it ourselves.
- (file_name_lastdirchar, HAVE_SETMODE, set_binary_mode): Remove.
-
- * src/sdiff.c: Include <dirname.h>.
- (expand_name): Use base_name rather than file_name_lastdirchar, for
- portability to DOS.
- (main): Initialize xalloc_exit_failure before possibly invoking
- any memory allocator.
-
- * src/io.c: Include setmode.h.
-
- * src/diff3.c (main):
- Initialize xalloc_exit_failure before possibly invoking any memory
- allocator.
-
- * src/diff.c: Include dirname.h, setmode.h.
-
- (main): Later values and/or styles now silently override earlier.
- (specify_value, specify_style): Likewise. All callers changed.
- Remove.
- (binary, main, option_help_msgid, compare_files):
- HAVE_SETMODE -> HAVE_SETMODE_DOS.
- (NO_IGNORE_FILE_NAME_CASE_OPTION): New constant.
- (longopts, main, option_help_msgid): Support it.
- (exclude_options): New function.
- (main): Use it. Initialize xalloc_exit_failure before potentially
- allocating memory.
-
- (filetype): Distinguish executable files from others, as POSIX
- suggests.
-
- (compare_files): Use base_name instead of file_name_lastdirchar.
-
- * src/cmp.c: Include <hard-locale.h>, <setmode.h>.
- (hard_locale_LC_MESSAGES): New macro.
- (sprintc): Remove int width arg; it's now the caller's responsibility
- to pad. All callers changed.
- (stat_buf): New static var; was formerly a local var in 'main'.
- (valid_suffixes): Add 'K', for 'KiB'.
- (option_help_msgid): Don't confuse bytes with characters.
- (main): Set xalloc_exit_failure before invoking anything that might
- allocate memory. Fix bug: -n was incorrectly ignored when optimizing
- the case of regular files with different lengths.
- (cmp): Use an index column wide enough to store this comparison's
- indexes. In locales other than the POSIX locale, say "byte"
- rather than "char".
-
- * ms/config.bat: pc -> ms
-
- * ms/Makefile.am, m4/setmode.m4, lib/setmode.c, lib/setmode.h:
- New file.
-
- * lib/Makefile.am (noinst_HEADERS): Add dirname.h, setmode.h.
- (libdiffutils_a_SOURCES): Add basename.c, setmode.c.
-
- * Makefile.am (SUBDIRS): Add ms.
-
-2001-12-10 Paul Eggert <eggert@twinsun.com>
-
- * m4/fnmatch.m4: Test for FNM_CASEFOLD.
-
-2001-12-03 Paul Eggert <eggert@twinsun.com>
-
- * lib/posix/regex.h: Fix copyright notice.
-
-2001-12-03 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 2.7.4.
-
- * diff.texi (direntry, Overview, Comparison, Binary, Invoking cmp):
- Use "byte" rather than "character" when talking about cmp, since
- it compares bytes, not character.
- (Invoking cmp): New trailing operands FROM-SKIP and TO-SKIP.
- -i or --ignore-initial now accepts FROM-SKIP:TO-SKIP.
- New option -n or --bytes.
- Count operands now may be in octal or hex, and may be followed by a
- size multiplier.
-
- * configure.ac (DEFAULT_DIFF_PROGRAM):
- Define to "diff", not "$bindir/diff" (which didn't work anyway).
- (AC_CHECK_MEMBERS): Add struct stat.st_blksize, struct stat.st_rdev.
- (AC_STRUCT_ST_BLKSIZE, AC_STRUCT_ST_RDEV): Remove; obsolescent.
- (AC_FUNC_FORK): Use this, instead of obsolescent AC_FUNC_VFORK.
- (AC_CONFIG_FILES, AC_CONFIG_COMMANDS): Add.
- (AC_OUTPUT): Remove args; they were obsolescent.
-
- * util.c (setup_output, begin_output, finish_output):
- HAVE_FORK -> HAVE_WORKING_FORK || HAVE_WORKING_VFORK.
- * sdiff.c (diffpid, cleanup, main, edit): Likewise.
- * diff3.c (read_diff): Likewise.
-
- * system.h (STAT_BLOCKSIZE):
- Use HAVE_STRUCT_STAT_ST_BLKSIZE, not HAVE_ST_BLKSIZE.
- (vfork): New macro.
- (HAVE_FORK): Remove.
- (set_binary_mode): New macro.
-
- * sdiff.c (main): HAVE_VFORK -> HAVE_WORKING_VFORK.
- (edit): Reopen the temporary file after the editor has run, in case
- the editor operates by unlinking the old file and linking a new one.
- (P_tmpdir): Rename from PVT_tmpdir; this fixes a typo.
- All uses changed.
-
- * io.c (sip, read_files):
- Remove tests for HAVE_SETMODE; use set_binary_mode
- instead of setmode.
- (sip): Fix typo in backward lseek when reverting to text mode.
-
- * config.site, config.sed, config.bat: New file.
-
- * Makefile.am (EXTRA_DIST): Add xstrtol.c.
- (noinst_HEADERS): Add xstrtol.h.
- (libdiffutils_a_SOURCES): Add xstrtoumax.c.
-
- * cmp.c: <xstrtol.h>: Include.
- (ignore_initial): Now an array with 2 elements. All uses changed.
- (bytes): New var.
- (HELP_OPTION): New constant.
- (long_options, main): Use it.
- (long_options, option_help_msgid, main, cmp):
- Add support for -n or --bytes.
- (parse_ignore_initial): New function.
- (option_help_msgid, main): Add -i M:N.
- (usage, main): Add two optional trailing operands, a la BSD.
- (main): setmode -> set_binary_mode.
- (cmp): Report byte number of what we've seen, not of the entire file.
- This is to be consistent with the line number, which is always relative
- with what we've seen.
-
-2001-12-02 Paul Eggert <eggert@twinsun.com>
-
- * diff.c (main, compare_files): setmode -> set_binary_mode.
-
- * xstrtol.c (__xstrtol): Don't accept 'Ki'; require 'KiB'.
-
- * xstrtol.c (__xstrtol): Add support for IEC 60027-2.
-
-2001-11-25 Paul Eggert <eggert@twinsun.com>
-
- * NEWS, configure.ac (AM_INIT_AUTOMAKE): Version 2.7.3.
-
- * README-alpha: New file.
-
- * src/Makefile.am (INCLUDES): Add -I../lib, for regex.h.
-
- * configure.ac:
- Don't set LIB_CLOCK_GETTIME to 'none required'; set it to
- the empty string instead.
-
- * lib/Makefile.am (EXTRA_DIST): Add strtoimax.c, strtol.c.
-
- * Makefile.am (SUBDIRS): Put intl before lib, so that libintl.h exists.
-
- * lib/Makefile.am (noinst_HEADERS): Add unlocked-io.h.
-
- * configure.ac (__EXTENSIONS__): New define, for the unlocked macros.
-
- * README: Add copyright notice.
- Remove stuff that doesn't apply any more.
-
- * doc/diff.texi: offsets -> indices for cmp
-
- * src/cmp.c (option_help_msgid): offsets -> indices
-
- * src/diff.c (option_help_msgid):
- Don't mention --binary on POSIX hosts.
-
- * src/sdiff.c (STRIP_TRAILING_CR_OPTION): New constant.
- (longopts, option_help_msgid, main): Add -E, --ignore-tab-expansion,
- --strip-trailing-cr.
-
- * doc/diff.texi: Change direcategory from Utilities to GNU Packages.
- Add individual utilities.
- Switch to Free Documentation License.
- @code -> @command
- @samp -> @option
- GNU -> @sc{gnu}
- Expand tabs to spaces, except when in an example that actually
- uses tabs.
- Prefer @node with just one arg.
- Document -E or --ignore-tab-expansion, --strip-trailing-cr,
- --ignore-file-name-case.
- Regular expressions are now grep style, not Emacs style.
- cmp's -c or --print-chars option is now -b or --print-bytes.
- Time stamps now depend on LC_TIME.
- -p now implies ^[[:alpha:]$_].
- Flags now include ' and 0.
- cmp -i is an alias for --ignore-initial
- Document --from-file, --to-file.
- Document DIFF_OPTIONS.
-
- * configure.ac (AC_CHECK_FUNCS): Add gettimeofday, clock_gettime.
- (LIB_CLOCK_GETTIME): New subst.
-
- * src/system.h: Assume C89 or better.
- (_GNU_SOURCE): Remove; config.h now defines it.
- (alloca): Declare like coreutils does it.
- (verify, TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM, O_RDWR,
- S_IRUSR, S_IWUSR): New macros.
- (STAT_BLOCKSIZE): Parenthesize definiens.
- <inttypes.h>: Include if HAVE_INTTYPES_H.
- (CHAR_MAX, INT_MAX): Remove.
- (PTRDIFF_MAX, SIZE_MAX): New macros.
- (strtoumax): New decl.
- Include stddef.h.
- (bzero): Remove.
- (bindtextdomain, textdomain, N_): New macros.
- (ISPRINT, ISSPACE): Remove ifndef wrappers.
- (ISUPPER, ISDIGIT): Remove.
- (TOLOWER): New macro.
- (MIN): Renamed from min; all callers changed.
- (MAX): Likewise, from max.
- (lin): New type.
- (LIN_MAX): New macro.
- (file_name_cmp): Renamed from filename_cmp. All callers changed.
- (file_name_lastdirchar): Renamed from file_name_lastdirchar.
- All callers changed.
- (could_be_mvfs_stat_bug, could_be_nfs_stat_bug,
- dev_may_have_duplicate_ino): Remove.
- (HAVE_SETMODE, NULL_DEVICE): New macros.
- (same_file): Do not check attributes.
- (same_file_attributes): New macro.
-
- * src/util.c: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
- int -> size_t for sizes.
- Use angle-brackets when including quotesys.h.
- Include error.h, regex.h, xalloc.h.
- (message5): sizeof -> offsetof
- (begin_output): Invoke pr without -f.
- (lines_differ): Renamed from line_cmp, and return bool not 3-way int.
- All callers changed.
- Add support for IGNORE_TAB_EXPANSION.
- (change_letter): Now an array rather than a function. All
- callers changed.
- (translate_range): Translate line numbers to long, not lin,
- for convenience with printf.
- (analyze_hunk): Return enum changes instead of a count of
- inserts and deletes. All callers changed.
- (zalloc): New function.
-
- * src/side.c: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
-
- * src/sdiff.c: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
- Use angle-brackets when including getopt.h, quotesys.h.
- Include error.h, freesoft.h, stdio.h, xalloc.h.
- (copyright_string): Use only most recent year.
- (authorship_msgid, option_help_msgid): Wrap in N_().
-
- (tmpname): Now volatile.
- (tmpmade): Remove.
- (tmp): New var.
- (private_tempnam, exists, letters): Remove.
- (temporary_file): New function.
- (edit): Use it.
- (interact): Use strtoumax, not atoi.
-
- * src/normal.c: Assume C89 or better.
- int -> lin for line numbers.
-
- * src/io.c: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
- int -> size_t for sizes.
- Use angle-brackets when including cmpbuf.h.
- Include regex.h, xalloc.h.
- (word): Remove; now done in system.h.
- (hash_value): New type; use it instead of 'unsigned' for hash values.
- (file_block_read): New function.
- (sip, slurp): Use it. Now static.
- (sip): Ensure block size is a multiple of word size. Clear eof flag.
- (slurp): Use xalloc_die to report memory exhaustion.
- (find_and_hash_each_line): Use TOLOWER instead of _tolower.
- Add support for IGNORE_TAB_EXPANSION.
- (prepare_text_end): Strip trailing CR if requested.
- (find_identical_ends): Prepare the text only once,
- if they're duplicates.
- Let the compiler take advantage more of the fact that the buffers are
- word-aligned.
- (primes): Remove.
- (prime_offset): New var.
- (read_var): Use prime_offset instead of primes.
- Use zalloc instead of xmalloc + bzero.
-
- * src/ifdef.c: Assume C89 or better.
- int -> lin for line numbers.
- (format_group): Use strtoumax to parse line numbers.
- (format_group, print_ifdef_lines): Use do_printf_spec to
- handle printf specs.
- (groups_letter_value): Don't use _tolower; it's locale-dependent.
- (do_printf_spec): Renamed from scan_printf_spec; now does the printing.
-
- * src/ed.c: Assume C89 or better.
- int -> lin for line numbers (or 'long' when that's more convenient).
- (print_ed_hunk): Fix bug when handling double-dot inserts.
-
- * src/dir.c: Assume C89 or better.
- int -> bool for booleans.
- Include error.h, exclude.h, xalloc.h.
-
- (dir_sort): Return 0 on error, 1 on success. All callers changed.
- compare_names -> compare_names_for_qsort.
-
- (compare_names): Try strcasecmp if ignore_file_name_case. Then try
- strcoll. Use file_name_cmp only as a last resort. Warn about
- strcasecmp or strcoll failure.
- (compare_names_for_qsort): New function.
-
- (diff_dirs): Use compare_names rather than filename_cmp.
-
- * src/diff3.c: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
- Use angle-brackets when including getopt.h, quotesys.h.
- Include error.h, freesoft.h, inttostr.h, xalloc.h.
- (copyright_string): Use only most recent year.
- (authorship_msgid, option_help_msgid): Wrap in N_().
-
- Rename the following variables for consistency with user-visible
- option spellings. All uses changed.
- (text): Renamed from always_text.
- (initial_tab): Renamed from tab_align_flag.
-
- (horizon_lines): Remove. Remove all uses.
-
- (main): Invoke bindtextdomain and textdomain after setlocale.
- Rename "DIFF" to "DIFF_PROGRAM".
-
- 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.
- However, use file2 as the common file if this is a 3-way diff,
- for backward compatibility. Suggested by Karl Tomlinson.
-
- (create_diff3_block): Use xcalloc instead of malloc + bzero.
-
- (INT_STRLEN_BOUND): Remove; now in system.h.
-
- (read_diff): Always use --horizon-lines=100 rather than trying
- to guess it.
- Do not pass --inhibit-hunk-merge.
- Minimum chunk size is 1, not 8KiB.
- Use xalloc_die to report memory exhaustion.
- (undotlines): Use long for start, not int.
-
- * src/diff.h: Assume C89 or better.
- int -> bool for booleans.
- int -> lin for line numbers.
- Don't include regex.h.
- (enum changes): New enum.
- (enum line_class): Remove; subsumed by enum changes.
- (enum output_style): New constant OUTPUT_UNSPECIFIED.
-
- (ignore_space_change_flag, ignore_all_space_flag): Remove.
- (ignore_white_space): New decl, subsuming the above two. All
- uses changed.
-
- Rename the following decls for consistency with user-visible
- option spellings. All uses changed.
- (text): Renamed from always_text_flag.
- (ignore_blank_lines): Renamed from ignore_blank_lines_flag.
- (ignore_case): Renamed from ignore_case_flag.
- (brief): Renamed from no_details_flag.
- (initial_tab): Renamed from tab_align_flag.
- (expand_tabs): Renamed from tab_expand_flag.
- (starting_file): Renamed from dir_start_file.
- (paginate): Renamed from paginate_flag.
- (sdiff_merge_assist): Renamed from sdiff_help_sdiff.
- (left_column): Renamed from sdiff_left_only.
- (suppress_common_lines): Renamed from sdiff_skip_common_lines.
- (speed_large_files): Renamed from heuristic.
- (minimal): Renamed from no_discards.
-
- (inhibit_hunk_merge): Remove.
-
- (strip_trailing_cr, excluded, time_format): New decls.
-
- (files_can_be_treated_as_binary): Renamed from ignore_some_changes.
-
- (group_format, line_format): Now char const *[], not char *[].
-
- (struct file_data): Buffer is now word*, not char*, as it's always
- aligned and this can help the compiler. buffered_chars -> buffered
- (since it's a byte count, not a char count). All uses changed.
- New member `eof'.
-
- (FILE_BUFFER): New macro.
-
- (excluded_filename, error, free_software_msgid): Remove decls; now in
- other .h files.
-
- (sip, slurp): Remove decls.
- (file_block_read): New decl.
- (change_letter): Now an array, not a function.
- (lines_differ): Renamed from line_cmp.
- (analyze_hunk): Now returns enum changes rather than two change counts.
-
- * src/Makefile.am (diff_LDADD): New symbol.
-
- * src/diff.c: Assume C89 or better.
- int -> bool for booleans.
- long -> off_t for line numbers.
- Use angle-brackets when including getopt.h, fnmatch.h, quotesys.h.
- Include error.h, exclude.h, freesoft.h, hard-locale.h, prepargs.h,
- regex.h, signal.h, xalloc.h.
- (copyright_string): Use only most recent year.
- (authorship_msgid, option_help_msgid): Wrap in N_().
-
- Rename the following variables for consistency with user-visible
- option spellings. All uses changed.
- (binary): Renamed from binary_flag.
- (new_file): Renamed from entire_new_file_flag.
- (unidirectional_new_file): Renamed from unidirectional_new_file_flag.
- (report_identical_files): Renamed from print_file_same_flag.
-
- (numeric_arg): Remove.
-
- (exclude, exclude_alloc, exclude_count, excluded_filename, add_exclude,
- add_exclude_file):
- Remove; now done by exclude.h.
-
- (BINARY_OPTION, FROM_FILE_OPTION, HELP_OPTION, HORIZON_LINES_OPTION,
- IGNORE_FILE_NAME_CASE_OPTION, INHIBIT_HUNK_MERGE_OPTION,
- LEFT_COLUMN_OPTION, LINE_FORMAT_OPTION, NORMAL_OPTION,
- SDIFF_MERGE_ASSIST_OPTION, STRIP_TRAILING_CR_OPTION,
- SUPPRESS_COMMON_LINES_OPTION, TO_FILE_OPTION,
- UNCHANGED_LINE_FORMAT_OPTION, OLD_LINE_FORMAT_OPTION,
- NEW_LINE_FORMAT_OPTION, UNCHANGED_GROUP_FORMAT_OPTION,
- OLD_GROUP_FORMAT_OPTION, NEW_GROUP_FORMAT_OPTION,
- CHANGED_GROUP_FORMAT_OPTION): New constants.
- (longopts, main): Use them.
-
- (longopts, main, option_help_msgid): Add -E, --from-file, --to-file.
-
- (main): Invoke bindtextdomain and textdomain after setlocale.
- Use grep syntax, not Emacs, for regular expressions.
- Use exclude.h, not our own functions.
- Use ISO 8601 time format in hard locales.
- Prepend DIFF_OPTIONS.
- Don't update ignore_some_changes.
- Use strtoumax instead of numeric_arg.
- Use specify_value when appropriate.
- error -> try_help when appropriate.
- -p now means ^[[:alpha:]$_], not ^[_a-zA-Z$].
- Ignore --inhibit-hunk-merge.
- Prefer changed group formats to unchanged ones.
- Remove now-unnecessary casts.
- Set files_can_be_treated_as_binary.
-
- (specify_value): Renamed from specify_format. All uses changed.
-
- (specify_style): Default is now unspecified, not normal. All
- uses changed.
-
- (set_mtime_to_now): New function.
- (compare_files): Use it. Use memset, not bzero.
- Set stdin mtime to current time even when stdin is not a regular file.
- Check for same file attributes, as well as for same file.
- Use files_can_be_treated_as_binary.
- "write failed" -> "standard output on output failure.
-
- * src/context.c: Assume C89 or better.
- int -> lin for line numbers.
- Include inttostr.h, regex.h.
- (TIMESPEC_NS): New macro.
- (nstrftime): New decl.
- (print_context_label): Use nstrftime and time_format to format times.
- Print numeric time stamp value if localtime fails.
- (print_context_function): New function.
- (pr_context_hunk, pr_unidiff_hunk): Use it.
- (find_function): Use size_t for sizes, not int.
-
- * src/cmp.c: Assume C89 or better.
- int -> bool for booleans.
- long -> off_t for line numbers.
- Use angle-brackets when including cmpbuf.h, getopt.h.
- Include error.h, freesoft.h, inttostr.h, xalloc.h.
- (copyright_string): Use only most recent year.
- (authorship_msgid): Wrap in N_().
- (buffer): Now word*, not char*. All uses changed.
- (word): Remove macro; now in system.h.
- (long_options, option_help_msgid, main): -c --print-chars ->
- -b --print-bytes
- (check_stdout): "write failed" -> "standard output"
- (option_help_msgid): Wrap in N_().
- (main): Invoke bindtextdomain and textdomain after setlocale.
- Use strtoumax instead of doing the work ourselves.
- Check for same_file_attributes as well as same_file.
- (cmp): Use ssize_t for read returns, not size_t.
- Do not assume that size_t is not narrower than int.
- Do not assume that line numbers fit in 'long'.
- (block_compare_and_count, block_compare):
- Compiler now checks that buffers are word-aligned.
- (block_compare_and_count): Count sizes with size_t, not long.
- (sprintc): byte arg is unsigned char, not unsigned.
-
- * src/analyze.c: Assume C89 or better.
- int -> lin for line numbers.
- int -> bool for booleans.
- unsigned int -> size_t for sizes.
- Use angle-brackets when including cmpbuf.h.
- Include error.h, regex.h, xalloc.h.
- (discard_confusing_lines, diff_2_files): Use zalloc rather
- than xalloc+bzero.
- (discard_confusing_lines): unsigned int -> lin for values that
- are really line numbers.
- (shift_boundaries): Do not inhibit hunk merges.
- (build_reverse_script, build_script, diff_2_files): Use |, not ||.
- (diff_2_files): no_details_flag & ~ignore_some_changes ->
- files_can_be_treated_as_binary. Esure that buffer size is a multiple
- of sizeof (word). Use file_block_read to read buffers.
- (diff_2_files): Abort if output style is not one of the
- expected styles.
-
-2001-11-23 Paul Eggert <eggert@twinsun.com>
-
- * src/Makefile.am, m4/vararrays.m4: New file.
-
- * m4/prereq.m4 (jm_PREREQ_READUTMP):
- Remove, as it gives autoheader the willies.
-
- * m4/README, lib/prepargs.h, lib/prepargs.c, lib/offtostr.c,
- lib/umaxtostr.c, lib/inttostr.c, lib/inttostr.h,
- lib/imaxtostr.c, lib/freesoft.h: New files.
-
- * lib/freesoft.c: Include config.h, freesoft.h rather than diff.h.
- (free_software_msgid): Wrap contents in N_.
-
- * lib/cmpbuf.h: Use prototypes instead of old-style functions.
-
- * lib/cmpbuf.c:
- Don't include system.h; instead, include config.h, unistd.h.
- Use prototypes instead of old-style functions.
- (block_read): Don't assume that int is no wider than size_t.
-
- * lib/Makefile.am, po/POTFILES.in: New file.
-
-2001-11-22 Paul Eggert <eggert@twinsun.com>
-
- * pc/config.h:
- Define filename_cmp as an object-like macro, not as a function-like
- macro.
-
- * exgettext: Always operate in the C locale.
- Set AWK using a method that works even with broken shells.
-
- * doc/Makefile.am: New file.
-
- * configure.ac (AC_INIT):
- Use src/diff.c, not diff.h, as the source files got removed.
- (AM_CONFIG_HEADER): Switch from AC_CONFIG_HEADER.
- (AC_ARG_PROGRAM, AC_MINIX): Remove.
-
- (AC_PREREQ, AM_INIT_AUTOMAKE, ALL_LINGUAS, AC_PROG_AWK,
- AM_PROG_CC_STDC, AC_PROG_RANLIB, AC_C_INLINE, AC_C_VARARRAYS,
- DEFAULT_DIFF_PROGRAM, DEFAULT_EDITOR_PROGRAM,
- AC_STRUCT_ST_MTIM_NSEC): Add.
-
- (PR_PROGRAM): AC_DEFINE.
-
- (AC_SYS_LARGEFILE): Use instead of our homebrew version.
-
- (_GNU_SOURCE): Define if not defined.
-
- (AC_CHECK_HEADERS): Add stdbool.h, unistd.h.
- (AC_CHECK_TYPES): Add ptrdiff_t, uintmax_t.
- (AM_GNU_GETTEXT, XGETTEXT): Add.
-
- (WITH_MVFS_STAT_BUG, WITH_NFS_STAT_BUG): Remove.
- (HAVE_MEMCHR): Remove.
- (AC_CHECK_FUNCS): Add diraccess.
- (AC_REPLACE_FUNCS): Add memchr, waitpid.
- (jm_FUNC_GLIBC_UNLOCKED_IO, jm_FUNC_GNU_STRFTIME, jm_FUNC_MALLOC,
- jm_FUNC_REALLOC, jm_PREREQ_ERROR, jm_PREREQ_QUOTEARG, jm_PREREQ_REGEX,
- jm_PREREQ_TEMPNAME, jm_AC_PREREQ_XSTRTOUMAX, AC_FUNC_FNMATCH): Add.
- (fnmatch.h, regex.h): Do not create these files unless we're using
- our own fnmatch and regex.
-
- (AC_OUTPUT): Add doc/Makefile, intl/Makefile, lib/Makefile,
- lib/posix/Makefile, m4/Makefile, po/Makefile.in, src/Makefile.
-
- * Makefile.am: New file.
-
- * po/en_GB.po: Don't translate "program" to "programme".
-
-2001-11-20 Paul Eggert <eggert@twinsun.com>
-
- * m4/prereq.m4: New file.
-
-2001-03-16 Paul Eggert <eggert@twinsun.com>
-
- * lib/tempname.c (uint64_t):
- Define if not defined, and if UINT64_MAX is not defined.
-
-2001-02-26 Paul Eggert <eggert@twinsun.com>
-
- * lib/tempname.c: glibc 1.32
-
-2001-02-17 Paul Eggert <eggert@twinsun.com>
-
- * m4/Makefile.am.in: GNU fileutils 4.1
-
-2001-01-09 Paul Eggert <eggert@twinsun.com>
-
- * lib/tempname.c (struct_stat64): New macro.
- (direxists, __gen_tempname): Use it. This avoids a portability problem
- with Solaris 8.
-
- * lib/tempname.c (<config.h>): Include if HAVE_CONFIG_H.
- (<stddef.h>, <stdint.h>, <string.h>):
- Include only if STDC_HEADERS || _LIBC.
- (<fcntl.h>): Include only if HAVE_FCNTL_H || _LIBC.
- (<unistd.h>): Include only if HAVE_UNISTD_H || _LIBC.
- (<sys/time.h>): Include only if HAVE_SYS_TIME_H || _LIBC.
- (__set_errno): Define this macro if <errno.h> doesn't.
- (P_tmpdir, TMP_MAX, __GT_FILE, __GT_BIGFILE, __GT_DIR, __GT_NOCREATE):
- Define these macros if <stdio.h> doesn't.
- (S_ISDIR, S_IRUSR, S_IWUSR, S_IXUSR):
- Define these macros if <sys/stat.h>
- doesn't. Ignore <sys/stat.h> S_ISDIR if STAT_MACROS_BROKEN.
- (stat64, __getpid, __gettimeofday, __mkdir, __open, __open64, lxstat64,
- __xstat64): Define if not _LIBC.
- (__secure_getenv): Define if ! (HAVE___SECURE_GETENV || _LIBC).
- (__gen_tempname): Invoke gettimeofday only if HAVE_GETTIMEOFDAY
- || _LIBC; otherwise, fall back on plain "time".
- Use macros like S_IRUSR | S_IWUSR rather than octal values like 0600.
-
- * lib/mkstemp.c (__GT_FILE): Define to zero if not defined.
-
-2000-10-25 Paul Eggert <eggert@twinsun.com>
-
- * lib/hard-locale.c: New file.
-
-2000-02-05 Paul Eggert <eggert@twinsun.com>
-
- * exgettext: From GCC repository
-
-1999-07-06 Paul Eggert <eggert@twinsun.com>
-
- * lib/mkstemp.c: glibc 2.2
-
-1998-12-11 Paul Eggert <eggert@twinsun.com>
-
- * src/sdiff.c (lf_snarf):
- Fix bug when help line wrapped around the input buffer.
-
-1998-09-15 Paul Eggert <eggert@twinsun.com>
-
- * diff.texi: Add @dircategory and @direntry.
-
-1998-09-14 Paul Eggert <eggert@twinsun.com>
-
- * Makefile.in (VERSION): Version 2.7.2.
- (DEFAULT_DIFF_PROGRAM): Renamed from DIFF_PROGRAM.
- (PR_PROGRAM): All `configure' to define it.
- (srcs): Add $(diffutils_srcs), freesoft.c, quotearg.c instead of
- quote.c, quotearg.h.
- (distfiles): Add acconfig.h, message/*.
- (all): Depend on $(destfiles), not info.
- (version.c): Parenthesize `GNU diffutils'.
- (common_o): Add freesoft.o
- (diff_o): quote.o -> quotearg.o
- (diff3_o, sdiff_o): Likewise.
- (diff.dvi): Depend on version.texi.
- (diff.o diff3.o quotearg.o sdiff.o util.o):
- New dependency on quotearg.h
- (diff3.o): DIFF_PROGRAM -> DEFAULT_DIFF_PROGRAM.
- (sdiff.o): Likewise.
- (messages.po): Remove.
- (message/msgid.po, message/template.po): New rules.
- (maintainer-clean): Renamed from realclean.
- (install): Install from source directory, if applicable.
- Invoke install-info if needed.
- (install-strip): New rule.
- (check): Set DIFF.
- (stamp-h.in): Don't put the date into the timestamp.
- (D_dirs): Add $D/message.
- ($D.tar.gz): Compress with gzip -9.
- Don't use ln to create distribution; it doesn't work with symlinks.
- (srcs, distfiles, diff_o, diff3_o, sdiff_o): Rename quotearg.c to
- quotesys.c and quotearg.h to quotesys.h.
-
- * configure.in (AC_PATH_PROG): Add PR_PROGRAM.
- If available, prefer support for large files unless the user specified
- one of the CPPFLAGS, LDFLAGS, or LIBS variables.
- (AC_STRUCT_ST_RDEV): Add.
- (HAVE_ST_FSTYPE_STRING): Add.
- (--with-mvfs-stat-bug, --with-nfs-stat-bug): New options.
- (HAVE_MEMCHR): New macro.
- (AC_CHECK_FUNCS): Add sicprocmask.
-
- * diff.h (XTERN): Renamed from EXTERN.
- (struct filedata): Remove dir_p arg.
- (struct comparison): New type.
- (diff_2_files, diff_dirs)" Ise ot/
- (error): Add printf attribute if applicable.
- (free_software_msgid): New decl.
- (pr_program): New decl.
- (fatal): Add noreturn attribute.
- (pfatal_with_name): Likewise.
-
- * system.h (__attribute__): New macro.
- (getenv): Don't declare if HAVE_STDLIB_H.
- (CHAR_MAX): New macro.
- (<locale.h>): New include.
- (<locale.h>): Include before <libintl.h>.
- (could_be_mvfs_stat_bug, could_be_nfs_stat_bug,
- dev_may_have_duplicate_ino, same_special_file): New macros.
- (same_file): Use them.
-
- * cmp.c (authorship_msgid): New var.
- (free_software_msgid): New decl.
- (error): Now has printf attribute.
- (try_help): Likewise.
- (long_options): Don't assume ASCII.
- (try_help): Now accepts operand arg.
- (main): Check for -1, not EOF, when calling getopt_long.
- Report --ignore-initial value when complaining about it.
- Output copyright and free software info with -v.
- Don't assume ASCII.
- Report last operand when one is missing.
- Report text of extra operand.
- Move block_read into cmpbuf.c.
-
- * diff.c (authorship_msgid): New var.
- (quotesys.h): Include.
- (ck_atoi): Remove.
- (function_regexp_list, ignore_regexp_list): Now static.
- (binary_flag): Renamed from binary_I_O.
- (entire_new_file_flag, unidirectional_new_file_flag,
- print_file_same_flag): Now static.
- (numeric_arg): Renamed from ck_atoi.
- New argument specifying the argument type.
- (longopts, main): Don't assume ASCII.
- (longopts): Remove old aliases --file-label, --entire-new-file,
- --ascii, --print.
- (main): Check for -1, not EOF, when calling getopt_long.
- Use numeric_arg to report errors.
- Report error if -l specified but pagination is not supported.
- Report error if -S is specified twice with conflicting values.
- Have --version conform to the new GNU standards.
- Add new --from-file, --to-file, --inhibit-hun,-merge options.
- Make the horizon at least as large as the context.
- Add casts to pacify gcc -Wall.
- (try_help): Add operand arg.
- (option_help_msgid): Doc fix to match above.
- (usage): Indent option_help_msgid.
- (compare_files): Now takes struct comparison
- instead of two directory names and a depth.
- (NONEXISTENT, UNOPENED, ERRNO_ENCODE, ERRNO_DECODE):
- New macros.
- (DIR_P): New macro.
- Report error if fflush does.
-
- * cmpbuf.c (block_read): Moved here from cmp.c.
-
- * cmpbuf.h (block_read): New decl.
-
- * io.c (cmpbuf.h): Include.
- (slurp): Check for arithmetic overflow when computing buffer size.
-
- * dir.c (diff_dirs): Check for recursive directory loop.
- Arg is now struct comparison const *.
- (dir_loop): New function
-
- * analyze.c (no_discards): Remove.
- (inhibit): Remove.
- (shift_boundaries): Don't inhibit. If inhibit_hunk_merge is nonzero,
- don't merge hunks.
- (briefly_report): Now returns 2 if trouble, CHANGES otherwise.
- (diff_2_files): Now takes struct comparison. If briefly_report reports
- trouble, pass it on to caller.
-
- * side.c (print_half_line): Add brackets to pacify GCC -Wall.
-
- * sdiff.c (quotesys.h): Include.
- (DIFF_PROGRAM, DEFAULT_EDITOR_PROGRAM): Remove.
- (free_software_msgid, editor_program, not_found): New vars.
- (diffbin, edbin): Remove.
- (editor_program): Renamed from edbin.
- (edit, interact): Now take extra string arg.
- (exiterr, fatal, perror_fatal, try_help): Add noreturn attribute.
- (sigset_t, sigemptyset, sigmask, sigaddset, SIG_BLOCK, SIG_SETMASK):
- (sigprocmask): New macros, if !HAVE_SIGPROCMASK.
- (error): Now has printf attribute.
- (longopts, main): Don't assume ASCII.
- (try_help): New operand arg.
- (usage): Conform to new GNU standards.
- (main): Set static vars for editor and diff program.
- Compare getopt_long result to -1, not EOF.
- -v conforms to new GNU standard.
- Complain better about extra and missing operands.
- If HAVE_VFORK, block SIGINT and SIGPIPE in the parent, since when
- the child munges its handlers it may somp on the parent.
- Pass rname to intract.
- Translate not-found message before forking.
- (give_help): Just output it all at once.
- (edit): New args lname, lline, rname, rline.
- (edit): New command 'd'.
- (interact): New args lname, rname.
-
- * util.c (quotesys.h): Include.
- (PR_PROGRAM): New macro.
- (pfatal_with_name): Abort if error returns.
- (fatal): Likewise.
- (print_message_queue): Free message chain after printing.
- (currently_recursive): Renamed from current_depth, and now a boolean.
- (begin_output): Report error if fflush does.
- Avoid stdio and gettext in child.
-
- * diff3.c (quotesys.h): Include.
- (free_software_msgid): New decl.
- (RANGE_START, RANGE_END): Renamed from START and END.
- (fatal, perror_with_exit, try_help): Add noreturn attribute.
- (error): Add printf attribute.
- (diff_program): Now a ptr, not an array.
- Initialize to DEFAULT_DIFF_PROGRAM instead of DIFF_PROGRAM.
- (longopts, main): Don't assume ASCII.
- (main): Use DIFF environment var to specify name of diff program.
- Compare getopt_long result to -1, not EOF.
- -v now reports version according to new GNU standard.
- Report spelling of extra operand, or last operand before missing one.
- (try_help): Now takes operand arg.
- (option_help_ms): Fix typo: missing comma.
- (usage): Update as per current GNU standards.
- (environ): Remove decl.
- (read_diff): Invoke diff with --inhibit-hunk-merge.
- Translate `not found' message before forking.
- Quote name of diff program.
- Pass horizon lines.
- `memory exhausted' -> `Memory exhausted'
-
- * pc/makefile (%.exe): Remove.
- (pc-clean): Remove *.exe
- * pc/makefile.sed (DEFAULT_DIFF_PROGRAM): Renamed from DIFF_PROGRAM.
- When editing mkinstalldirs rule, look for exec_prefix and prefix.
- Add .exe when installing files.
- * pc/emx/config.h (same_file): Add.
- * pc/config.h (same_file): Remove.
- * pc/djgpp/config.h: Adjust to latest patch from eliz.
- * pc/djgpp/makefile.sed: Don't alter PROGRAMS.
- * pc/pc.c: Update FSF address.
- (quote_system_arg): Renamed from system_quote_arg.
-
- * README: Add --with-mvfs-stat-bug, --with-nfs-stat-bug.
-
- * getmsgids: Add copyright date and update FSF address.
-
- * diff.texi: Document recent changes.
- The patch doc still corresponds to patch 2.2, unfortunately.
- Update GNU bug reporting address. Omit Larry Wall's address;
- it's obsolete and he's busy with perl.
-
- * context.c: Fix spacing.
-
- * NEWS: Mention --from-file=FILE, --to-file=FILE, ed.
-
- * acconfig.h, freesoft.c, message/de.po, message/en_UK.po,
- message/es.po, message/fr.po, message/pl.po, message/sv.po:
- New files.
-
- * ed.c: Remove `#if 0'ed code.
-
- * normal.c, waitpid.c: Update FSF address.
-
-1998-03-15 Paul Eggert <eggert@twinsun.com>
-
- * quotesys.c: Renamed from quotearg.c.
-
- * quotesys.h: Renamed from quotearg.h
- (__QUOTESYS_P): Renamed from __QUOTEARG_P.
-
-1997-05-05 Paul Eggert <eggert@twinsun.com>
-
- * quotesys.c, quotesys.h: New file.
-
-Mon Nov 14 05:10:56 1994 Paul Eggert <eggert@twinsun.com>
-
- Add internationalization support.
- Several messages have been changed slightly,
- to make them more consistent and easier to translate.
- All strings that are messages are passed through gettext once before
- being used, so that they can be localized.
- Each function and macro whose first parameter is a gettext msgid
- has had its first parameter's name changed so it ends in `msgid'.
- All arrays of msgids have had their names changed to end in `msgid'.
- `getmsgids' uses this to determine which strings are msgids.
-
- * pc/COPYING, pc/INSTALL, pc/config.h,
- pc/djgpp/config.h, pc/djgpp/makefile.sed,
- pc/emx/config.h, pc/emx/diff.def, pc/emx/gnuregex.def,
- pc/emx/makefile.sed,
- pc/makefile, pc/makefile.sed, pc/pc.c: New files, for PC support.
-
- * getmsgids: New file.
-
- * Makefile.in (PACKAGE, VERSION, diffutils_srcs, D): New vars.
- (version.c, version.texi, messages.po): New files.
- messages.po is built automatically from source files and `getmsgids'.
- (distfiles): Add them, pc/*, and getmsgids.
- (diff.info): Now depends on version.texi.
- (realclean): Clean messages.po, version.*.
- (dist): Just build $D.tar.gz.
- ($D.tar.gz): New file, takes over old `dist' function.
- Don't assume $(distfiles) are all in same directory.
-
- * configure.in (AC_CHECK_HEADERS): Add libintl.h, locale.h.
- (AC_CHECK_LIB): Check for -lintl.
-
- * analyze.c (briefly_report): Rewrite `message (A?"B":"C")' as
- `if (A) message ("B") : message ("C")'; this is for getmsgids.
- (briefly_report, diff_2_files): For label, use file_label if set.
- * diff.c (compare_files): Likewise.
-
- * system.h (gettext): Declare; use a stub if ! HAVE_LIBINTL_H.
- (setlocale): Declare; use a stub if ! HAVE_LOCALE_H.
-
- * cmp.c, diff.c, diff3.c, sdiff.c (main):
- Invoke setlocale first thing, to tell library we're internationalized.
- (option_help_msgid): New constant.
- (usage): Use it, so message is translated one option at a time.
- * sdiff (help_msgid, give_help): Likewise.
-
- * cmp.c (sprintc): Renamed from `printc'.
- Now outputs to a buffer instead of stdout.
- (cmp): Use new sprintc; it's easier to internationalize.
-
- * diff.c (main): -D FOO now outputs `/* ! FOO */ instead of
- `/* not FOO */'.
-
- * sdiff.c (version_string): Fix decl typo: `const' was missing.
- (trapsigs): Ignore sigaction failure, to be compatible with `signal'.
-
- * util.c (struct msg, message5, print_message_queue):
- Allocate just one block of memory to save a message.
-
-Wed Nov 9 17:42:44 1994 Paul Eggert <eggert@twinsun.com>
-
- * sdiff.c (trapsigs): Don't check signal return value, since it's
- bogus under djgpp.
-
-Mon Oct 31 07:27:27 1994 Paul Eggert <eggert@twinsun.com>
-
- * Makefile.in (srcs, diff_o, diff3_o, sdiff_o):
- New files quote.c, quote.o.
-
- * diff.h (function_regexp, ignore_regexp): Replace lists of compiled
- regexps with these single compiled regexps. All users changed.
- (regexp_list,function_regexp_list,ignore_regexp_list): Move to diff.c.
- * diff.c (add_regexp): Build one big regexp instead of a regexp list.
- (summarize_regexp_list): New function.
- (regexp_list): Redesigned struct; moved here from diff.h.
- (function_regexp_list, ignore_regexp_list): Likewise, for vars.
-
- * context.c (find_function): Simplify interface:
- don't return size of function line. All callers changed.
- (print_context_script, find_function): INT_MAX now denotes no
- previous match; this is simpler than `- file->prefix_lines - 1'.
-
- * diff3.c (read_diff): Quote arguments with system_quote_arg.
- * sdiff.c (main): Use system_quote_arg to compute command.
- * diff.c (option_list): Quote options with system_quote_arg.
- * util.c (begin_output): Use system_quote_arg to compute command.
-
- * util.c (pr_program): New var.
- (analyze_hunk): Fix off-by-1 line length bug.
- Match with one big regexp instead of a list of regexps.
- Use new `trivial_length' local instead of comparing first byte to `\n'.
- Help the compiler with linbuf local vars.
-
- * system.h (system_quote_arg):
- New function; replaces SYSTEM_QUOTE_ARG macro.
-
-Sat Oct 15 20:09:12 1994 Paul Eggert <eggert@twinsun.com>
-
- * system.h (_tolower): Define if not already defined.
- * io.c (find_and_hash_each_line): Change tolower to _tolower; this
- speeds up diff -i considerably on some hosts (e.g. Solaris 2.3).
- * util.c (line_cmp): Likewise.
- * ifdef.c (groups_letter_value): Likewise.
-
- * diff.h (ignore_some_line_changes): Remove. All users changed.
- * io.c (find_and_hash_each_line): Don't invoke line_cmp if the length
- differs and -i is in force. Don't assume ISSPACE ('\n') is nonzero.
-
- * diff.h (xmalloc_exit_failure): New variable.
- All `main' programs set this variable at the start.
- xmalloc and xrealloc are now taken from GNU library.
- * cmp.c (main): Align buffer size to word size; some mallocs care.
- * io.c (slurp): Likewise.
- * diff.c (add_exclude): Can now assume xrealloc (0, ...) works.
- (add_regexp): Free storage on failure. Allocate storage all at one go.
- * system.h (malloc, realloc): Remove unused declarations.
- * diff3.c, sdiff.c, util.c (xmalloc, xrealloc): Remove.
- * sdiff.c (diffarg): Take advantage of cleaner xrealloc semantics.
-
- * io.c (ROL): Use sizeof to make it more generic.
-
- * Makefile.in (common_o): New variable.
- Link error.o and xmalloc.o into all programs.
- (check): Depend on $(PROGRAMS).
-
- * diff.h (error): Change to GNU library standard. All callers changed.
- * diff3.c (main): Use strerror (EISDIR) instead of "Is a directory".
- (fatal, perror_with_exit): Use `error'.
- * util.c (perror_with_name, fatal): Use GNU `error'.
- (error): Remove.
-
-Wed Oct 12 17:04:40 1994 David J. MacKenzie (djm@duality.gnu.ai.mit.edu)
-
- * cmp.c (main): Set xmalloc_exit_failure.
-
-Sat Oct 1 05:24:19 1994 Paul Eggert <eggert@twinsun.com>
-
- * Version 2.7 released.
-
- * configure.in (AC_HEADER_SYS_WAIT): Add.
- (AC_CHECK_HEADERS): Remove sys/wait.h.
- (AC_CHECK_FUNCS): Add tmpnam.
- * system.h (<sys/wait.h>, WEXITSTATUS): Use simpler scheme
- now that HAVE_SYS_WAIT_H is not set on hosts
- that are incompatible with Posix applications.
-
- * util.c (dir_file_pathname): Use filename_lastdirchar not strrchr.
- * sdiff.c (expand_name): Likewise.
- (private_tempnam): Use tmpnam if HAVE_TMPNAM; this simplifies porting.
- (exists, letters): Omit if HAVE_TMPNAM.
-
- * diff3.c (read_diff): If STAT_BLOCKSIZE yields zero,
- adjust it to a more reasonable value.
-
-Sat Sep 24 20:36:40 1994 Paul Eggert <eggert@twinsun.com>
-
- * sdiff.c (exists, private_tempname): Adopt latest GNU libc algorithm.
- (private_tempnam): Specialize for sdiff to avoid portability problems.
-
-Thu Sep 22 16:47:00 1994 Paul Eggert <eggert@twinsun.com>
-
- * configure.in (AC_ARG_PROGRAM): Added.
- (AC_OUTPUT): Add [date > stamp-h].
-
- * Makefile.in (DEFAULT_EDITOR_PROGRAM, DIFF_PROGRAM, LIBOBJS,
- NULL_DEVICE, PR_PROGRAM, PROGRAMS): New variables.
- (check, stamp-h.in, cmp.o, util.o): New targets.
- (edit_program_name): New variable; replaces old binprefix method.
- (install, uninstall): Use it.
- (binprefix): Removed.
- (distfiles): Add stamp-h.in.
- (clean): Clean stamp-h.
- (config.hin, config.h): Use time stamp files.
- (cmp_o): Add $(LIBOBJS).
- (install): Install info files from srcdir if they're not in `.'.
-
- * cmp.c, io.c (word): Don't define if already defined.
-
- * comp.c (main): Use setmode, not open(..., O_BINARY); this gets stdin.
- Use NULL_DEVICE instead of "/dev/null".
- (cmp): Use %lu instead of %ld when it is more likely to be right.
-
- * diff.h (PR_FILE_NAME): Rename to PR_PROGRAM and move to Makefile.in,
- util.c.
-
- * diff3.c (main): Give proper diagnostic if too many labels were given.
- (read_diff): Use SYSTEM_QUOTE_ARG.
-
- * system.h: <string.h>: Include if HAVE_STRING_H, too.
- <ctype.h>: Include here. All includers changed.
- (CTYPE_DOMAIN, ISDIGIT, ISPRINT, ISSPACE, ISUPPER): New macros that
- work around common <ctype.h> problems.
- (O_BINARY): Remove.
- (SYSTEM_QUOTE_ARG): New macros.
-
- * diff.c: Add comment.
-
- * util.c (PR_PROGRAM): Moved here from diff.h.
- (begin_output): Use SYSTEM_QUOTE_ARG.
-
- * io.c (read_files): Set mode to binary before returning 1.
-
- * sdiff.c (TMPDIR_ENV): New macro.
- (DEFAULT_EDITOR_PROGRAM): Renamed from DEFAULT_EDITOR for consistency.
- (expand_name): Change `isdir' to `is_dir' to avoid theoretical ctype
- namespace contamination.
- (main): Use SYSTEM_QUOTE_ARG.
- (private_tempnam): Don't access "/tmp" directly; use PVT_tmpdir.
-
-Tue Sep 13 18:46:43 1994 Paul Eggert <eggert@twinsun.com>
-
- * configure.in (AC_FUNC_MEMCHR): Remove. Autoconf didn't adopt this,
- since we need not worry about an old experimental library
- where memchr didn't work.
- (AC_FUNC_MEMCMP): Not needed, since we only test for equality.
- (AC_REPLACE_FUNCS): Add test for memchr.
- (AC_CHECK_FUNCS): Check for memchr, not memcpy, since it'll be cached.
- (AC_CHECK_HEADERS): Add string.h; regex.c uses on some old hosts.
-
- * system.h (memcmp): Define in terms of bcmp.
- Use HAVE_MEMCHR to test for all mem* routines.
-
- * Makefile.in (srcs): Remove memcmp.c.
- We use bcmp if memcmp doesn't work, since we only test for equality.
-
-Mon Sep 12 15:52:22 1994 Paul Eggert <eggert@twinsun.com>
-
- * configure.in (AC_CONFIG_HEADER): Rename config.h.in to config.hin.
- (AC_ISC_POSIX, AC_MINIX): Go back to these old names for Autoconf 2.
- (AC_CHECK_HEADERS): Remove now-redundant check for <string.h>.
- (AC_CHECK_FUNCS): Check for strchr.
- (AC_FUNC_MEMCHR, AC_FUNC_MEMCMP, AC_CHECK_FUNCS): Use special-purpose
- macros when suitable.
- * memcmp.c: New file.
- * Makefile.in (CPPFLAGS, DEFS, CFLAGS, LDFLAGS, prefix, exec_prefix):
- Default to autoconf-specified strings.
- (COMPILE): Use the defaults.
- (srcs): Add memcmp.c.
- (distfiles): Rename config.h.in->config.hin, install.sh->install-sh.
- (Makefile, config.h, config.hin, config.status): Rework for
- compatibility with Autoconf 2.
- * io.c (binary_file_p): Assume non-broken memchr.
- * memchr.c: Assume compiler understands void *; otherwise
- we don't match GCC's internal declaration of memchr.
- * system.h: Use more modern autoconf approach to standard C headers.
- * version.c: Include <config.h>, not "config.h".
-
- * diff.c, diff.h (ignore_some_line_changes):
- New variable; replaces `length_varies'.
- (line_end_char): Replace with '\n'; it wasn't being used consistently.
-
- * io.c (find_and_hash_each_line): Fix inconsistencies with -b -w -i and
- incomplete lines. Put incomplete lines into their own bucket.
- This means line_cmp no longer needs line length arguments,
- and equivalence classes' line lengths no longer need to include \n.
- Invoke line_cmp only if ignore_some_line_changes.
- (prepare_text_end): -B no longer ignores missing newlines.
- (read_files): Allocate another bucket for incomplete lines.
-
- * util.c (line_cmp): Now takes just two arguments. No longer
- optimizes for common case of exact equality; the caller does that
- optimization now. The caller is changed accordingly.
- Optimize for the common case of mostly equality.
- Use isupper+tolower instead of islower+toupper, for consistency.
-
- * waitpid.c (waitpid): Fix typo with internal scoping.
-
-Thu Sep 8 08:23:15 1994 Paul Eggert <eggert@twinsun.com>
-
- * configure.in: Revamp for Autoconf 2.
- * memchr.c, waitpid.c: New source files for substitute functions.
- * Makefile.in (diff_o, diff3_o, sdiff_o): Add $(LIBOBJS).
- (srcs): Add memchr.c, waitpid.c.
- (distfiles): Add install.sh, memchr.c, waitpid.c, install.sh.
- * system.h: Use Autoconf 2 style HAVE_DIRENT_H etc. macros for dirs.
- * dir.c (dir_sort): Prefer NAMLEN (p) to strlen (p->d_name).
- Change VOID_CLOSEDIR to CLOSEDIR_VOID for Autoconf 2.
- * sdiff.c, util.c (memchr, waitpid): Remove; use new substitutes.
- * diff3.c (read_diff): Use new waitpid substitute.
-
- * cmp.c, diff.c, diff3.c, sdiff.c (check_stdout, try_help): New fns.
- (usage): Just print more detailed usage message; let caller exit.
- * diff.c (option_help): New variable.
- (filetype): Add Posix.1b file types.
-
-Fri Sep 2 16:01:49 1994 Paul Eggert <eggert@twinsun.com>
-
- * configure.in: Switch to new autoconf names. Add sys/file.h test.
- * Makefile.in (distclean): Clean config.cache, config.log
- (used by new autoconf).
-
- * diff.c, diff3.c, (main), sdiff.c (trapsigs): If we'll have children,
- make sure SIGCHLD isn't ignored.
-
- * diff3.c (DIFF_CHUNK_SIZE): Removed. Get size from STAT_BLOCKSIZE.
- (INT_STRLEN_BOUND): New macro.
-
- * ifdef.c (format_group, groups_letter_value):
- Use * instead of [] in prototypes.
-
- * system.h: Include <sys/file.h> only if HAVE_SYS_FILE_H.
- (S_IXGRP, S_IXOTH, S_IXUSR): Remove unused macros.
-
- * util.c (begin_output): Check fdopen result.
-
- The following changes simplify porting to non-Posix environments.
- * cmp.c, diff.c, diff3.c, sdiff.c, (main): Call initialize_main first.
- * diff.c (binary_I_O): New variable for --binary option.
- (main, usage, compare_files): Support --binary option.
- (compare_files): Use filename_lastdirchar to find last
- directory char in a file name.
- * cmp.c (main), diff.c (compare_files), dir.c (compare_names,
- diff_dirs): Use filename_cmp to compare file names.
- Use same_file to determine whether two files are the same.
- * context.c (print_context_label): Check whether ctime yields 0.
- * diff3.c (read_diff), sdiff.c (cleanup, main, waitpid),
- util.c (begin_output): Use popen+pclose if !HAVE_FORK.
- * io.c (sip): If HAVE_SETMODE, test for binary files in O_BINARY mode.
- * sdiff.c (ck_fdopen): Function removed.
- (edit): Use system if !HAVE_FORK.
- (execdiff): Now assumes caller has pushed all args, plus trailing 0.
- All callers changed.
- (private_tempnam): Try TMP if TMPDIR isn't defined.
- Fit temporary filenames into 8.3 limit.
- * system.h (STAT_BLOCKSIZE): Don't define if already defined.
- (min, max): Undef if already defined.
- (filename_cmp, filename_lastdirchar, HAVE_FORK, HAVE_SETMODE,
- initialize_main, O_BINARY, same_file): New macros.
-
-Fri Jun 17 11:23:53 1994 David J. MacKenzie (djm@geech.gnu.ai.mit.edu)
-
- * Makefile.in (info, dvi, diff.dvi): New targets.
- (clean): Remove TeX output files.
-
-Fri Jun 17 05:37:52 1994 Paul Eggert (eggert@twinsun.com)
-
- * cmp.c, io.c (word): Change from typedef to #define, to avoid
- collision with Unicos 8.0 <sys/types.h>, which also typedefs `word'.
-
-Thu Apr 15 00:53:01 1994 Paul Eggert (eggert@twinsun.com)
-
- * diff3.c (scan_diff_line), util.c (print_number_range): Don't
- rely on promotion to make the old-style parameter type agree
- with the prototype parameter type; this doesn't work on
- Apollos running bsd4.3.
-
-Mon Jan 3 02:05:51 1994 Paul Eggert (eggert@twinsun.com)
-
- * Makefile.in (LDFLAGS): Remove -g. Change all link commands
- to use both $(CFLAGS) and $(LDFLAGS).
-
-Mon Dec 13 12:23:27 1993 Paul Eggert (eggert@twinsun.com)
-
- * system.h: Don't assume dirent.h exists just because
- _POSIX_VERSION is defined.
-
-Fri Dec 3 18:39:39 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main): allow -pu.
-
-Tue Nov 23 03:51:08 1993 Paul Eggert (eggert@twinsun.com)
-
- * Makefile.in (distclean): Remove config.h.
-
-Wed Nov 10 00:28:27 1993 Paul Eggert (eggert@twinsun.com)
-
- * Version 2.6 released.
-
- * analyze.c (too_expensive): New variable, for heuristic to
- limit the worst-case cost to O(N**1.5 log N) at the price of
- producing suboptimal output for large inputs with many differences.
- (diff_2_files): Initialize it.
- (struct partition): New type.
- (SNAKE_LIMIT): New macro; merely documents already-used number 20.
- (diag): New `minimal' arg; all callers changed. Put results into
- struct partition. Apply `too_expensive' heuristic. Tune.
- (compareseq): New `minimal' arg; all callers changed. Tune.
- (shift_boundaries): Improve heuristic to also coalesce adjacent runs
- of changes more often.
-
- * diff.c (long_options, main, usage): Add `--help'.
- (main): Send version number to stdout, not stderr.
- (usage): Send usage to stdout, not stderr.
- (compare_files): Initialize `inf' properly.
-
- * io.c (word): Change to `int'; it makes a big difference on x86.
- (sip, slurp): Put off allocating room to hold the whole file until we
- have to read the whole file. This wins if the file turns out
- to be binary.
-
- * util.c (xmalloc, xrealloc): "virtual memory" -> "memory"
- (primes): Omit large primes if INT_MAX is small.
-
- * sdiff.c (usage): Send usage to stdout, not stderr.
- (long_options, main, usage): Add `--help'.
- (main): Send version number to stdout, not stderr. Exit afterwards.
-
- * diff3.c (usage): Send usage to stdout, not stderr.
- (long_options, main, usage): Add `--help'.
- (read_diff): Detect integer overflow in buffer size calculations.
-
- * cmp.c (word): New type. All uses of `long' for
- word-at-a-time comparisons changed to `word'.
- (long_options, main, usage): Add `--help'.
- (usage): Send usage to stdout, not stderr.
- (main): Add `-v'. Send version number to stdout, not stderr.
-
- * configure.in (AC_HAVE_HEADERS): Add unistd.h; remove AC_UNISTD_H.
-
-Mon Sep 27 07:20:24 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (add_exclude_file): Cast memchr to (char *)
- to suppress bogus warnings on some nonstandard hosts.
-
- * Makefile.in (cmp): Add version.o.
-
- * analyze.c (diff_2_files): Work around memcmp bug with size=0.
-
- * cmp.c (main, usage, version_string): Add --version option.
-
- * system.h (malloc, realloc): Declare only if !HAVE_STDLIB_H.
- (memchr): Declare only if !HAVE_MEMCHR. These changes are
- needed to keep some nonstandard hosts happy.
-
- * util.c (memchr): Make first arg char const *
- to match standard.
- (xmalloc, xrealloc): Cast malloc, realloc
- to (VOID *) to suppress bogus warnings on some nonstandard hosts.
-
- * diff3.c (xmalloc, xrealloc): Cast malloc, realloc
- to (VOID *) to suppress bogus warnings on some nonstandard hosts.
-
- * sdiff.c (xmalloc, xrealloc): Cast malloc, realloc
- to (VOID *) to suppress bogus warnings on some nonstandard hosts.
- (lf_copy, lf_skip, lf_snarf): Cast memchr to (char *)
- to suppress bogus warnings on some nonstandard hosts.
- (memchr): Make first arg char const *
- to match standard.
-
-Mon Sep 27 00:23:37 1993 Paul Eggert (eggert@twinsun.com)
-
- * Version 2.5 released.
-
- * analyze.c (diff_2_files): Work around memcmp bug with size=0.
-
- * cmp.c (main, usage, version_string): Add --version option.
- * Makefile.in (cmp): Add version.o.
-
- * diff.c (add_exclude_file): Cast memchr to (char *)
- to suppress bogus warnings on some nonstandard hosts.
- * sdiff.c (lf_copy, lf_skip, lf_snarf): Likewise.
-
- * diff3.c, sdiff.c, util.c (xmalloc, xrealloc): Cast malloc, realloc
- to (VOID *) to suppress bogus warnings on some nonstandard hosts.
-
- * sdiff.c, util.c (memchr): Make first arg char const *
- to match standard.
-
- * system.h (malloc, realloc): Declare only if !HAVE_STDLIB_H.
- (memchr): Declare only if !HAVE_MEMCHR. These changes are
- needed to keep some nonstandard hosts happy.
-
- * xmalloc.c: Include <sys/types.h> always; some nonstandard hosts
- need it for size_t even if STDC_HEADERS.
-
-Sat Sep 18 01:33:07 1993 Paul Eggert (eggert@twinsun.com)
-
- * configure.in (AC_STAT_MACROS_BROKEN): Add.
- * system.h (S_IS{BLK,CHR,DIR,FIFO,REG,SOCK}): Fix defns if
- STAT_MACROS_BROKEN.
-
- * Makefile.in (diff3, sdiff, cmp): Do not link $(ALLOCA).
-
- * analyze.c (discard_confusing_lines): Make defn static, like decl.
- * sdiff.c (xmalloc): Likewise.
-
- * ifdef.c (format_group): Ensure isdigit argument isn't < 0.
-
- * side.c (print_half_line): Use isprint, since some hosts lack isgraph.
- * util.c (output_1_line): Likewise. Ensure its argument isn't < 0.
- (xmalloc, xrealloc): Remove needless casts.
-
- * system.h (volatile, const):
- Define these before including any system headers,
- so that they're used consistently in all system includes.
- (getenv, malloc, realloc): Declare even if HAVE_STDLIB_H, since some
- <stdlib.h>s don't declare them.
- (memchr): Likewise for <string.h>.
-
- * cmp.c, diff3.c, diff.h, sdiff.c: Include "system.h" first.
- * diff.c: Remove redundant "system.h" inclusion.
-
- * diff3.c (xmalloc): Now static.
- (xmalloc, realloc): Remove needless casts.
- (READNUM): Ensure isdigit argument isn't negative.
-
-Wed Sep 14 07:14:15 1993 Paul Eggert (eggert@twinsun.com)
-
- * Version 2.4 released.
-
- * ifdef.c (scan_char_literal): New function, for new %c'x' and
- %c'\ooo' format specs.
- (format_group, print_ifdef_lines): Use it. Remove %0 format spec.
-
- * cmp.c (cmp): Don't try to read past end of file; this doesn't
- work on ttys.
-
- * system.h, version.c: #include <config.h>, not "config.h", to allow
- configuring in a separate directory when the source directory has
- already been configured.
- * Makefile.in (COMPILE): New defn, with proper -I options so that
- `#include <config.h>' works.
- (.c.o, diff3.o, sdiff.o): Use it.
-
-Mon Sep 13 06:45:43 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main, longopts): Add --line-format=FORMAT option.
- (specify_format): Args no longer const pointers. All callers changed.
-
- * ifdef.c: Add support for %?c, %(A=B?T:E), PRINTF_SPECn formats.
- (struct group): New struct.
- (print_ifdef_lines): Use it to simplify argument passing.
- Remove the convention that last arg -1 signifies that the lines
- from file 2 are the same as the lines from file 1; this
- convention no longer works, now that line numbers might be
- printed out, since the line numbers may differ.
- Add first FILE * argument to output to. All callers changed.
- Use a faster test for the single-fwrite optimization.
- (format_group, scan_printf_spec, groups_letter_value): New functions.
-
- * diff.h (group_format, line_format): No longer const pointers.
- (format_ifdef): 1st arg is no longer const pointer.
-
- * configure.in: Configure HAVE_LIMITS_H, HAVE_STDLIB_H.
- * system.h <limits.h>, <stdlib.h>, <string.h>:
- Include only if HAVE_LIMITS_H etc.
-
- * system.h (memcmp, memcpy, strchr, strrchr, struct dirent): Prefer
- these standard names to the traditional names (bcmp, bcpy, index,
- rindex, struct direct). All callers changed.
-
- * system.h (PARAMS, VOID):
- Define earlier so that malloc decl can use VOID.
- (STAT_BLOCKSIZE): Simplify ersatz defn; just use 8K.
-
-Fri Sep 3 00:21:02 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (compare_files): Two files with the same name must be
- the same file; avoid a needless `stat' in that case.
-
-Fri Aug 27 06:59:03 1993 Paul Eggert (eggert@twinsun.com)
-
- * Pervasive changes for portability to 64-bit hosts:
- Add prototypes to function declarations.
- Use size_t, not int, when needed.
-
- * Other pervasive changes:
- Use `const' more often.
- Use STD{IN,OUT,ERR}_FILENO instead of [012].
- Use 0, not NULL, for portability to broken hosts.
-
- * Makefile.in: (srcs, objs, distfiles, cmp): New files cmpbuf.[ch].
- (distfiles): New files config.h.in, mkinstalldirs.
- (.c.o): Add -DHAVE_CONFIG_H.
-
- * analyze.c: (diag): Pacify `gcc -Wall' with a useless assignment.
- (diff_2_files): Use l.c.m., not max, of files' buffer sizes.
-
- * cmp.c: Make globals static when possible.
-
- (file): Now a 2-element array; replaces `file1' and `file2'.
- (file_desc, buffer): Likewise, for file[12]_desc and buf[12].
- (main): Likewise, for stat_buf[12]. Index these variables with `i'.
-
- (ignore_initial): New var.
- (long_options): Now const. Add `--ignore-initial'.
- (usage): Sort options and add `--ignore-initial'.
- (main, cmp): Add `--ignore-initial' support.
-
- (main): `cmp - -' now succeeds.
- When comparing standard input to a file, and using a shortcut (e.g.
- looking at file sizes or inode numbers), take the lseek offset into
- account before deciding whether the files are identical.
- Avoid mentioning `dev_t', `ino_t' for portability to nonstandard hosts.
- Use l.c.m. of files' buffer sizes, not 8 * 1024.
- ferror (stdout) does not imply errno has a useful value.
- If 2nd file is "-", treat it first, in case stdin is closed.
-
- (cmp): Always compute `char_number', `smaller' for speed and simplicity.
- Say `cmp: EOF on input', not `/usr/gnu/bin/cmp: EOF on input',
- as per Posix.2.
-
- (block_compare_and_count): Increment line_number argument.
- Remove end_char argument; it's always '\n'. All callers changed.
- Do not assume sizeof(long) == 4; this isn't true on some 64-bit hosts.
- (block_compare): Minimize differences with block_compare_and_count.
-
- (block_read): Coalesce `bp += nread's.
-
- (printc): Remove `FILE *' arg; output to stdout. All callers changed.
-
- * configure.in: Configure HAVE_SIGACTION, RETSIGTYPE, HAVE_VPRINTF.
- Configure into config.h.
-
- * context.c (print_context_label):
- Standard input's st_mtime is no longer a special case
- here, since `compare_files' now sets it to the current time.
-
- * diff.c (usage): Sort options.
- (filetype): New function.
- (compare_files): Set stdin's st_mtime to be the current time.
- Leave its name "-" instead of changing it to "Standard Input";
- to test whether a file is stdin, we must compare its name to "-" instead
- of its desc to 0, since if it's closed other file descs may be 0.
- When comparing standard input to a file, and using a shortcut (e.g.
- looking at file sizes or inode numbers), take the lseek offset into
- account before deciding whether the files are identical.
- Pretend that nonexistent files have the same filetype as existing files.
- Rename `errorcount' to `failed', since it's boolean.
- In directory comparisons, if a file is neither a regular file nor a
- directory, just print its type and the other file's type.
-
- * diff.h (Is_space, textchar): Remove.
- (struct msg, msg_chain, msg_chain_end): Move to util.c.
- (VOID): Move to system.h.
- (line_cmp, version_string, change_letter, print_number_range,
- find_change): New decls.
-
- * diff.texi:
- whitespace -> white space. It now stands for whatever isspace yields.
- Add --ignore-initial.
-
- * diff3.c (VOID): Move to system.h.
- (version_string): Now char[].
- (usage): Sort options.
- (process_diff): Pacify `gcc -Wall' with a useless assignment.
- (read_diff): pid is of type pid_t, not int. Use waitpid if available.
- (output_diff3): Simplify test for `\ No newline at end of file' message.
-
- * dir.c (struct dirdata): Rename `files' to `names' to avoid confusion
- with external struct file_data `files'.
-
- * io.c (line_cmp): Move declaration to diff.h.
- (textchar): Remove.
- (find_and_hash_each_line): Use locale's definition of white space
- instead of using one hardwired defn for -b and another for -w.
-
- * normal.c (change_letter, print_number_range, find_change):
- Move decls to diff.h.
- (print_normal_hunk): Now static.
-
- * sdiff.c (SEEK_SET): Move to system.h.
- (version_string): Now char[], not char*.
- (private_tempnam): Remove hardcoded limit on temporary file names.
- (exiterr, perror_fatal, main): When exiting because of a signal,
- exit with that signal's status.
- (lf_refill, main, skip_white, edit, interact): Check for signal.
- (ignore_SIGINT): Renamed from `ignore_signals'.
- (NUM_SIGS, initial_handler): New macros.
- (initial_action, signal_received, sigs_trapped): New vars.
- (catchsig, trapsigs): Use sigaction if possible, since this closes the
- windows of vulnerability that `signal' has. Use RETSIGTYPE not void.
- When a signal comes in, just set a global variable; this is safer.
- (checksigs, untrapsig): New functions.
- (edit): Pacify `gcc -Wall' with a useless assignment.
- Respond to each empty line with help, not to every other empty line.
- (private_tempnam): Remove hardcoded limit on temporary file name length.
- Don't assume sizeof (pid_t) <= sizeof (int).
-
- * system.h: (S_IXOTH, S_IXGRP, S_IXUSR,
- SEEK_SET, SEEK_CUR,
- STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO):
- New macros, if system doesn't define them.
- (volatile): Don't define if already defined.
- (PARAMS): New macro.
- (VOID): Move here from diff.h.
-
- * util.c (struct msg, msg_chain, msg_chain_end): Moved here from diff.h.
- (message5): New function.
- (pr_pid): New var.
- (begin_output): Allocate `name' more precisely.
- Put child pid into pr_pid, so that we can wait for it later.
- Don't check execl's return value, since any return must be an error.
- (finish_output): Detect and report output errors.
- Use waitpid if available. Check pr exit status.
- (line_cmp): Use locale's definition of white space
- instead of using one hardwired defn for -b and another for -w.
- (analyze_cmp): Avoid double negation with `! nontrivial'.
- Pacify `gcc -Wall' be rewriting for-loop into do-while-loop.
- (dir_file_pathname): New function.
-
- * version.c (version_string): Now char[], not char*.
-
-Thu Jul 29 20:44:30 1993 David J. MacKenzie (djm@wookumz.gnu.ai.mit.edu)
-
- * Makefile.in (config.status): Run config.status --recheck, not
- configure, to get the right args passed.
-
-Thu Jul 22 10:46:30 1993 Paul Eggert (eggert@twinsun.com)
-
- * Makefile.in (dist): Replace `if [ ! TEST ]; then ACTION; fi'
- with `[ TEST ] || ACTION || exit' so that the containing for-loop exits
- with proper status for `make'.
-
-Thu Jul 8 19:47:22 1993 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
-
- * Makefile.in (installdirs): New target.
- (install): Use it.
- (Makefile, config.status, configure): New targets.
-
-Sat Jun 5 23:10:40 1993 Paul Eggert (eggert@twinsun.com)
-
- * Makefile.in (dist): Switch from .z to .gz.
-
-Wed May 26 17:16:02 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main): Cast args to compare_files, for traditional C.
- * side.c (print_sdiff_common_lines, print_sdiff_hunk): Likewise.
- * analyze.c, diff3.c, sdiff.c, util.c: Don't assume NULL is defined
- properly.
-
-Tue May 25 14:54:05 1993 Paul Eggert (eggert@twinsun.com)
-
- * analyze.c (diff_2_files): With -q, do not report that files differ
- if all their differences are ignored.
- (briefly_report): New function.
- * diff.h (ignore_some_changes): New variable.
- * diff.c (compare_files): Don't use the file size shortcut if
- ignore_some_changes is nonzero, since the file size may differ
- merely due to ignored changes.
- (main): Set ignore_some_changes if we might ignore some changes.
- Remove unsystematic assignment of 0 to static vars.
- * io.c (read_files): New argument PRETEND_BINARY says whether to
- pretend the files are binary.
-
- * diff3.c (tab_align_flag): New variable, for new -T option.
- (main, usage, output_diff3): Add support for -T.
-
-Sun May 23 15:25:29 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * dir.c (dir_sort): Always init `data' to avoid GCC warning.
-
-Sat May 22 15:35:02 1993 Paul Eggert (eggert@twinsun.com)
-
- * Makefile.in (dist): Change name of package from diff to diffutils.
- Don't bother to build .Z dist; .z suffices.
-
-Fri May 21 16:35:22 1993 Paul Eggert (eggert@twinsun.com)
-
- * diff.c: Include "system.h" to get memchr declaration.
- * system.h (memchr): Declare if !HAVE_MEMCHR, not if
- !HAVE_MEMCHR && !STDC_HEADERS.
-
-Wed May 19 17:43:55 1993 Paul Eggert (eggert@twinsun.com)
-
- * Version 2.3 released.
-
-Fri Apr 23 17:18:44 1993 Paul Eggert (eggert@twinsun.com)
-
- * io.c (find_identical_ends): Do not discard the last HORIZON_LINES
- lines of the prefix, or the first HORIZON_LINES lines of the suffix.
- * diff.c (main, longopts, usage): Add --horizon-lines option.
- * diff3.c (main, process_diff, read_diff): Invoke second diff
- with --horizon-lines determined by the first diff.
- * diff.h, diff3.c (horizon_lines): New variable.
-
-Mon Mar 22 16:16:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
-
- * system.h [HAVE_STRING_H || STDC_HEADERS] (bcopy, bcmp, bzero):
- Don't define if already defined.
-
-Fri Mar 5 00:20:16 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * diff.c (main): Use NULL in arg to compare_files.
-
-Thu Feb 25 15:26:01 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
-
- * system.h: Declare memchr #if !HAVE_MEMCHR && !STDC_HEADERS,
- not #if !HAVE_MEMCHR || !STDC_HEADERS.
-
-Mon Feb 22 15:04:46 1993 Richard Stallman (rms@geech.gnu.ai.mit.edu)
-
- * io.c (find_identical_ends): Move complicated arg outside GUESS_LINES.
-
-Mon Feb 22 12:56:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
-
- * Makefile.in (.c.o): Add -I$(srcdir); put $(CFLAGS) last before $<.
-
-Sat Feb 20 19:18:56 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * io.c (binary_file_p): Return zero if file size is zero.
-
-Fri Feb 19 17:31:32 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu)
-
- * Version 2.2 released.
-
- * system.h [HAVE_STRING_H || STDC_HEADERS] (index, rindex): Don't
- define if already defined.
-
-Wed Feb 17 17:08:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu)
-
- * Makefile.in (srcs): Remove limits.h.
-
-Thu Feb 11 03:36:00 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * diff3.c (xmalloc): No longer static.
-
- * sdiff.c (edit): Allocate buf dynamically.
-
- * dir.c (dir_sort): Handle VOID_CLOSEDIR.
-
-Wed Feb 10 00:15:54 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * limits.h: File deleted (should never have been there).
-
-Tue Feb 9 03:53:22 1993 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * Makefile.in (.c.o, diff3.o, sdiff.o): Put $(CFLAGS) last.
-
-Wed Feb 3 15:42:10 1993 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
-
- * system.h: Don't #define const; let configure do it.
-
-Mon Feb 1 02:13:23 1993 Paul Eggert (eggert@hal.gnu.ai.mit.edu)
-
- * Version 2.1 released.
-
- * Makefile.in (dist): Survive ln failures. Create .tar.z
- (gzipped tar) file as well as .tar.Z (compressed tar) file.
-
-Fri Jan 8 22:31:41 1993 Paul Eggert (eggert@twinsun.com)
-
- * side.c (print_half_line): When the input position falls
- outside the column, do not output a tab even if the output
- position still falls within the column.
-
-Mon Dec 21 13:54:36 1992 David J. MacKenzie (djm@kropotkin.gnu.ai.mit.edu)
-
- * Makefile.in (.c.o): Add -I.
-
-Fri Dec 18 14:08:20 1992 Paul Eggert (eggert@twinsun.com)
-
- * configure.in: Add HAVE_FCNTL_H, since system.h uses it.
-
-Tue Nov 24 10:06:48 1992 David J. MacKenzie (djm@goldman.gnu.ai.mit.edu)
-
- * Makefile.in: Note change from USG to HAVE_STRING_H.
-
-Mon Nov 23 18:44:00 1992 Paul Eggert (eggert@twinsun.com)
-
- * io.c (find_and_hash_each_line): When running out of lines,
- double the number of allocated lines, instead of just doubling
- that number minus the prefix lines. This is more likely to
- avoid the need for further memory allocation.
-
-Wed Nov 18 20:40:28 1992 Paul Eggert (eggert@twinsun.com)
-
- * dir.c (dir_sort): Plug memory leak: space holding directory
- contents was not being reclaimed. Get directory size from
- struct file_data for initial guess at memory needed.
- Detect errors when reading and closing directory.
- (diff_dirs): Pass struct file_data to dir_sort. Finish plugging leak.
- * diff.c (compare_files): Pass struct file_data to diff_dirs.
-
- * io.c (find_and_hash_each_line): Don't assume alloc_lines is
- nonzero when allocating more lines.
-
-Thu Nov 12 16:02:18 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main): Add `-U lines' as an alias for `--unified=lines'.
-
- * diff3.c (usage): Add third --label option in example.
-
- * util.c (analyze_hunk): Fix test for ignoring blank lines.
-
- * configure.in, system.h: Avoid USG; use HAVE_TIME_H etc. instead.
-
-Mon Nov 9 05:13:25 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff3.c (main, usage): Add -A or --show-all.
- -m now defaults to -A, not -E. Allow up to three -L options.
- (output_diff3_edscript, output_diff3_merge):
- Remove spurious differences between these two functions.
- Output ||||||| for -A. Distinguish between conflicts and overlaps.
- (dotlines, undotlines): New functions that output `Ns', not `N,Ns'.
- (output_diff3_edscript, output_diff3_merge): Use them.
-
- * io.c (find_identical_ends): shift_boundaries needs an extra
- identical line at the end, not at the beginning.
-
- * sdiff.c (edit): execvp wants char **, not const char **.
-
-Mon Oct 19 04:39:32 1992 Paul Eggert (eggert@twinsun.com)
-
- * context.c (print_context_script, find_function): Context
- line numbers start with - file->prefix_lines, not 0.
-
- * io.c (binary_file_p): Undo last change; it was a library bug.
-
-Sun Oct 18 00:17:29 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * io.c (binary_file_p): Consider empty file as non-binary.
-
-Mon Oct 5 05:18:46 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff3.c (main, make_3way_diff, using_to_diff3_block): Don't
- report bogus differences (for one of -mexEX3) just because the
- file0-file1 diffs don't line up with the file0-file2 diffs.
- (This is entirely possible since we don't use diff's -n
- option.) Always compare file1 to file2, so that diff3 sees
- those changes directly. Typically, file2 is now the common
- file, not file0.
- (output_diff3_merge): The input file is file 0, not the common file.
-
- (FC, FO): New macros; they replace FILE1, FILE0 for two-way diffs,
- to distinguish them from three-way diffs.
-
- * diff3.c (using_to_diff3_block): Fold repeated code into loops.
-
- * diff3.c (make_3way_diff, process_diff): Have the *_end
- variable point to the next field to be changed, not to the last
- object allocated; this saves an if-then-else.
-
- * diff3.c (process_diff): Use D_NUMLINES instead of its definiens.
-
- * diff3.c: Make fns and vars static unless they must be external.
-
-Wed Sep 30 09:21:59 1992 Paul Eggert (eggert@twinsun.com)
-
- * analyze.c (diff_2_files): OUTPUT_IFDEF is now robust.
- * diff.h (ROBUST_OUTPUT_STYLE): Likewise.
- (default_line_format): Remove. All refs removed.
-
- * ifdef.c (print_ifdef_lines): Add %L. Optimize %l\n even if user
- specified it, as opposed to its being the default.
-
-Tue Sep 29 19:01:28 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (longopts, main): --{old,new,unchanged,changed}--group-format
- are new options, so that -D is no longer overloaded. Set
- no_diff_means_no_output if --unchanged-{line,group}-format allows it.
- * diff.h (enum line_class): New type.
- (group_format, line_format): Use it to regularize option flags.
- All refs changed.
-
- * ifdef.c (format_ifdef, print_ifdef_lines): %n is no longer a format.
-
-Mon Sep 28 04:51:42 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main, usage): Replace --line-prefix with the more general
- --{old,new,unchanged}-line-format options.
- * ifdef.c (format_ifdef, print_ifdef_lines): Likewise.
- * diff.h (line_format): Renamed from line_prefix. All refs changed.
- * diff.h, ifdef.c (default_line_format): New variable.
- * util.c (output_1_line): New function.
- (print_1_line): Use it.
-
- * ifdef.c: (format_ifdef, print_ifdef_lines): Add %0 format.
-
-Sun Sep 27 05:38:13 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main): Add -E or --line-prefix option. Add -D'=xxx'
- for common lines. Change default -D< format from copy of -D>
- format to to -D<%<; similarly for default -D> format.
- * diff.h (common_format, line_prefix): New variables.
- * ifdef.c (format_ifdef): New function.
- (print_ifdef_script, print_ifdef_hunk, print_ifdef_lines):
- Use it for -D'=xxx', -E.
-
- * context.c (find_hunk): Glue together two non-ignorable changes that
- are exactly CONTEXT * 2 lines apart. This shortens output, removes
- a behavioral discontinuity at CONTEXT = 0, and is more compatible
- with traditional diff.
-
- * io.c (find_identical_ends): Slurp stdin at most once.
-
- * util.c (print_line_line): line_flag is const char *.
-
-Thu Sep 24 15:18:07 1992 Paul Eggert (eggert@twinsun.com)
-
- * ifdef.c (print_ifdef_lines): New function, which fwrites a sequence
- of lines all at once for speed.
- (print_ifdef_script, print_ifdef_hunk): Use it.
-
-Thu Sep 24 05:54:14 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.c (main): Support new -D options for if-then-else formats.
- (specify_format): New function.
- * diff.h (ifndef_format, ifdef_format, ifnelse_format): New variables.
- * ifdef.c (print_ifdef_hunk): Use the new variables instead of
- a hardwired format.
-
- * side.c (print_1sdiff_line): Represent incomplete lines on output.
- (print_sdiff_script): Likewise. Don't print 'q' at end,
- since that doesn't work with incomplete lines.
- * sdiff.c (interact): Don't assume diff output ends with 'q' line.
- * diff.h (ROBUST_OUTPUT_STYLE): OUTPUT_SDIFF is now robust.
-
- * sdiff.c (lf_copy, lf_snarf): Use memchr instead of index,
- to avoid dumping core when files contain null characters.
- (memchr): New function (if memchr is missing).
-
- * io.c (sip): New arg SKIP_TEST to skip test for binary file.
- (read_files): Don't bother testing second file if first is binary.
-
-Thu Sep 17 21:17:49 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * system.h [!USG && !_POSIX_VERSION]: Protect from conflicting
- prototype for wait in sys/wait.h.
-
-Wed Sep 16 12:32:18 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * Makefile.in: Include binprefix in -DDIFF_PROGRAM.
-
-Tue Sep 15 14:27:25 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * Version 2.0.
-
-Sat Sep 12 01:31:19 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * util.c, diff.h, system.h [!HAVE_MEMCHR]: Don't use void *
- and const when declaring memchr replacement. Declare memchr
- if !STDC_HEADERS && !USG.
-
-Thu Sep 10 15:17:32 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * Makefile.in (uninstall): New target.
-
- * diff.c (excluded_filename): Use fnmatch, not wildmat.
- (usage): Document -x, -X, --exclude, --exclude-from.
- Makefile.in: Use fnmatch.c, not wildmat.c.
-
-Sun Sep 6 23:46:25 1992 Paul Eggert (eggert@twinsun.com)
-
- * configure.in: Add HAVE_MEMCHR.
- * diff.h, util.c: Use it instead of MEMCHR_MISSING.
-
-Sun Sep 6 07:25:49 1992 Paul Eggert (eggert@twinsun.com)
-
- * diff.h: (struct line_def): Replace this 3-word struct with char *.
- This uses less memory, particularly for large files with short lines.
- (struct file_data): New member linbuf_base counts number of lines
- in common prefix that are not recorded in linbuf;
- this uses less memory if files are identical or differ only at end.
- New member buffered_lines counts possibly differing lines.
- New member valid_lines counts valid data.
- New member alloc_lines - linbuf_base replaces old linbufsize.
- linbuf[0] now always points at first differing line.
- Remove unused members ltran, suffix_lines.
- Add const where appropriate.
- (Is_space): New macro, for consistent definition of `white space'.
- (excluded_filename, memchr, sip, slurp): New declarations.
- * ed.c (print_ed_hunk): Adjust to diff.h's struct changes.
- * context.c (pr_context_hunk): Likewise.
- * ifdef.c (print_ifdef_script): Likewise.
- * side.c (print_sdiff_script, print_half_line): Likewise.
- * util.c (analyze_hunk, line_cmp, print_1_line): Likewise.
-
- * analyze.c (shift_boundaries): Remove unneeded variable `end' and
- unnecessary comparisons of `preceding' and `other_preceding' against 0.
- (diff_2_files): When comparing files byte-by-byte for equality,
- don't slurp them all in at once; just compare them a buffer at a time.
- This can win big if they differ early on.
- Move some code to compare_files to enable this change.
- Use only one buffer for stdin with `diff - -'.
- (discard_confusing_lines, diff_2_files): Coalesce malloc/free calls.
- (build_script): Remove obsolete OUTPUT_RCS code.
-
- * diff.c (add_exclude, add_exclude_file, excluded_filename): New fns.
- (main): Use them for the new --exclude and --exclude-from options.
- (compare_files): Don't open a file unless it must be read.
- Treat `diff file file' and `diff file dir' similarly.
- Move some code here from diff_2_files to enable this.
- Simplify file vs dir warning.
-
- * dir.c (dir_sort): Support new --exclude* options.
-
- * io.c (struct equivclass): Put hash code and line length here instead
- of struct line_def, so that they can be shared.
- (find_and_hash_each_line): Compute equivalence class as we go,
- instead of doing it in a separate pass; this thrashes memory less.
- Make buckets realloc-able, since we can't preallocate them.
- Record one more line start than there are lines, so that we can compute
- any line's length by subtracting its start from the next line's,
- instead of storing the length explicitly. This saves memory.
- Move prefix-handling code to find_identical_ends;
- this wins with large prefixes.
- Use Is_space, not is_space, for consistent treatment of white space.
- (prepare_text_end): New function.
- (find_identical_ends): Move slurping here, so it's only done when
- needed. Work even if the buffers are the same (because of `diff - -').
- Compare prefixes a word at a time for speed.
- (find_equiv_class): Delete; now done by find_and_hash_each_line.
- (read_files): Don't slurp unless needed.
- find_equiv_class's work is now folded into find_and_hash_each_line.
- Don't copy stdin buffer if `diff - -'.
- Check for running out of primes.
- (sip, slurp): Split first part of `slurp' into another function `sip'.
- `sip' sets things up and perhaps reads the first ST_BLKSIZE buffer to
- see whether the file is binary; `slurp' now just finishes the job.
- This lets diff_2_files compare binary files lazily.
- Allocate a one-word sentinel to allow word-at-a-time prefix comparison.
- Count prefix lines only if needed, only count the first file's prefix.
- Don't bother to count suffix lines; it's never needed.
- Set up linbuf[0] to point at first differing line.
- (binary_file_p): Change test for binary files:
- if it has a null byte in its first buffer, it's binary.
- (primes): Add more primes.
-
- * util.c (line_cmp): Use bcmp for speed.
- Use Is_space, not is_space, for consistent treatment of white space.
- (translate_line_number): Internal line numbers now count from 0
- starting after the prefix.
- (memchr): New function (if memchr is missing).
-
- * Makefile.in: Document HAVE_ST_BLKSIZE. Link with wildmat.o.
- * system.h (STAT_BLOCKSIZE): New macro based on HAVE_ST_BLKSIZE.
- * configure.in: Add AC_ST_BLKSIZE.
- * wildmat.c: New file.
-
-Fri Sep 4 01:28:51 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * sdiff.c (xmalloc): Renamed from ck_malloc. Callers changed.
-
-Thu Sep 3 15:28:59 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * diff.h: Don't declare free, index, rindex.
-
-Tue Aug 11 22:18:06 1992 John Gilmore (gnu at cygnus.com)
-
- * io.c (binary_file_p): Use heuristic to avoid declaring info
- files as binary files. Allow about 1.5% non-printing
- characters (in info's case, ^_).
-
-Tue Jul 7 01:09:26 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * diff.h: Replace function_regexp and ignore_regexp with lists
- of compiled regexps.
- * analyze.c, context.c, util.c: Test whether the lists, not
- the old variables, are empty.
- * util.c (analyze_hunk), context.c (find_function): Compare
- lines with the lists of regexps.
- * diff.c (add_regexp): New function.
- (main): Use it.
-
- * diff3: Add -v --version option.
- * Makefile.in: Link with version.o.
-
- * system.h: New file.
- * diff.h, cmp.c, diff3.c, sdiff.c: Use it.
-
- * diff.h, diff3.c: Include string.h or strings.h, as appropriate.
- Declare malloc and realloc.
-
- * diff3.c (perror_with_exit): Include program name in message.
-
- * diff3.c: Lowercase error messages for GNU standards.
-
- * sdiff.c [USG || STDC_HEADERS]: Define bcopy in terms of memcpy.
-
- * sdiff.c: Use the version number from version.c.
- * Makefile.in: Link with version.o.
-
- * cmp.c error.c xmalloc.c: New files from textutils.
- * Makefile.in: Add rules for them.
-
- * diff.c (longopts): --unidirectional-new-file is like -P, not -N.
- Rename --file-label to --label (leave old name, but undocumented).
-
- * sdiff.c, diff.c (usage): Condense messages and fix some errors.
-
- * diff3.c (main, usage): Add long-named options.
-
-Fri Jul 3 14:31:18 1992 David J. MacKenzie (djm@nutrimat.gnu.ai.mit.edu)
-
- * diff.h, diff3.c, sdiff.c: Change FOO_MISSING macros to HAVE_FOO.
-
-Thu Jun 25 16:59:47 1992 David J. MacKenzie (djm@apple-gunkies.gnu.ai.mit.edu)
-
- * diff.c: --reversed-ed -> --forward-ed.
-
-Wed Feb 26 12:17:32 1992 Paul Eggert (eggert@yata.uucp)
-
- * analyze.c, diff.c, diff.h, io.c: For -y, compare even if same file.
-
-Fri Feb 14 22:46:38 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * io.c, diff3.c, analyze.c: Add extra parentheses.
-
-Sun Feb 9 00:22:42 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu)
-
- * diff.h (unidirectional_new_file_flag): New variable.
- * diff.c (main): Set that for -P.
- (compare_files): Support -P, somewhat like -N.
- (longopts): Support long name for -P.
-
-Sat Jan 4 20:10:34 1992 Paul Eggert (eggert at yata.uucp)
-
- * Makefile.in: Distribute diff.info-* too.
-
- * README, sdiff.c: version number now matches version.c.
-
- * configure: Fix and document vfork test.
-
- * ifdef.c: Don't dump core if `diff -Dx f f'.
-
-Mon Dec 23 23:36:08 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
-
- * diff.h, diff3.c, sdiff.c: Change POSIX ifdefs to
- HAVE_UNISTD_H and _POSIX_VERSION.
-
-Wed Dec 18 17:00:31 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
-
- * Makefile.in (srcs): Add sdiff.c.
- (tapefiles): Add diff.texi and diff.info.
-
- * diff.h, diff3.c, sdiff.c: Use HAVE_VFORK_H instead of
- VFORK_HEADER and VFORK_WORKS.
-
-Tue Dec 17 00:02:59 1991 Paul Eggert (eggert at yata.uucp)
-
- * Makefile.in (all): Add diff.info, sdiff.
-
- * configure, diff.c, sdiff.c:
- Prefix long options with `--', not `+'.
- * diff.c: Regularize option names.
-
- * configure: Fix check for vfork.
- * configure, diff.c, diff.h, diff3.c, sdiff.c:
- Use Posix definitions when possible.
-
- * context.c: Align context with tab if -T is given. Tune.
- * diff.c, diff.h, side.c: Calculate column widths so that tabs line up.
- * io.c: Add distinction between white space and printing chars.
- * side.c: Don't expand tabs unless -t is given.
- * side.c, util.c: Tab expansion now knows about '\b', '\f', '\r', '\v'.
- * util.c: -w skips all white space. Remove lint. Tune.
-
- * sdiff.c: Support many more diff options, e.g. `-', `sdiff file dir'.
- Ignore interrupts while the subsidiary editor is in control.
- Clean up temporary file and kill subsidiary diff if interrupted.
- Ensure subsidiary diff doesn't ignore SIGPIPE.
- Don't get confused while waiting for two subprocesses.
- Don't let buffers overflow. Check for I/O errors.
- Convert to GNU style. Tune.
-
- * sdiff.c, util.c: Don't lose errno.
- Don't confuse sdiff with messages like `Binary files differ'.
- * sdiff.c, side.c: Don't assume that common lines are identical.
- Simplify --sdiff-merge-assist format.
-
-Mon Sep 16 16:42:01 1991 Tom Lord (lord at churchy.gnu.ai.mit.edu)
-
- * Makefile.in, sdiff.c: introduced sdiff front end to diff.
-
- * Makefile.in, analyze.c, diff.c, diff.h, io.c, side.c: Added
- sdiff-style output format to diff.
-
-Mon Aug 26 16:44:55 1991 David J. MacKenzie (djm at pogo.gnu.ai.mit.edu)
-
- * Makefile.in, configure: Only put $< in Makefile if using VPATH,
- because older makes don't understand it.
-
-Fri Aug 2 12:22:30 1991 David J. MacKenzie (djm at apple-gunkies)
-
- * configure: Create config.status. Remove it and Makefile if
- interrupted while creating them.
-
-Thu Aug 1 22:24:31 1991 David J. MacKenzie (djm at apple-gunkies)
-
- * configure: Check for +srcdir etc. arg and look for
- Makefile.in in that directory. Set VPATH if srcdir is not `.'.
- * Makefile.in: Get rid of $(archpfx).
-
-Tue Jul 30 21:28:44 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
-
- * Makefile.in (prefix): Renamed from DESTDIR.
-
-Wed Jul 24 23:08:56 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
-
- * diff.h, diff3.c: Rearrange ifdefs to use POSIX,
- STDC_HEADERS, VFORK_MISSING, DIRENT. This way it works on
- more systems that aren't pure USG or BSD.
- Don't not define const if __GNUC__ is defined -- that would
- break with -traditional.
- * configure: Check for those features.
-
-Wed Jul 10 01:39:23 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
-
- * configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL).
-
-Sat Jul 6 16:39:04 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
-
- * Replace Makefile with configure and Makefile.in.
- Update README with current compilation instructions.
-
-Sat Jul 6 14:03:29 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
-
- * util.c (setup_output): Just save the args for later use.
- (begin_output): Do the real work, with the values that were saved.
- It's safe to call begin_output more than once.
- Print the special headers for context format here.
- * analyze.c (diff_2_files): Don't print special headers here.
- * context.c (pr_context_hunk, pr_unidiff_hunk): Call begin_output.
- * ed.c (print_ed_hunk, print_forward_ed_hunk, print_rcs_hunk):
- * normal.c (print_normal_hunk): Likewise.
- * ifdef.c (print_ifdef_hunk): Likewise.
- * util.c (finish_output): Don't die if begin_output was not called.
-
-Thu Jun 20 23:10:01 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
-
- * Makefile: Add TAGS, distclean, and realclean targets.
- Set SHELL.
-
-Tue Apr 30 13:54:36 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu)
-
- * diff.h (TRUE, FALSE): Undefine these before defining.
-
-Thu Mar 14 18:27:27 1991 Richard Stallman (rms@mole.ai.mit.edu)
-
- * Makefile (objs): Include $(ALLOCA).
-
-Sat Mar 9 22:34:03 1991 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.h: Include regex.h.
-
-Thu Feb 28 18:59:53 1991 Richard Stallman (rms at mole.ai.mit.edu)
-
- * Makefile (diff3): Link with GNU getopt.
-
-Sat Feb 23 12:49:43 1991 Richard Stallman (rms at mole.ai.mit.edu)
-
- * io.c (find_equiv_class): Make hash code unsigned before mod.
-
- * diff.h (files): Add EXTERN.
-
-Sun Jan 13 21:33:01 1991 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c: +print option renamed +paginate. Remove +all-text.
-
-Mon Jan 7 06:18:01 1991 David J. MacKenzie (djm at geech.ai.mit.edu)
-
- * Makefile (dist): New target, replacing diff.tar and
- diff.tar.Z, to encode version number in distribution directory
- and tar file names.
-
-Sun Jan 6 18:42:23 1991 Michael I Bushnell (mib at geech.ai.mit.edu)
-
- * Version 1.15 released.
-
- * version.c: Updated from 1.15 alpha to 1.15
-
- * context.c (print_context_number_range,
- print_unidiff_number_range): Don't print N,M when N=M, print
- just N instead.
-
- * README: Updated for version 1.15.
- Makefile: Updated for version 1.15.
-
- * diff3.c (main): Don't get confused if one of the arguments
- is a directory.
-
- * diff.c (compare_files): Don't get confused if comparing
- standard input to a directory; print error instead.
-
- * analyze.c (diff_2_files), context.c (print_context_header,
- print_context_script), diff.c (main), diff.h (enum
- output_style): Tread unidiff as an output style in its own
- right. This also generates an error when both -u and -c are
- given.
-
- * diff.c (main): Better error messages when regexps are bad.
-
- * diff.c (compare_files): Don't assume stdin is opened.
-
- * diff3.c (read_diff): Don't assume things about the order of
- descriptor assignment and closes.
-
- * util.c (setup_output): Don't assume things about the order
- of descriptor assignment and closes.
-
- * diff.c (compare_files): Set a flag so that closes don't
- happen more than once.
-
- * diff.c (main): Don't just flush stdout, do a close. That
- way on broken systems we can still get errors.
-
-Mon Dec 24 16:24:17 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c (usage): Use = for args of long options.
-
-Mon Dec 17 18:19:20 1990 Michael I Bushnell (mib at geech.ai.mit.edu)
-
- * context.c (print_context_label): Labels were interchanged badly.
-
- * context.c (pr_unidiff_hunk): Changes to deal with files
- ending in incomplete lines.
- * util.c (print_1_line): Other half of the changes.
-
-Mon Dec 3 14:23:55 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c (longopts, usage): unidiff => unified.
-
-Wed Nov 7 17:13:08 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * analyze.c (diff_2_files): No warnings about newlines for -D.
-
- * diff.c (pr_unidiff_hunk): Remove ref to output_patch_flag.
-
-Tue Oct 23 23:19:18 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c (compare_files): For -D, compare even args are same file.
- * analyze.c (diff_2_files): Likewise.
- Also, output even if files have no differences.
-
- * analyze.c (diff_2_files): Print missing newline messages last.
- Return 2 if a newline is missing.
- Print them even if files end with identical text.
-
-Mon Oct 22 19:40:09 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c (usage): Return 2.
-
-Wed Oct 10 20:54:04 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.c (longopts): Add +new-files.
-
-Sun Sep 23 22:49:29 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * context.c (print_context_script): Handle unidiff_flag.
- (print_context_header): Likewise.
- (print_unidiff_number_range, pr_unidiff_hunk): New functions.
- * diff.c (longopts): Add element for +unidiff.
- (main): Handle +unidiff and -u.
- (usage): Mention them.
-
-Wed Sep 5 16:33:22 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * io.c (find_and_hash_each_line): Deal with missing final newline
- after buffering necessary context lines.
-
-Sat Sep 1 16:32:32 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * io.c (find_identical_ends): ROBUST_OUTPUT_FORMAT test was backward.
-
-Thu Aug 23 17:17:20 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff3.c (WIFEXITED): Undef it if WEXITSTATUS is not defined.
- * context.c (find_function): Don't try to return values.
-
-Wed Aug 22 11:54:39 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * diff.h (O_RDONLY): Define if not defined.
-
-Tue Aug 21 13:49:26 1990 Richard Stallman (rms at mole.ai.mit.edu)
-
- * Handle -L option.
- * context.c (print_context_label): New function.
- (print_context_header): Use that.
- * diff.c (main): Recognize the option.
- (usage): Updated.
- * diff.h (file_label): New variable.
- * diff3.c (main): Recognize -L instead of -t.
-
- * diff3.c (main): Support -m without other option.
-
- * diff3.c (WEXITSTATUS, WIFEXITED): Define whenever not defined.
-
- * diff3.c (bcopy, index, rindex): Delete definitions; not used.
- (D_LINENUM, D_LINELEN): Likewise.
- (struct diff_block): lengths includes newlines.
- (struct diff3_block): Likewise.
- (always_text, merge): New variables.
- (read_diff): Return address of end, not size read. Calls changed.
- Pass -a to diff if given to diff3.
- current_chunk_size now an int. Detect error in `pipe'.
- Check for incomplete line of output here.
- (scan_diff_line): Don't make scan_ptr + 2 before knowing it is valid.
- No need to check validity of diff output here.
- Include newline in length of line.
- (main): Compute rev_mapping here. Handle -a and -m.
- Error message if excess -t operands. Error for incompatible options.
- Error if `-' given more than once.
- Fix error storing in tag_strings.
- (output_diff3): REV_MAPPING is now an arg. Call changed.
- Change syntax of "missing newline" message.
- Expect length of line to include newline.
- (output_diff3_edscript): Return just 0 or 1.
- REV_MAPPING is now an arg. Call changed.
- (output_diff3_merge): New function.
- (process_diff): Better error message for bad diff format.
- (fatal, perror_with_exit): Return status 2.
-
- * analyze.c (diff_2_files): Report missing newline in either
- or both files, if not robust output style.
-
- * util.c (setup_output): Detect error from pipe.
- No need to close stdin.
-
- * util.c (print_1_line): Change format of missing-newline msg.
- Change if statements to switch.
-
- * io.c (slurp): Don't mention differences in final newline if -B.
-
- * io.c (binary_file_p): Use ISO char set as criterion, not ASCII.
-
- * io.c (find_identical_ends): Increase value of BEG0 by 1.
- Other changes in backwards scan to avoid decrementing pointers
- before start of array, and set LINES properly.
-
- * diff.h (ROBUST_OUTPUT_STYLE): New macro.
- * io.c (find_identical_ends, find_and_hash_each_line): Use that macro.
-
- * diff.h (dup2): Don't define if XENIX.
-
- * diff.c (main): Check for write error at end.
-
- * context.c (find_function): Don't return a value.
- Use argument FILE rather than global files.
-
- * analyze.c: Add external function declarations.
- * analyze.c (build_script): Turn off explicit check for final newline.
-
- * analyze.c (discard_confusing_lines): Make integers unsigned.
-
-Tue Jul 31 21:37:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (find_and_hash_each_line): Correct the criterion
- for leaving out the newline from the end of the line.
-
-Tue May 29 21:28:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * dir.c (diff_dirs): Free things only if nonzero.
-
-Mon Apr 16 18:31:05 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.h (NDIR_IN_SYS): New macro controls location of ndir.h.
-
- * diff3.c (xmalloc, xrealloc): Don't die if size == 0 returns 0.
-
-Sun Mar 25 15:58:42 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * analyze.c (discard_confusing_lines):
- `many' wasn't being used; use it.
- Canceling provisionals near start of run must handle already
- canceled provisionals.
- Canceling subruns of provisionals was canceling last nonprovisional.
-
-Sat Mar 24 14:02:51 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * analyze.c (discard_confusing_lines):
- Threshold for line occurring many times scales by square root
- of total lines.
- Within each run, cancel any long subrun of provisionals.
- Don't update `provisional' while canceling provisionals.
- In big outer loop, handle provisional and nonprovisional separately.
-
-Thu Mar 22 16:35:33 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * analyze.c (discard_confusing_lines):
- The first loops to discard provisionals from ends failed to step.
- In second such loops, keep discarding all consecutive provisionals.
- Increase threshold for stopping discarding, and also check for
- consecutive nondiscardables as separate threshold.
-
-Fri Mar 16 00:33:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (read_diff): Pass -- as first arg to diff.
-
- * diff3.c: Include wait.h or define equivalent macros.
- (read_diff): Don't use stdio printing error in the inferior.
- Remember the pid and wait for it. Report failing status.
- Report failure of vfork.
-
-Sun Mar 11 17:10:32 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (main): Accept -t options and pass to output_diff3_edscript.
- (usage): Mention -t.
- (read_diff): Use vfork.
- (vfork): Don't use it on Sparc.
-
- * diff.h (vfork): Don't use it on Sparc.
-
-Tue Mar 6 22:37:20 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (dup2): Don't define on Xenix.
-
- * Makefile: Comments for Xenix.
-
-Thu Mar 1 17:19:23 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * analyze.c (diff_2_files): `message' requires three args.
-
-Fri Feb 23 10:56:50 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
-
- * diff.h, util.c, diff3.c: Change 'void *' to 'VOID *', with
- VOID defined as void if __STDC__, char if not.
-
-Sun Feb 18 20:31:58 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
-
- * Makefile: Add rules for getopt.c, getopt1.c, getopt.h.
-
- * getopt.c, getopt.h, getopt1.c: New files.
-
- * main.c (main, usage): Add long options.
-
- * analyze.c (shift_boundaries): Remove unused var 'j_end'.
-
-Thu Feb 8 02:43:16 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
-
- * GNUmakefile: include ../Makerules before Makefile.
-
-Fri Feb 2 23:21:38 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * analyze.c (diff_2_files): If -B or -I, don't return 1
- if all changes were ignored.
-
-Wed Jan 24 20:43:57 1990 Richard Stallman (rms at albert.ai.mit.edu)
-
- * diff3.c (fatal): Output to stderr.
-
-Thu Jan 11 00:25:56 1990 David J. MacKenzie (djm at hobbes.ai.mit.edu)
-
- * diff.c (usage): Mention -v.
-
-Wed Jan 10 16:06:38 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (output_diff3_edscript): Return number of overlaps.
- (main): If have overlaps, exit with status 1.
-
-Sun Dec 24 10:29:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (find_equiv_class): Fix typo that came from changing init of B
- to an assignment.
-
- * version.c: New file.
- * diff.c (main): -v prints version number.
-
- * io.c (binary_file_p): Null char implies binary file.
-
-Fri Nov 17 23:44:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * util.c (print_1_line): Fix off by 1 error.
-
-Thu Nov 16 13:51:10 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * util.c (xcalloc): Function deleted.
-
- * io.c (slurp): Null-terminate the buffer.
-
- * io.c (read_files): Delete unused vars.
-
- * io.c (find_equiv_class): Don't index by N if too low.
-
- * dir.c (dir_sort): Delete the extra declaration of compare_names.
-
- * diff.h: Don't declare xcalloc. Declare some other functions.
-
- * analyze.c (shift_boundaries):
- Test for END at end of range before indexing by it.
- Fix misspelling of `preceding' in var names.
-
-Sat Nov 11 14:04:16 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (using_to_diff3_block): Delete unused vars.
- (make_3way_diff, process_diff_control, read_diff, output_diff3): Likewise.
-
-Mon Nov 6 18:15:50 EST 1989 Jay Fenlason (hack@ai.mit.edu)
-
- * README Fix typo.
-
-Fri Nov 3 15:27:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (usage): Mention -D.
-
- * ifdef.c (print_ifdef_hunk): Write comments on #else and #endif.
-
-Sun Oct 29 16:41:07 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (compare_files): Don't fflush for identical files.
-
-Wed Oct 25 17:57:12 1989 Randy Smith (randy at apple-gunkies.ai.mit.edu)
-
- * diff3.c (using_to_diff3_block): When defaulting lines from
- FILE0, only copy up to just under the *lowest* line mentioned
- in the next diff.
-
- * diff3.c (fatal): Add \n to error messages.
-
-Wed Oct 25 15:05:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * Makefile (tapefiles): Add ChangeLog.
-
-Tue Oct 3 00:51:17 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c (process_diff, create_diff3_block): Init ->next field.
-
-Fri Sep 29 08:16:45 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * util.c (line_cmp): Alter end char of line 2, not line 1.
-
-Wed Sep 20 00:12:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * Makefile (diff.tar): Expect ln to fail on some files;
- copy them with cp.
-
-Mon Sep 18 02:54:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * Handle -D option:
- * io.c (find_and_hash_each_line): Keep all lines of 1st file.
- * diff.c (main): Handle -D option.
- (compare_files): Reject -D if files spec'd are directories.
- * analyze.c (diff_2_files): Handle OUTPUT_IFDEF case.
-
-Fri Sep 1 20:15:50 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (option_list): Rename arg VECTOR as OPTIONVEC.
-
-Mon Aug 28 17:58:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (compare_files): Clear entire inf[i].stat.
-
-Wed Aug 23 17:48:47 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu)
-
- * io.c (find_identical_ends): Sign was backward
- determining where to bound the scan for the suffix.
-
-Wed Aug 16 12:49:16 1989 Richard Stallman (rms at hobbes.ai.mit.edu)
-
- * analyze.c (diff_2_files): If -q, treat all files as binary.
- * diff.c (main): Detect -q, record in no_details_flag.
-
-Sun Jul 30 23:12:00 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (usage): New function.
- (main): Call it.
-
-Wed Jul 26 02:02:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (main): Make -C imply -c.
-
-Thu Jul 20 17:57:51 1989 Chris Hanson (cph at kleph)
-
- * io.c (find_and_hash_each_line): Bug fix in context handling,
- introduced by last change.
-
-Fri Jul 14 17:39:20 1989 Chris Hanson (cph at kleph)
-
- * analyze.c: To make RCS work correctly on files that don't
- necessarily end in newline, introduce some changes that cause
- diffs to be sensitive to missing final newline. Because
- non-RCS modes don't want to be affected by these changes, they
- are conditional on `output_style == OUTPUT_RCS'.
- (diff_2_files) [OUTPUT_RCS]: Suppress the "File X missing
- newline" message.
- (build_script) [OUTPUT_RCS]: Cause the last line to compare as
- different if exactly one of the files is missing its final
- newline.
-
- * io.c (find_and_hash_each_line): Bug fix in
- ignore_space_change mode. Change line's length to include the
- newline. For OUTPUT_RCS, decrement last line's length if
- there is no final newline.
- (find_identical_ends) [OUTPUT_RCS]: If one of the files is
- missing a final newline, make sure it's not included in either
- the prefix or suffix.
-
- * util.c (print_1_line): Change line output routine to account
- for line length including the newline.
-
-Tue Jun 27 02:35:28 1989 Roland McGrath (roland at hobbes.ai.mit.edu)
-
- * Makefile: Inserted $(archpfx) where appropriate.
-
-Wed May 17 20:18:43 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff3.c [USG]: Include fcntl.h.
-
- * diff.h [USG]: New compilation flags HAVE_NDIR, HAVE_DIRECT.
-
-Wed Apr 26 15:35:57 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * dir.c (diff_dirs): Two new args, NONEX1 and NONEX2, say to pretend
- nonex dirs are empty.
- (dir_sort): New arg NONEX, likewise.
- * diff.c (compare_files): Pass those args.
- Sometimes call diff_dirs if subdir exists in just one place.
-
-Wed Apr 12 01:10:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (find_identical_ends): Set END0 *after* last char
- during backward scan for suffix.
-
-Sat Apr 8 15:49:49 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
-
- * diff3.c (using_to_diff3_block): Now find high marks in files 1
- and 2 through mapping off of the last difference instead of the
- first.
-
- * diff3.c: Many trivial changes to spelling inside comments.
-
-Fri Feb 24 12:38:03 1989 Randall Smith (randy at gluteus.ai.mit.edu)
-
- * util.c, normal.c, io.c, ed.c, dir.c, diff.h, diff.c, context.c,
- analyze.c, Makefile: Changed copyright header to conform with new
- GNU General Public license.
- * diff3.c: Changed copyright header to conform with new GNU
- General Public license.
- * COPYING: Made a hard link to /gp/rms/COPYING.
-
-Fri Feb 24 10:01:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (slurp): Leave 2 chars space at end of buffer, not one.
- (find_identical_ends): Special case if either file is empty;
- don't try to make a sentinel since could crash.
-
-Wed Feb 15 14:24:48 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu)
-
- * diff3.c (message) Re-wrote routine to avoid using alloca()
-
-Wed Feb 15 06:19:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (find_identical_ends): Delete the variable `bytes'.
-
-Sun Feb 12 11:50:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * io.c (slurp): ->bufsize is nominal amount we have room for;
- add room for sentinel when calling xmalloc or xrealloc.
-
- * io.c (find_identical_ends): Do need overrun check in finding suffix.
-
-Fri Feb 10 01:28:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.c (main): -C now takes arg to specify context length.
- Now -p to show C function name--Damned IEEE!
- Fatal error if context length spec'd twice.
-
- * ed.c (print_ed_hunk): Now special treatment only for lines containing
- precisely a dot and nothing else. Output `..', end the insert,
- substitute that one line, then resume the insert if nec.
-
- * io.c (find_and_hash_lines): When backing up over starting context,
- don't move past buffer-beg.
-
- * io.c (find_identical_ends): Use sentinels to make the loops faster.
- If files are identical, skip the 2nd loop and return quickly.
- (slurp): Leave 1 char extra space after each buffer.
-
- * analyze.c (diff_2_files): Mention difference in final newlines.
-
-Wed Jan 25 22:44:44 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * dir.c (diff_dirs): Use * when calling fcn ptr variable.
-
-Sat Dec 17 14:12:06 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * Makefile: New vars INSTALL and LIBS used in some rules;
- provide default defns plus commented-put defns for sysV.
-
-Thu Nov 17 16:42:53 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * dir.c (dir_sort): Open-trouble not fatal; just say # files is -1.
- (diff_dirs): If dir_sort does that, give up and return 2.
-
- * diff.c (compare_files): Don't open directories.
- Don't close them specially either.
- Cross-propagate inf[i].dir_p sooner.
-
-Sun Nov 13 11:19:36 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu)
-
- * diff.h: Declare index, rindex.
-
- * diff.c (compare_files): If comparing foodir with b/f,
- use foodir/f, not foodir/b/f.
-
- * diff.c (compare_files): Don't print "are identical" msg for 2 dirs.
- Status now 1 if one file is a dir and the other isn't, etc.
-
-Thu Nov 3 16:30:24 1988 Randall Smith (randy at gluteus.ai.mit.edu)
-
- * Makefile: Added a define for diff3 to define DIFF_PROGRAM.
-
- * util.c: Added hack to make sure that perror was not called with
- a null pointer.
-
- * diff.c: Changed S_IFDIR to S_IFMT in masking type of file bits
- out.
-
- * diff3.c: Included USG compatibility defines.
-
- * diff.h: Moved sys/file.h into #else USG section (not needed or
- wanted on System V).
-
- * ed.c, analyze.c, context.c: Shortened names to 12 characters for
- the sake of System V (too simple not to do).
-
-
-Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1997, 1998, 1999,
-2000, 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 they will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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.
Index: contrib/diff/FREEBSD-Xlist
===================================================================
--- contrib/diff/FREEBSD-Xlist
+++ /dev/null
@@ -1,59 +0,0 @@
-INSTALL
-Makefile.am
-Makefile.in
-aclocal.m4
-bootstrap
-config.hin
-config/
-configure
-configure.ac
-doc/Makefile.am
-doc/Makefile.in
-doc/diagmeet.note
-exgettext
-lib/Makefile.am
-lib/Makefile.in
-lib/alloca.c
-lib/alloca_.h
-lib/dirname.c
-lib/fnmatch.c
-lib/fnmatch_.h
-lib/fnmatch_loop.c
-lib/getopt.c
-lib/getopt1.c
-lib/getopt_int.h
-lib/gettimeofday.c
-lib/imaxtostr.c
-lib/inttostr.c
-lib/malloc.c
-lib/mkstemp.c
-lib/offtostr.c
-lib/posix/Makefile.in
-lib/realloc.c
-lib/regex.c
-lib/regex.h
-lib/setmode.c
-lib/stdbool_.h
-lib/strcasecmp.c
-lib/stripslash.c
-lib/strncasecmp.c
-lib/strtol.c
-lib/strtoll.c
-lib/strtoul.c
-lib/strtoull.c
-lib/tempname.c
-lib/time_r.c
-lib/time_r.h
-lib/umaxtostr.c
-lib/waitpid.c
-lib/xstrdup.c
-lib/xstrtol.c
-lib/xstrtoul.c
-lib/xstrtoumax.c
-m4/
-man/Makefile.am
-man/Makefile.in
-ms/
-po/
-src/Makefile.am
-src/Makefile.in
Index: contrib/diff/FREEBSD-upgrade
===================================================================
--- contrib/diff/FREEBSD-upgrade
+++ /dev/null
@@ -1,5 +0,0 @@
-Import of GNU diff 2.8.7
-
-Original source available as ftp://alpha.gnu.org/pub/gnu/diffutils/diffutils-2.8.7.tar.gz
-
-Removed files are listed in FREEBSD-Xlist.
Index: contrib/diff/NEWS
===================================================================
--- contrib/diff/NEWS
+++ /dev/null
@@ -1,244 +0,0 @@
-Version 2.8.7 contains no user-visible changes.
-
-User-visible changes in version 2.8.6:
-
-* New diff3 option --strip-trailing-cr.
-
-* With -N and -P, inaccessible empty regular files (the kind of files
- that 'patch' creates to indicate nonexistent backups) are now
- treated as nonexistent when they are in the 'backup' file position.
-
-* If multiple SKIP values are given to cmp, e.g., `cmp -i 10 -i 20',
- cmp now uses the maximal value instead of the last one.
-
-* diff now omits the ".000000000" on hosts that do not support
- fractional time stamps.
-
-Version 2.8.5 was not publicly released.
-
-User-visible changes in version 2.8.4:
-
-* Diff now simply prints "Files A and B differ" instead of "Binary
- files A and B differ". The message is output if either A or B
- appears to be a binary file, and the old wording was misleading
- because it implied that both files are binary, which is not
- necessarily the case.
-
-User-visible changes in version 2.8.3:
-
-* New locale: en_US.
-
-User-visible changes in version 2.8.2:
-
-* New diff and sdiff option:
- --tabsize=COLUMNS
-* If --ignore-space-change or --ignore-all-space is also specified,
- --ignore-blank-lines now considers lines to be empty if they contain
- only white space.
-* More platforms now handle multibyte characters correctly when
- excluding files by name (diff -x and -X).
-* New locales: hu, pt_BR.
-
-User-visible changes in version 2.8.1:
-
-* Documentation fixes.
-
-User-visible changes in version 2.8:
-
-* cmp and diff now conform to POSIX 1003.1-2001 (IEEE Std 1003.1-2001)
- if the underlying system conforms to POSIX and if the _POSIX2_VERSION
- environment variable is set to 200112. Conformance removes support
- for `diff -NUM', where NUM is a number. Use -C NUM or -U NUM instead.
-* cmp now supports trailing operands SKIP1 and SKIP2, like BSD cmp.
-* cmp -i or --ignore-initial now accepts SKIP1:SKIP2 option value.
-* New cmp option: -n or --bytes.
-* cmp's old -c or --print-chars option has been renamed;
- use -b or --print-bytes instead.
-* cmp now outputs "byte" rather than "char" outside the POSIX locale.
-* cmp -l's index column width now adjusts to fit larger (or smaller) files.
-* cmp -l -s and cmp -s -l are not allowed. Use cmp -s or cmp -l instead.
-* diff uses ISO 8601 style time stamps for output times (e.g. "2001-11-23
- 16:44:36.875702460 -0800") unless in the C or POSIX locale and the
- -c style is specified.
-* diff's -I and -F options use the regexp syntax of grep, not of Emacs.
-* diff now accepts multiple context arguments, and uses their maximum value.
-* New diff and sdiff options:
- -E --ignore-tab-expansion
- --strip-trailing-cr
-* New diff options:
- --from-file=FILE, --to-file=FILE
- --ignore-file-name-case
- --no-ignore-file-name-case
-* New diff3 and sdiff option:
- --diff-program=PROGRAM
-* The following diff options are still accepted, but are no longer documented.
- They may be withdrawn in future releases.
- -h (omit; it has no effect)
- -H (use --speed-large-files instead)
- -L (use --label instead)
- -P (use --unidirectional-new-file instead)
- --inhibit-hunk-merge (omit; it has no effect)
-* Recursive diffs now sort file names according to the LC_COLLATE locale
- category if possible, instead of using native byte comparison.
-* Recursive diffs now detect and report directory loops.
-* Diff printf specs can now use the "0" and "'" flags.
-* The new sdiff interactive command `ed' precedes each version with a header.
-* On 64-bit hosts, files larger than 2 GB can be compared.
-* Some internationalization support has been added, but multibyte locales
- are still not completely supported yet.
-* Some diagnostics have been reworded slightly for consistency.
- Also, `diff -D FOO' now outputs `/* ! FOO */' instead of `/* not FOO */'.
-* The `patch' part of the manual now describes `patch' version 2.5.4.
-* Man pages are now distributed and installed.
-* There is support for DJGPP; see the 'ms' subdirectory and the files
- m4/dos.m4 and */setmode.*.
-
-
-User-visible changes in version 2.7:
-
-* New diff option: --binary (useful only on non-POSIX hosts)
-* diff -b and -w now ignore line incompleteness; -B no longer does this.
-* cmp -c now uses locale to decide which output characters to quote.
-* Help and version messages are reorganized.
-
-
-User-visible changes in version 2.6:
-
-* New cmp, diff, diff3, sdiff option: --help
-* A new heuristic for diff greatly reduces the time needed to compare
- large input files that contain many differences.
-* Partly as a result, GNU diff's output is not exactly the same as before.
- Usually it is a bit smaller, but sometimes it is a bit larger.
-
-
-User-visible changes in version 2.5:
-
-* New cmp option: -v --version
-
-
-User-visible changes in version 2.4:
-
-* New cmp option: --ignore-initial=BYTES
-* New diff3 option: -T --initial-tab
-* New diff option: --line-format=FORMAT
-* New diff group format specifications:
- <PRINTF_SPEC>[eflmnEFLMN]
- A printf spec followed by one of the following letters
- causes the integer corresponding to that letter to be
- printed according to the printf specification.
- E.g. `%5df' prints the number of the first line in the
- group in the old file using the "%5d" format.
- e: line number just before the group in old file; equals f - 1
- f: first line number in group in the old file
- l: last line number in group in the old file
- m: line number just after the group in old file; equals l + 1
- n: number of lines in group in the old file; equals l - f + 1
- E, F, L, M, N: likewise, for lines in the new file
- %(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. T and E are
- arbitrary format strings. 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.
- %c'C'
- where C is a single character, stands for the character C. C may not
- be a backslash or an apostrophe. E.g. %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. E.g. %c'\0' stands for a null character.
-* New diff line format specifications:
- <PRINTF_SPEC>n
- The line number, printed with <PRINTF_SPEC>.
- E.g. `%5dn' prints the line number with a "%5d" format.
- %c'C'
- %c'\O'
- The character C, or with octal code O, as above.
-* Supported <PRINTF_SPEC>s have the same meaning as with printf, but must
- match the extended regular expression %-*[0-9]*(\.[0-9]*)?[doxX].
-* The format spec %0 introduced in version 2.1 has been removed, since it
- is incompatible with printf specs like %02d. To represent a null char,
- use %c'\0' instead.
-* cmp and diff now conform to POSIX 1003.2-1992 (ISO/IEC 9945-2:1993)
- if the underlying system conforms to POSIX:
- - Some messages' wordings are changed in minor ways.
- - ``White space'' is now whatever C's `isspace' says it is.
- - When comparing directories, if `diff' finds a file that is not a regular
- file or a directory, it reports the file's type instead of diffing it.
- (As usual, it follows symbolic links first.)
- - When signaled, sdiff exits with the signal's status, not with status 2.
-* Now portable to hosts where int, long, pointer, etc. are not all the same
- size.
-* `cmp - -' now works like `diff - -'.
-
-
-User-visible changes in version 2.3:
-
-* New diff option: --horizon-lines=lines
-
-
-User-visible changes in version 2.1:
-
-* New diff options:
- --{old,new,unchanged}-line-format='format'
- --{old,new,unchanged,changed}-group-format='format'
- -U
-* New diff3 option:
- -A --show-all
-* diff3 -m now defaults to -A, not -E.
-* diff3 now takes up to three -L or --label options, not just two.
- If just two options are given, they refer to the first two input files,
- not the first and third input files.
-* sdiff and diff -y handle incomplete lines.
-
-
-User-visible changes in version 2.0:
-
-* Add sdiff and cmp programs.
-* Add Texinfo documentation.
-* Add configure script.
-* Improve diff performance.
-* New diff options:
--x --exclude
--X --exclude-from
--P --unidirectional-new-file
--W --width
--y --side-by-side
---left-column
---sdiff-merge-assist
---suppress-common-lines
-* diff options renamed:
---label renamed from --file-label
---forward-ed renamed from --reversed-ed
---paginate renamed from --print
---entire-new-file renamed from --entire-new-files
---new-file renamed from --new-files
---all-text removed
-* New diff3 options:
--v --version
-* Add long-named equivalents for other diff3 options.
-* diff options -F (--show-function-line) and -I (--ignore-matching-lines)
- can now be given more than once.
-
-
-
-Copyright (C) 1993, 1994, 1998, 2001, 2002, 2004 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 they will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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.
Index: contrib/diff/README
===================================================================
--- contrib/diff/README
+++ /dev/null
@@ -1,69 +0,0 @@
-README for GNU DIFF
-
-This directory contains the GNU diff, diff3, sdiff, and cmp utilities.
-Their features are a superset of the Unix features and they are
-significantly faster.
-
-Please see the file COPYING for copying conditions.
-
-Please see the file doc/version.texi for version information.
-
-Please see the file doc/diff.texi (or doc/diff.info) for documentation
-that can be printed with TeX, or read with the `info' program or with
-Emacs's `M-x info'. Brief man pages are in man/*, but they are no
-substitute for the documentation.
-
-Please see the file ABOUT-NLS for notes about translations.
-
-Please see the file INSTALL for generic compilation and installation
-instructions. Briefly, you can run "./configure; make install". The
-command "./configure --help" lists the supported --enable and --with
-options.
-
-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; see <ftp://ftp.gnu.org/gnu/libiconv/>. 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 a nonstandard compiler, please install GCC first.
-
-If you make changes to the source code, you may need appropriate
-versions of GNU build tools to regenerate the intermediate files. The
-following versions were used to generate the intermediate files in
-this distribution:
-
-* Autoconf 2.59 <ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.gz>
-* Automake 1.8.3 <ftp://ftp.gnu.org/gnu/automake/automake-1.8.3.tar.gz>
-* gettext 0.14.1 <ftp://ftp.gnu.org/gnu/gettext/gettext-0.14.1.tar.gz>
-* help2man 1.33 <ftp://ftp.gnu.org/gnu/help2man/help2man-1.33.1.tar.gz>
-* Texinfo 4.7 <ftp://ftp.gnu.org/gnu/texinfo/texinfo-4.7.tar.gz>
-
-Please report bugs to <bug-gnu-utils@gnu.org>.
-
------
-
-Copyright (C) 1992, 1998, 2001, 2002, 2004 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.
Index: contrib/diff/THANKS
===================================================================
--- contrib/diff/THANKS
+++ /dev/null
@@ -1,22 +0,0 @@
-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>
Index: contrib/diff/TODO
===================================================================
--- contrib/diff/TODO
+++ /dev/null
@@ -1 +0,0 @@
-Add --include option (opposite of --exclude).
Index: contrib/diff/config.h
===================================================================
--- contrib/diff/config.h
+++ /dev/null
@@ -1,573 +0,0 @@
-/* config.h. Generated by configure. */
-/* config.hin. Generated from configure.ac by autoheader. */
-
-/* $FreeBSD$ */
-
-/* Define to 1 if the `closedir' function returns void instead of `int'. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
- systems. This function is required for `alloca.c' support on those systems.
- */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define to 1 if using `alloca.c'. */
-/* #undef C_ALLOCA */
-
-/* Name of editor program, unless overridden. */
-#define DEFAULT_EDITOR_PROGRAM "/usr/bin/vi"
-
-/* Define the default level of POSIX conformance. The value is of the form
- YYYYMM, specifying the year and month the standard was adopted. If not
- defined here, it defaults to the value of _POSIX2_VERSION in <unistd.h>.
- Define to 199209 to default to POSIX 1003.2-1992, which makes standard
- programs like `head', `tail', and `sort' accept obsolete options like `+10'
- and `-10'. Define to 200112 to default to POSIX 1003.1-2001, which makes
- these standard programs treat leading-`+' operands as file names and
- require modern usages like `-n 10' instead of `-10'. Whether defined here
- or not, the default can be overridden at run time via the _POSIX2_VERSION
- environment variable. */
-/* #undef DEFAULT_POSIX2_VERSION */
-
-/* Define to 1 if translation of program messages to the user's native
- language is requested. */
-#define ENABLE_NLS 0
-
-/* 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. */
-#define FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0
-
-/* Define if the backslash character may also serve as a file name component
- separator. */
-#define FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0
-
-#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
-
-/* Define if gettimeofday clobbers localtime's static buffer. */
-/* #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME_BUFFER */
-
-/* Define to 1 if you have `alloca', as a function or macro. */
-#define HAVE_ALLOCA 1
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
- */
-/* #undef HAVE_ALLOCA_H */
-
-/* Define to 1 if you have the `btowc' function. */
-#define HAVE_BTOWC 1
-
-/* Define to 1 if you have the `clock_gettime' function. */
-#define HAVE_CLOCK_GETTIME 1
-
-/* Define to 1 if C supports variable-length arrays. */
-#define HAVE_C_VARARRAYS 1
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
- */
-/* #undef HAVE_DCGETTEXT */
-
-/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_CLEARERR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
- don't. */
-#define HAVE_DECL_FEOF_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FERROR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FFLUSH_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FGETS_UNLOCKED 0
-
-/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FPUTC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FPUTS_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FREAD_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_FWRITE_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_GETCHAR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getcontext', and to 0 if you
- don't. */
-#define HAVE_DECL_GETCONTEXT 1
-
-/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
- don't. */
-#define HAVE_DECL_GETC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
- */
-#define HAVE_DECL_GETENV 1
-
-/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if
- you don't. */
-#define HAVE_DECL_PUTCHAR_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you
- don't. */
-#define HAVE_DECL_PUTC_UNLOCKED 1
-
-/* Define to 1 if you have the declaration of `sigaltstack', and to 0 if you
- don't. */
-#define HAVE_DECL_SIGALTSTACK 1
-
-/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
- don't. */
-#define HAVE_DECL_STRERROR_R 1
-
-/* Define to 1 if you have the declaration of `strtoimax', and to 0 if you
- don't. */
-#define HAVE_DECL_STRTOIMAX 1
-
-/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
- don't. */
-#define HAVE_DECL_STRTOLL 1
-
-/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
- don't. */
-#define HAVE_DECL_STRTOULL 1
-
-/* Define to 1 if you have the declaration of `strtoumax', and to 0 if you
- don't. */
-#define HAVE_DECL_STRTOUMAX 1
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
- */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the `dup2' function. */
-#define HAVE_DUP2 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the `fork' function. */
-#define HAVE_FORK 1
-
-/* Define to 1 if you have the `getcontext' function. */
-#define HAVE_GETCONTEXT 1
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-/* #undef HAVE_GETTEXT */
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define HAVE_GETTIMEOFDAY 1
-
-/* Define if you have the iconv() function. */
-/* #undef HAVE_ICONV */
-
-/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
-#define HAVE_INTMAX_T 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
- declares uintmax_t. */
-#define HAVE_INTTYPES_H_WITH_UINTMAX 1
-
-/* Define to 1 if you have the `isascii' function. */
-#define HAVE_ISASCII 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-#define HAVE_LOCALE_H 1
-
-/* Define if you have the 'long long' type. */
-#define HAVE_LONG_LONG 1
-
-/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
- to 0 otherwise. */
-#define HAVE_MALLOC 1
-
-/* Define to 1 if you have the `mblen' function. */
-#define HAVE_MBLEN 1
-
-/* Define to 1 if you have the `mbrlen' function. */
-#define HAVE_MBRLEN 1
-
-/* Define to 1 if you have the `mbsrtowcs' function. */
-#define HAVE_MBSRTOWCS 1
-
-/* Define to 1 if <wchar.h> declares mbstate_t. */
-#define HAVE_MBSTATE_T 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the `mempcpy' function. */
-/* #undef HAVE_MEMPCPY */
-
-/* Define to 1 if you have the `mkstemp' function. */
-#define HAVE_MKSTEMP 1
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-/* #undef HAVE_NDIR_H */
-
-/* Define to 1 if your system has a GNU libc compatible `realloc' function,
- and to 0 otherwise. */
-#define HAVE_REALLOC 1
-
-/* Define to 1 if you have run the test for working tzset. */
-#define HAVE_RUN_TZSET_TEST 1
-
-/* Define to 1 if you have the `setlocale' function. */
-#define HAVE_SETLOCALE 1
-
-/* Define to 1 if you have the DOS-style `setmode' function. */
-/* #undef HAVE_SETMODE_DOS */
-
-/* Define to 1 if you have the `setrlimit' function. */
-#define HAVE_SETRLIMIT 1
-
-/* Define to 1 if you have the `sigaction' function. */
-#define HAVE_SIGACTION 1
-
-/* Define to 1 if you have the `sigaltstack' function. */
-#define HAVE_SIGALTSTACK 1
-
-/* Define to 1 if you have the `sigprocmask' function. */
-#define HAVE_SIGPROCMASK 1
-
-/* Define to 1 if the system has the type `stack_t'. */
-#define HAVE_STACK_T 1
-
-/* Define to 1 if stdbool.h conforms to C99. */
-#define HAVE_STDBOOL_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
- uintmax_t. */
-#define HAVE_STDINT_H_WITH_UINTMAX 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the `strcasecoll' function. */
-/* #undef HAVE_STRCASECOLL */
-
-/* Define to 1 if you have the `strerror_r' function. */
-#define HAVE_STRERROR_R 1
-
-/* Define to 1 if you have the `strftime' function. */
-#define HAVE_STRFTIME 1
-
-/* Define to 1 if you have the `stricoll' function. */
-/* #undef HAVE_STRICOLL */
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strncasecmp' function. */
-#define HAVE_STRNCASECMP 1
-
-/* Define to 1 if you have the `strtoimax' function. */
-#define HAVE_STRTOIMAX 1
-
-/* Define to 1 if you have the `strtol' function. */
-#define HAVE_STRTOL 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define HAVE_STRTOLL 1
-
-/* Define to 1 if you have the `strtoul' function. */
-#define HAVE_STRTOUL 1
-
-/* Define to 1 if you have the `strtoull' function. */
-#define HAVE_STRTOULL 1
-
-/* Define to 1 if you have the `strtoumax' function. */
-#define HAVE_STRTOUMAX 1
-
-/* Define to 1 if `sa_sigaction' is member of `struct sigaction'. */
-#define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1
-
-/* Define to 1 if `st_blksize' is member of `struct stat'. */
-#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
-
-/* Define to 1 if `st_rdev' is member of `struct stat'. */
-#define HAVE_STRUCT_STAT_ST_RDEV 1
-
-/* Define to 1 if `tm_zone' is member of `struct tm'. */
-#define HAVE_STRUCT_TM_TM_ZONE 1
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_DIR_H */
-
-/* Define to 1 if you have the <sys/file.h> header file. */
-#define HAVE_SYS_FILE_H 1
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
- */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#define HAVE_SYS_WAIT_H 1
-
-/* Define to 1 if localtime_r, etc. have the type signatures that POSIX
- requires. */
-#define HAVE_TIME_R_POSIX 1
-
-/* Define if struct tm has the tm_gmtoff member. */
-#define HAVE_TM_GMTOFF 1
-
-/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
- `HAVE_STRUCT_TM_TM_ZONE' instead. */
-#define HAVE_TM_ZONE 1
-
-/* Define to 1 if you don't have `tm_zone' but do have the external array
- `tzname'. */
-/* #undef HAVE_TZNAME */
-
-/* Define to 1 if you have the `tzset' function. */
-#define HAVE_TZSET 1
-
-/* Define to 1 if you have the <ucontext.h> header file. */
-#define HAVE_UCONTEXT_H 1
-
-/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
-#define HAVE_UINTMAX_T 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define if you have the 'unsigned long long' type. */
-#define HAVE_UNSIGNED_LONG_LONG 1
-
-/* Define to 1 if you have the `vfork' function. */
-#define HAVE_VFORK 1
-
-/* Define to 1 if you have the <vfork.h> header file. */
-/* #undef HAVE_VFORK_H */
-
-/* Define to 1 if you have the `waitpid' function. */
-#define HAVE_WAITPID 1
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#define HAVE_WCHAR_H 1
-
-/* Define to 1 if you have the <wctype.h> header file. */
-#define HAVE_WCTYPE_H 1
-
-/* Define to 1 if you have the `wmempcpy' function. */
-/* #undef HAVE_WMEMPCPY */
-
-/* Define to 1 if `fork' works. */
-#define HAVE_WORKING_FORK 1
-
-/* Define to 1 if `vfork' works. */
-#define HAVE_WORKING_VFORK 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. */
-/* #undef HAVE_XSI_STACK_OVERFLOW_HEURISTIC */
-
-/* Define to 1 if the system has the type `_Bool'. */
-#define HAVE__BOOL 1
-
-/* Define to 1 if you have the `__secure_getenv' function. */
-/* #undef HAVE___SECURE_GETENV */
-
-#if FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
-#else
-# define ISSLASH(C) ((C) == '/')
-#endif
-
-/* Name of package */
-#define PACKAGE "diffutils"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-gnu-utils@gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GNU diffutils"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU diffutils 2.8.7"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "diffutils"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "2.8.7"
-
-/* Name of "pr" program. */
-#define PR_PROGRAM "/usr/bin/pr"
-
-/* Define to 1 to avoid alloca in the regular-expression implementation. */
-#define REGEX_MALLOC 1
-
-/* If using the C implementation of alloca, define if you know the
- direction of stack growth for your system; otherwise it will be
- automatically deduced at run-time.
- STACK_DIRECTION > 0 => grows toward higher addresses
- STACK_DIRECTION < 0 => grows toward lower addresses
- STACK_DIRECTION = 0 => direction of growth unknown */
-/* #undef STACK_DIRECTION */
-
-/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
-/* #undef STAT_MACROS_BROKEN */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if strerror_r returns char *. */
-/* #undef STRERROR_R_CHAR_P */
-
-/* Define to be the nanoseconds member of struct stat's st_mtim, if it exists.
- */
-#define ST_MTIM_NSEC tv_nsec
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Define to 1 if your <sys/time.h> declares `struct tm'. */
-/* #undef TM_IN_SYS_TIME */
-
-/* Define if tzset clobbers localtime's static buffer. */
-/* #undef TZSET_CLOBBERS_LOCALTIME_BUFFER */
-
-/* Version number of package */
-#define VERSION "2.8.7"
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-
-/* Enable GNU extensions on systems that have them. */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
-
-/* Enable extensions on Solaris. */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to a replacement function name for fnmatch(). */
-/* #undef fnmatch */
-
-/* Define to rpl_gettimeofday if the replacement function should be used. */
-/* #undef gettimeofday */
-
-/* Define to rpl_gmtime if the replacement function should be used. */
-/* #undef gmtime */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to long or long long if <inttypes.h> and <stdint.h> don't define. */
-/* #undef intmax_t */
-
-/* Define to rpl_localtime if the replacement function should be used. */
-/* #undef localtime */
-
-/* Define to rpl_malloc if the replacement function should be used. */
-/* #undef malloc */
-
-/* Define to a type if <wchar.h> does not define. */
-/* #undef mbstate_t */
-
-/* Define to rpl_mkstemp if the replacement function should be used. */
-/* #undef mkstemp */
-
-/* Define to the name of the strftime replacement function. */
-#define my_strftime nstrftime
-
-/* Define to `long' if <sys/types.h> does not define. */
-/* #undef off_t */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef pid_t */
-
-/* Define to rpl_realloc if the replacement function should be used. */
-/* #undef realloc */
-
-/* Define to equivalent of C99 restrict keyword, or to nothing if this is not
- supported. Do not define if restrict is supported directly. */
-#define restrict __restrict
-
-/* Define to rpl_tzset if the wrapper function should be used. */
-/* #undef tzset */
-
-/* Define to unsigned long or unsigned long long if <stdint.h> and
- <inttypes.h> don't define. */
-/* #undef uintmax_t */
-
-/* Define as `fork' if `vfork' does not work. */
-/* #undef vfork */
Index: contrib/diff/doc/diff.7
===================================================================
--- contrib/diff/doc/diff.7
+++ /dev/null
@@ -1,6287 +0,0 @@
-.Dd 2015-03-02
-.Dt DIFF 7
-.Os
-.Sh NAME
-.Nm diff
-.Nd Comparing and Merging Files
-.Sh Comparing and Merging Files
-.Sh 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.
-.Pp
-You can use the
-.Xr diff
-command to show differences between two files, or each corresponding file
-in two directories.
-.Xr 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
-.Em diff
-or
-.Em patch .
-For files that are identical,
-.Xr diff
-normally produces no output; for binary (non-text) files,
-.Xr diff
-normally reports only that they are different.
-.Pp
-You can use the
-.Xr cmp
-command to show the byte and line numbers where two files differ.
-.Xr 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
-.Li M-x compare-windows .
-See Section.Dq Other Window ,
-for more information on that command.
-.Pp
-You can use the
-.Xr diff3
-command to show differences among three files. When two people have made independent
-changes to a common original,
-.Xr 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.
-.Pp
-You can use the
-.Xr sdiff
-command to merge two files interactively.
-.Pp
-You can use the set of differences produced by
-.Xr 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
-.Xr diff
-output, you can use the
-.Xr patch
-program to update, or
-.Em patch ,
-a copy of the file. If you think of
-.Xr diff
-as subtracting one file from another to produce their difference, you can
-think of
-.Xr patch
-as adding the difference to one file to reproduce the other.
-.Pp
-This manual first concentrates on making diffs, and later shows how to use
-diffs to update files.
-.Pp
-GNU
-.Xr 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 by Eugene W. Myers in \(lqAn O(ND) Difference
-Algorithm and its Variations\(rq,
-.Em Algorithmica
-Vol. 1 No. 2, 1986, pp. 251--266; and in \(lqA File Comparison Program\(rq, Webb Miller
-and Eugene W. Myers,
-.Em Software---Practice and Experience
-Vol. 15 No. 11, 1985, pp. 1025--1040. The algorithm was independently discovered
-as described by E. Ukkonen in \(lqAlgorithms for Approximate String Matching\(rq,
-.Em Information and Control
-Vol. 64, 1985, pp. 100--118. Unless the
-.Op --minimal
-option is used,
-.Xr diff
-uses a heuristic by Paul Eggert that limits the cost to O(N^1.5 log N) at
-the price of producing suboptimal output for large inputs with many differences.
-Related algorithms are surveyed by Alfred V. Aho in section 6.3 of \(lqAlgorithms
-for Finding Patterns in Strings\(rq,
-.Em Handbook of Theoretical Computer Science
-(Jan Van Leeuwen, ed.), Vol. A,
-.Em Algorithms and Complexity ,
-Elsevier/MIT Press, 1990, pp. 255--300.
-.Pp
-GNU
-.Xr diff3
-was written by Randy Smith. GNU
-.Xr sdiff
-was written by Thomas Lord. GNU
-.Xr cmp
-was written by Torbj\(:orn Granlund and David MacKenzie.
-.Pp
-GNU
-.Xr 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.
-.Pp
-.Sh 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.
-.Xr 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.
-.Pp
-GNU
-.Xr 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.
-.Xr 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.
-.Pp
-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.
-.Xr cmp
-reports the differences between two files byte by byte, instead of line by
-line. As a result, it is often more useful than
-.Xr diff
-for comparing binary files. For text files,
-.Xr 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.
-.Pp
-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,
-.Xr diff
-will report that a blank line has been added to the file, while
-.Xr cmp
-will report that almost every byte of the two files differs.
-.Pp
-.Xr 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.
-.Pp
-.Ss Hunks
-When comparing two files,
-.Xr diff
-finds sequences of lines common to both files, interspersed with groups of
-differing lines called
-.Em 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.
-.Xr diff
-tries to minimize the total hunk size by finding large sequences of common
-lines interspersed with small hunks of differing lines.
-.Pp
-For example, suppose the file
-.Pa F
-contains the three lines
-.Li a ,
-.Li b ,
-.Li c ,
-and the file
-.Pa G
-contains the same three lines in reverse order
-.Li c ,
-.Li b ,
-.Li a .
-If
-.Xr diff
-finds the line
-.Li c
-as common, then the command
-.Li diff F G
-produces this output:
-.Pp
-.Bd -literal -offset indent
-1,2d0
-< a
-< b
-3a2,3
-> b
-> a
-.Ed
-.Pp
-But if
-.Xr diff
-notices the common line
-.Li b
-instead, it produces this output:
-.Pp
-.Bd -literal -offset indent
-1c1
-< a
----
-> c
-3c3
-< c
----
-> a
-.Ed
-.Pp
-It is also possible to find
-.Li a
-as the common line.
-.Xr 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
-.Op -d
-or
-.Op --minimal
-option (see Section
-.Dq diff Performance ) .
-.Pp
-.Ss Suppressing Differences in Blank and Tab Spacing
-The
-.Op -E
-or
-.Op --ignore-tab-expansion
-option ignores 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 (see Section
-.Dq Tabs ) .
-.Pp
-The
-.Op -b
-or
-.Op --ignore-space-change
-option is stronger. It ignores white space at line end, and considers all
-other sequences of one or more white space characters within a line to be
-equivalent. With this option,
-.Xr diff
-considers the following two lines to be equivalent, where
-.Li $
-denotes the line end:
-.Pp
-.Bd -literal -offset indent
-Here lyeth muche rychnesse in lytell space. -- John Heywood$
-Here lyeth muche rychnesse in lytell space. -- John Heywood $
-.Ed
-.Pp
-The
-.Op -w
-or
-.Op --ignore-all-space
-option is stronger still. It ignores differences even if one line has white
-space where the other line has none.
-.Em 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 this option,
-.Xr diff
-considers the following two lines to be equivalent, where
-.Li $
-denotes the line end and
-.Li ^M
-denotes a carriage return:
-.Pp
-.Bd -literal -offset indent
-Here lyeth muche rychnesse in lytell space.-- John Heywood$
- He relyeth much erychnes seinly tells pace. --John Heywood ^M$
-.Ed
-.Pp
-.Ss Suppressing Differences Whose Lines Are All Blank
-The
-.Op -B
-or
-.Op --ignore-blank-lines
-option ignores changes that consist entirely of blank lines. With this option,
-for example, a file containing
-.Bd -literal -offset indent
-1. A point is that which has no part.
-
-2. A line is breadthless length.
--- Euclid, The Elements, I
-.Ed
-is considered identical to a file containing
-.Bd -literal -offset indent
-1. A point is that which has no part.
-2. A line is breadthless length.
-
-
--- Euclid, The Elements, I
-.Ed
-.Pp
-Normally this option affects only lines that are completely empty, but if
-you also specify the
-.Op -b
-or
-.Op --ignore-space-change
-option, or the
-.Op -w
-or
-.Op --ignore-all-space
-option, lines are also affected if they look empty but contain white space.
-In other words,
-.Op -B
-is equivalent to
-.Li -I '^$'
-by default, but it is equivalent to
-.Op -I '^[[:space:]]*$'
-if
-.Op -b
-or
-.Op -w
-is also specified.
-.Pp
-.Ss Suppressing Differences Whose Lines All Match a Regular Expression
-To ignore insertions and deletions of lines that match a
-.Xr grep
--style regular expression, use the
-.Op -I Va regexp
-or
-.Op --ignore-matching-lines= Va regexp
-option. You should escape regular expressions that contain shell metacharacters
-to prevent the shell from expanding them. For example,
-.Li diff -I '^[[:digit:]]'
-ignores all changes to lines beginning with a digit.
-.Pp
-However,
-.Op -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,
-.Xr diff
-prints the complete set of changes in its vicinity, including the ignorable
-ones.
-.Pp
-You can specify more than one regular expression for lines to ignore by using
-more than one
-.Op -I
-option.
-.Xr diff
-tries to match each line against each regular expression.
-.Pp
-.Ss Suppressing Case Differences
-GNU
-.Xr diff
-can treat lower case letters as equivalent to their upper case counterparts,
-so that, for example, it considers
-.Li Funky Stuff ,
-.Li funky STUFF ,
-and
-.Li fUNKy stuFf
-to all be the same. To request this, use the
-.Op -i
-or
-.Op --ignore-case
-option.
-.Pp
-.Ss 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,
-.Xr diff
-simply reports whether files differ. The
-.Op -q
-or
-.Op --brief
-option selects this output format.
-.Pp
-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
-.Xr diff
-can stop analyzing the files as soon as it knows that there are any differences.
-.Pp
-You can also get a brief indication of whether two files differ by using
-.Xr cmp .
-For files that are identical,
-.Xr cmp
-produces no output. When the files differ, by default,
-.Xr cmp
-outputs the byte and line number where the first difference occurs, or reports
-that one file is a prefix of the other. You can use the
-.Op -s ,
-.Op --quiet ,
-or
-.Op --silent
-option to suppress that information, so that
-.Xr cmp
-produces no output and reports whether the files differ using only its exit
-status (see Section
-.Dq Invoking cmp ) .
-.Pp
-Unlike
-.Xr diff ,
-.Xr cmp
-cannot compare directories; it can only compare two files.
-.Pp
-.Ss Binary Files and Forcing Text Comparisons
-If
-.Xr 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 (see Section
-.Dq Brief ) ,
-and reports only that the binary files are different. This is because line
-by line comparisons are usually not meaningful for binary files.
-.Pp
-.Xr 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,
-.Xr diff
-considers the file to be text; otherwise it considers the file to be binary.
-.Pp
-Sometimes you might want to force
-.Xr diff
-to consider files to be text. For example, you might be comparing text files
-that contain null characters;
-.Xr 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
-.Xr diff
-to consider all files to be text files, and compare them line by line, by
-using the
-.Op -a
-or
-.Op --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
-.Xr diff
-output will consist of hunks showing differences between long lines of whatever
-characters the files contain.
-.Pp
-You can also force
-.Xr diff
-to report only whether files differ (but not how). Use the
-.Op -q
-or
-.Op --brief
-option for this.
-.Pp
-Normally, differing binary files count as trouble because the resulting
-.Xr diff
-output does not capture all the differences. This trouble causes
-.Xr diff
-to exit with status 2. However, this trouble cannot occur with the
-.Op -a
-or
-.Op --text
-option, or with the
-.Op -q
-or
-.Op --brief
-option, as these options both cause
-.Xr diff
-to generate a form of output that represents differences as requested.
-.Pp
-In operating systems that distinguish between text and binary files,
-.Xr diff
-normally reads and writes all data as text. Use the
-.Op --binary
-option to force
-.Xr 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,
-.Xr diff
-normally ignores these carriage returns on input and generates them at the
-end of each output line, but with the
-.Op --binary
-option
-.Xr 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.
-.Pp
-The
-.Op --strip-trailing-cr
-causes
-.Xr 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.
-.Pp
-If you want to compare two files byte by byte, you can use the
-.Xr cmp
-program with the
-.Op -l
-or
-.Op --verbose
-option to show the values of each differing byte in the two files. With GNU
-.Xr cmp ,
-you can also use the
-.Op -b
-or
-.Op --print-bytes
-option to show the ASCII representation of those bytes.See Section
-.Dq Invoking cmp ,
-for more information.
-.Pp
-If
-.Xr 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.
-.Xr diff3
-uses the same test as
-.Xr diff
-to decide whether a file is binary. As with
-.Xr diff ,
-if the input files contain a few non-text bytes but otherwise are like text
-files, you can force
-.Xr diff3
-to consider all files to be text files and compare them line by line by using
-the
-.Op -a
-or
-.Op --text
-option.
-.Pp
-.Sh Xr diff Output Formats
-.Xr diff
-has several mutually exclusive options for output format. The following sections
-describe each format, illustrating how
-.Xr diff
-reports the differences between two sample input files.
-.Pp
-.Ss Two Sample Input Files
-Here are two sample files that we will use in numerous examples to illustrate
-the output of
-.Xr diff
-and how various options can change it.
-.Pp
-This is the file
-.Pa lao :
-.Pp
-.Bd -literal -offset indent
-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.
-.Ed
-.Pp
-This is the file
-.Pa tzu :
-.Pp
-.Bd -literal -offset indent
-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!
-.Ed
-.Pp
-In this example, the first hunk contains just the first two lines of
-.Pa lao ,
-the second hunk contains the fourth line of
-.Pa lao
-opposing the second and third lines of
-.Pa tzu ,
-and the last hunk contains just the last three lines of
-.Pa tzu .
-.Pp
-.Ss 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
-.Em context .
-.Pp
-GNU
-.Xr diff
-provides two output formats that show context around the differing lines:
-.Em context format
-and
-.Em unified format .
-It can optionally show in which function or section of the file the differing
-lines are found.
-.Pp
-If you are distributing new versions of files to other people in the form
-of
-.Xr 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.
-.Xr 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,
-.Xr patch
-can adjust the line numbers accordingly and still apply the diff correctly.See Section
-.Dq Imperfect ,
-for more information on using
-.Xr patch
-to apply imperfect diffs.
-.Pp
-.Em Context Format
-.Pp
-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.
-.Pp
-To select this output format, use the
-.Op -C Va lines ,
-.Op --context[= Va lines] ,
-or
-.Op -c
-option. The argument
-.Va lines
-that some of these options take is the number of lines of context to show.
-If you do not specify
-.Va lines ,
-it defaults to three. For proper operation,
-.Xr patch
-typically needs at least two lines of context.
-.Pp
-.No An Example of Context Format
-.Pp
-Here is the output of
-.Li diff -c lao tzu
-(see Section
-.Dq 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.
-.Pp
-.Bd -literal -offset indent
-*** 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!
-.Ed
-.Pp
-.No An Example of Context Format with Less Context
-.Pp
-Here is the output of
-.Li diff -C 1 lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files). Notice that at most one context
-line is reported here.
-.Pp
-.Bd -literal -offset indent
-*** 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!
-.Ed
-.Pp
-.No Detailed Description of Context Format
-.Pp
-The context output format starts with a two-line header, which looks like
-this:
-.Pp
-.Bd -literal -offset indent
-*** from-file from-file-modification-time
---- to-file to-file-modification time
-.Ed
-.Pp
-The time stamp normally looks like
-.Li 2002-02-21 23:30:39.942229878 -0800
-to indicate the date, time with fractional seconds, and time zone in
-.Lk ftp://ftp.isi.edu/in-notes/rfc2822.txt .
-(The fractional seconds are omitted on hosts that do not support fractional
-time stamps.) However, a traditional time stamp like
-.Li Thu Feb 21 23:30:39 2002
-is used if the
-.Ev LC_TIME
-locale category is either
-.Li C
-or
-.Li POSIX .
-.Pp
-You can change the header's content with the
-.Op --label= Va label
-option; see Alternate Names.
-.Pp
-Next come one or more hunks of differences; each hunk shows one area where
-the files differ. Context format hunks look like this:
-.Pp
-.Bd -literal -offset indent
-***************
-*** from-file-line-numbers ****
- from-file-line
- from-file-line...
---- to-file-line-numbers ----
- to-file-line
- to-file-line...
-.Ed
-.Pp
-If a hunk contains two or more lines, its line numbers look like
-.Li Va start, Va end .
-Otherwise only its end line number appears. An empty hunk is considered to
-end at the line that precedes the hunk.
-.Pp
-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:
-.Pp
-.Bl -tag -width Ds
-.It !
-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
-.Li !
-in the part of this hunk for the other file.
-.Pp
-.It +
-An \(lqinserted\(rq line in the second file that corresponds to nothing in the first
-file.
-.Pp
-.It -
-A \(lqdeleted\(rq line in the first file that corresponds to nothing in the second
-file.
-.El
-.Pp
-If all of the changes in a hunk are insertions, the lines of
-.Va from-file
-are omitted. If all of the changes are deletions, the lines of
-.Va to-file
-are omitted.
-.Pp
-.Em Unified Format
-.Pp
-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
-.Op -U Va lines ,
-.Op --unified[= Va lines] ,
-or
-.Op -u
-option. The argument
-.Va lines
-is the number of lines of context to show. When it is not given, it defaults
-to three.
-.Pp
-At present, only GNU
-.Xr diff
-can produce this format and only GNU
-.Xr patch
-can automatically apply diffs in this format. For proper operation,
-.Xr patch
-typically needs at least three lines of context.
-.Pp
-.No An Example of Unified Format
-.Pp
-Here is the output of the command
-.Li diff -u lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files):
-.Pp
-.Bd -literal -offset indent
---- 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!
-.Ed
-.Pp
-.No Detailed Description of Unified Format
-.Pp
-The unified output format starts with a two-line header, which looks like
-this:
-.Pp
-.Bd -literal -offset indent
---- from-file from-file-modification-time
-+++ to-file to-file-modification-time
-.Ed
-.Pp
-The time stamp looks like
-.Li 2002-02-21 23:30:39.942229878 -0800
-to indicate the date, time with fractional seconds, and time zone. The fractional
-seconds are omitted on hosts that do not support fractional time stamps.
-.Pp
-You can change the header's content with the
-.Op --label= Va label
-option; seeSee Section
-.Dq Alternate Names .
-.Pp
-Next come one or more hunks of differences; each hunk shows one area where
-the files differ. Unified format hunks look like this:
-.Pp
-.Bd -literal -offset indent
-@@ from-file-line-numbers to-file-line-numbers @@
- line-from-either-file
- line-from-either-file...
-.Ed
-.Pp
-If a hunk contains just one line, only its start line number appears. Otherwise
-its line numbers look like
-.Li Va start, Va count .
-An empty hunk is considered to start at the line that follows the hunk.
-.Pp
-If a hunk and its context contain two or more lines, its line numbers look
-like
-.Li Va start, Va count .
-Otherwise only its end line number appears. An empty hunk is considered to
-end at the line that precedes the hunk.
-.Pp
-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:
-.Pp
-.Bl -tag -width Ds
-.It +
-A line was added here to the first file.
-.Pp
-.It -
-A line was removed here from the first file.
-.El
-.Pp
-.Em Showing Which Sections Differences Are in
-.Pp
-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
-.Xr diff
-can show this by displaying the nearest section heading line that precedes
-the differing lines. Which lines are \(lqsection headings\(rq is determined by a regular
-expression.
-.Pp
-.No Showing Lines That Match Regular Expressions
-.Pp
-To show in which sections differences occur for files that are not source
-code for C or similar languages, use the
-.Op -F Va regexp
-or
-.Op --show-function-line= Va regexp
-option.
-.Xr diff
-considers lines that match the
-.Xr grep
--style regular expression
-.Va regexp
-to be the beginning of a section of the file. Here are suggested regular expressions
-for some common languages:
-.Pp
-.Bl -tag -width Ds
-.It ^[[:alpha:]$_]
-C, C++, Prolog
-.It ^(
-Lisp
-.It ^@node
-Texinfo
-.El
-.Pp
-This option does not automatically select an output format; in order to use
-it, you must select the context format (see Section
-.Dq Context Format )
-or unified format (see Section
-.Dq Unified Format ) .
-In other output formats it has no effect.
-.Pp
-The
-.Op -F
-or
-.Op --show-function-line
-option finds the nearest unchanged line that precedes each hunk of differences
-and matches the given regular expression. Then it adds that line to the end
-of the line of asterisks in the context format, or to the
-.Li @@
-line in unified format. If no matching line exists, this option leaves the
-output for that hunk unchanged. If that line is more than 40 characters long,
-it outputs only the first 40 characters. You can specify more than one regular
-expression for such lines;
-.Xr diff
-tries to match each line against each regular expression, starting with the
-last one given. This means that you can use
-.Op -p
-and
-.Op -F
-together, if you wish.
-.Pp
-.No Showing C Function Headings
-.Pp
-To show in which functions differences occur for C and similar languages,
-you can use the
-.Op -p
-or
-.Op --show-c-function
-option. This option automatically defaults to the context output format (see Section
-.Dq Context Format ) ,
-with the default number of lines of context. You can override that number
-with
-.Op -C Va lines
-elsewhere in the command line. You can override both the format and the number
-with
-.Op -U Va lines
-elsewhere in the command line.
-.Pp
-The
-.Op -p
-or
-.Op --show-c-function
-option is equivalent to
-.Op -F '^[[:alpha:]$_]'
-if the unified format is specified, otherwise
-.Op -c -F '^[[:alpha:]$_]'
-(see Section
-.Dq Specified Headings ) .
-GNU
-.Xr diff
-provides this option for the sake of convenience.
-.Pp
-.Em Showing Alternate File Names
-.Pp
-If you are comparing two files that have meaningless or uninformative names,
-you might want
-.Xr diff
-to show alternate names in the header of the context and unified output formats.
-To do this, use the
-.Op --label= Va 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,
-.Xr diff
-reports an error. The
-.Op --label
-option does not affect the file names in the
-.Xr pr
-header when the
-.Op -l
-or
-.Op --paginate
-option is used (see Section
-.Dq Pagination ) .
-.Pp
-Here are the first two lines of the output from
-.Li diff -C 2 --label=original --label=modified lao tzu :
-.Pp
-.Bd -literal -offset indent
-*** original
---- modified
-.Ed
-.Pp
-.Ss Showing Differences Side by Side
-.Xr 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:
-.Pp
-.Bl -tag -width Ds
-.It 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
-.Op --ignore
-options (see Section
-.Dq White Space ) .
-.Pp
-.It Li |
-The corresponding lines differ, and they are either both complete or both
-incomplete.
-.Pp
-.It Li <
-The files differ and only the first file contains the line.
-.Pp
-.It Li >
-The files differ and only the second file contains the line.
-.Pp
-.It Li (
-Only the first file contains the line, but the difference is ignored.
-.Pp
-.It Li )
-Only the second file contains the line, but the difference is ignored.
-.Pp
-.It Li \e
-The corresponding lines differ, and only the first line is incomplete.
-.Pp
-.It Li /
-The corresponding lines differ, and only the second line is incomplete.
-.El
-.Pp
-Normally, an output line is incomplete if and only if the lines that it contains
-are incomplete;See Section
-.Dq 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
-.Li \e
-if the first line is incomplete,
-.Li /
-if the second line is.
-.Pp
-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.
-.Pp
-You can use the
-.Xr sdiff
-command to interactively merge side by side differences.See Section
-.Dq Interactive Merging ,
-for more information on merging files.
-.Pp
-.Em Controlling Side by Side Format
-.Pp
-The
-.Op -y
-or
-.Op --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
-.Op -W Va columns
-or
-.Op --width= Va 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.
-.Pp
-The
-.Op --left-column
-option prints only the left column of two common lines. The
-.Op --suppress-common-lines
-option suppresses common lines entirely.
-.Pp
-.Em An Example of Side by Side Format
-.Pp
-Here is the output of the command
-.Li diff -y -W 72 lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files).
-.Pp
-.Bd -literal -offset indent
-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!
-.Ed
-.Pp
-.Ss Showing Differences Without Context
-The \(lqnormal\(rq
-.Xr 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 (see Section
-.Dq Context Format )
-and the unified format (see Section
-.Dq Unified Format )
-are superior. Normal format is the default for compatibility with older versions
-of
-.Xr diff
-and the POSIX standard. Use the
-.Op --normal
-option to select this output format explicitly.
-.Pp
-.Em An Example of Normal Format
-.Pp
-Here is the output of the command
-.Li diff lao tzu
-(see Section
-.Dq 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.
-.Pp
-.Bd -literal -offset indent
-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!
-.Ed
-.Pp
-.Em Detailed Description of Normal Format
-.Pp
-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:
-.Pp
-.Bd -literal -offset indent
-change-command
-< from-file-line
-< from-file-line...
----
-> to-file-line
-> to-file-line...
-.Ed
-.Pp
-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:
-.Pp
-.Bl -tag -width Ds
-.It Va la Va r
-Add the lines in range
-.Va r
-of the second file after line
-.Va l
-of the first file. For example,
-.Li 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.
-.Pp
-.It Va fc Va t
-Replace the lines in range
-.Va f
-of the first file with lines in range
-.Va t
-of the second file. This is like a combined add and delete, but more compact.
-For example,
-.Li 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.
-.Pp
-.It Va rd Va l
-Delete the lines in range
-.Va r
-from the first file; line
-.Va l
-is where they would have appeared in the second file had they not been deleted.
-For example,
-.Li 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.
-.El
-.Pp
-.Ss Making Edit Scripts
-Several output modes produce command scripts for editing
-.Va from-file
-to produce
-.Va to-file .
-.Pp
-.Em Xr ed Scripts
-.Pp
-.Xr diff
-can produce commands that direct the
-.Xr 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
-.Xr patch ,
-it is almost obsolete. Use the
-.Op -e
-or
-.Op --ed
-option to select this output format.
-.Pp
-Like the normal format (see Section
-.Dq 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).
-.Pp
-If the file
-.Pa d
-contains the output of
-.Li diff -e old new ,
-then the command
-.Li (cat d && echo w) | ed - old
-edits
-.Pa old
-to make it a copy of
-.Pa new .
-More generally, if
-.Pa d1 ,
-.Pa d2 ,
-\&...,
-.Pa dN
-contain the outputs of
-.Li diff -e old new1 ,
-.Li diff -e new1 new2 ,
-\&...,
-.Li diff -e newN-1 newN ,
-respectively, then the command
-.Li (cat d1 d2 ... dN && echo w) | ed - old
-edits
-.Pa old
-to make it a copy of
-.Pa newN .
-.Pp
-.No Example Xr ed Script
-.Pp
-Here is the output of
-.Li diff -e lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files):
-.Pp
-.Bd -literal -offset indent
-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
-.Ed
-.Pp
-.No Detailed Description of Xr ed Format
-.Pp
-The
-.Xr 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
-.Xr ed
-interprets line numbers in succeeding commands.
-.Xr ed
-format hunks look like this:
-.Pp
-.Bd -literal -offset indent
-change-command
-to-file-line
-to-file-line...
-\&.
-.Ed
-.Pp
-Because
-.Xr ed
-uses a single period on a line to indicate the end of input, GNU
-.Xr diff
-protects lines of changes that contain a single period on a line by writing
-two periods instead, then writing a subsequent
-.Xr ed
-command to change the two periods into one. The
-.Xr ed
-format cannot represent an incomplete line, so if the second file ends in
-a changed incomplete line,
-.Xr diff
-reports an error and then pretends that a newline was appended.
-.Pp
-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:
-.Pp
-.Bl -tag -width Ds
-.It Va la
-Add text from the second file after line
-.Va l
-in the first file. For example,
-.Li 8a
-means to add the following lines after line 8 of file 1.
-.Pp
-.It Va rc
-Replace the lines in range
-.Va r
-in the first file with the following lines. Like a combined add and delete,
-but more compact. For example,
-.Li 5,7c
-means change lines 5--7 of file 1 to read as the text file 2.
-.Pp
-.It Va rd
-Delete the lines in range
-.Va r
-from the first file. For example,
-.Li 5,7d
-means delete lines 5--7 of file 1.
-.El
-.Pp
-.Em Forward Xr ed Scripts
-.Pp
-.Xr diff
-can produce output that is like an
-.Xr 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
-.Xr ed
-format, forward
-.Xr ed
-format cannot represent incomplete lines.
-.Pp
-Forward
-.Xr ed
-format is not very useful, because neither
-.Xr ed
-nor
-.Xr patch
-can apply diffs in this format. It exists mainly for compatibility with older
-versions of
-.Xr diff .
-Use the
-.Op -f
-or
-.Op --forward-ed
-option to select it.
-.Pp
-.Em RCS Scripts
-.Pp
-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
-.Op -n
-or
-.Op --rcs
-option to select this output format. It is like the forward
-.Xr ed
-format (see Section
-.Dq Forward ed ) ,
-but it can represent arbitrary changes to the contents of a file because it
-avoids the forward
-.Xr 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
-.Li a
-and
-.Li d
-commands are used instead of
-.Li c .
-Also, if the second file ends in a changed incomplete line, then the output
-also ends in an incomplete line.
-.Pp
-Here is the output of
-.Li diff -n lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files):
-.Pp
-.Bd -literal -offset indent
-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!
-.Ed
-.Pp
-.Ss Merging Files with If-then-else
-You can use
-.Xr diff
-to merge two files of C source code. The output of
-.Xr 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
-.Li #ifdef Va name
-or
-.Li #ifndef Va name ,
-.Li #else ,
-and
-.Li #endif .
-When compiling the output, you select which version to use by either defining
-or leaving undefined the macro
-.Va name .
-.Pp
-To merge two files, use
-.Xr diff
-with the
-.Op -D Va name
-or
-.Op --ifdef= Va name
-option. The argument
-.Va name
-is the C preprocessor identifier to use in the
-.Li #ifdef
-and
-.Li #ifndef
-directives.
-.Pp
-For example, if you change an instance of
-.Li wait (&s)
-to
-.Li waitpid (-1, &s, 0)
-and then merge the old and new files with the
-.Op --ifdef=HAVE_WAITPID
-option, then the affected part of your code might look like this:
-.Pp
-.Bd -literal -offset indent
- 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);
-.Ed
-.Pp
-You can specify formats for languages other than C by using line group formats
-and line formats, as described in the next sections.
-.Pp
-.Em Line Group Formats
-.Pp
-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.
-.Pp
-For example, the following command compares the TeX files
-.Pa old
-and
-.Pa new ,
-and outputs a merged file in which old regions are surrounded by
-.Li \ebegin{em}
--
-.Li \eend{em}
-lines, and new regions are surrounded by
-.Li \ebegin{bf}
--
-.Li \eend{bf}
-lines.
-.Pp
-.Bd -literal -offset indent
-diff \e
- --old-group-format='\ebegin{em}
-%<\eend{em}
-\&' \e
- --new-group-format='\ebegin{bf}
-%>\eend{bf}
-\&' \e
- old new
-.Ed
-.Pp
-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.
-.Pp
-.Bd -literal -offset indent
-diff \e
- --old-group-format='\ebegin{em}
-%<\eend{em}
-\&' \e
- --new-group-format='\ebegin{bf}
-%>\eend{bf}
-\&' \e
- --unchanged-group-format='%=' \e
- --changed-group-format='\ebegin{em}
-%<\eend{em}
-\ebegin{bf}
-%>\eend{bf}
-\&' \e
- old new
-.Ed
-.Pp
-Here is a more advanced example, which outputs a diff listing with headers
-containing line numbers in a \(lqplain English\(rq style.
-.Pp
-.Bd -literal -offset indent
-diff \e
- --unchanged-group-format=\(rq \e
- --old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
-%<' \e
- --new-group-format='-------- %dN line%(N=1?:s) added after %de:
-%>' \e
- --changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
-%<-------- to:
-%>' \e
- old new
-.Ed
-.Pp
-To specify a line group format, use
-.Xr 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
-.Va format ,
-because it typically contains shell metacharacters.
-.Pp
-.Bl -tag -width Ds
-.It --old-group-format= Va 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.
-.Pp
-.It --new-group-format= Va 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.
-.Pp
-.It --changed-group-format= Va 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.
-.Pp
-.It --unchanged-group-format= Va 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.
-.El
-.Pp
-In a line group format, ordinary characters represent themselves; conversion
-specifications start with
-.Li %
-and have one of the following forms.
-.Pp
-.Bl -tag -width Ds
-.It %<
-stands for the lines from the first file, including the trailing newline.
-Each line is formatted according to the old line format (see Section
-.Dq Line Formats ) .
-.Pp
-.It %>
-stands for the lines from the second file, including the trailing newline.
-Each line is formatted according to the new line format.
-.Pp
-.It %=
-stands for the lines common to both files, including the trailing newline.
-Each line is formatted according to the unchanged line format.
-.Pp
-.It %%
-stands for
-.Li % .
-.Pp
-.It %c' Va C'
-where
-.Va C
-is a single character, stands for
-.Va C .
-.Va C
-may not be a backslash or an apostrophe. For example,
-.Li %c':'
-stands for a colon, even inside the then-part of an if-then-else format, which
-a colon would normally terminate.
-.Pp
-.It %c'\e Va O'
-where
-.Va O
-is a string of 1, 2, or 3 octal digits, stands for the character with octal
-code
-.Va O .
-For example,
-.Li %c'\e0'
-stands for a null character.
-.Pp
-.It Va F Va n
-where
-.Va F
-is a
-.Li printf
-conversion specification and
-.Va n
-is one of the following letters, stands for
-.Va n
-\&'s value formatted with
-.Va F .
-.Pp
-.Bl -tag -width Ds
-.It e
-The line number of the line just before the group in the old file.
-.Pp
-.It f
-The line number of the first line in the group in the old file; equals
-.Va e
-+ 1.
-.Pp
-.It l
-The line number of the last line in the group in the old file.
-.Pp
-.It m
-The line number of the line just after the group in the old file; equals
-.Va l
-+ 1.
-.Pp
-.It n
-The number of lines in the group in the old file; equals
-.Va l
--
-.Va f
-+ 1.
-.Pp
-.It E, F, L, M, N
-Likewise, for lines in the new file.
-.Pp
-.El
-The
-.Li printf
-conversion specification can be
-.Li %d ,
-.Li %o ,
-.Li %x ,
-or
-.Li %X ,
-specifying decimal, octal, lower case hexadecimal, or upper case hexadecimal
-output respectively. After the
-.Li %
-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
-.Li -
-for left-justification,
-.Li '
-for separating the digit into groups as specified by the
-.Ev LC_NUMERIC
-locale category, and
-.Li 0
-for padding with zeros instead of spaces. For example,
-.Li %5dN
-prints the number of new lines in the group in a field of width 5 characters,
-using the
-.Li printf
-format
-.Li "%5d" .
-.Pp
-.It ( Va A= Va B? Va T: Va E)
-If
-.Va A
-equals
-.Va B
-then
-.Va T
-else
-.Va E .
-.Va A
-and
-.Va B
-are each either a decimal constant or a single letter interpreted as above.
-This format spec is equivalent to
-.Va T
-if
-.Va A
-\&'s value equals
-.Va B
-\&'s; otherwise it is equivalent to
-.Va E .
-.Pp
-For example,
-.Li %(N=0?no:%dN) line%(N=1?:s)
-is equivalent to
-.Li no lines
-if
-.Va N
-(the number of lines in the group in the new file) is 0, to
-.Li 1 line
-if
-.Va N
-is 1, and to
-.Li %dN lines
-otherwise.
-.El
-.Pp
-.Em Line Formats
-.Pp
-Line formats control how each line taken from an input file is output as part
-of a line group in if-then-else format.
-.Pp
-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
-.Li -
-for deleted lines,
-.Li |
-for added lines, and a space for unchanged lines. The formats contain newline
-characters where newlines are desired on output.
-.Pp
-.Bd -literal -offset indent
-diff \e
- --old-line-format='-%l
-\&' \e
- --new-line-format='|%l
-\&' \e
- --unchanged-line-format=' %l
-\&' \e
- old new
-.Ed
-.Pp
-To specify a line format, use one of the following options. You should quote
-.Va format ,
-since it often contains shell metacharacters.
-.Pp
-.Bl -tag -width Ds
-.It --old-line-format= Va format
-formats lines just from the first file.
-.Pp
-.It --new-line-format= Va format
-formats lines just from the second file.
-.Pp
-.It --unchanged-line-format= Va format
-formats lines common to both files.
-.Pp
-.It --line-format= Va format
-formats all lines; in effect, it sets all three above options simultaneously.
-.El
-.Pp
-In a line format, ordinary characters represent themselves; conversion specifications
-start with
-.Li %
-and have one of the following forms.
-.Pp
-.Bl -tag -width Ds
-.It %l
-stands for the contents of the line, not counting its trailing newline (if
-any). This format ignores whether the line is incomplete;See Section
-.Dq Incomplete Lines .
-.Pp
-.It %L
-stands for the contents of the line, including its trailing newline (if any).
-If a line is incomplete, this format preserves its incompleteness.
-.Pp
-.It %%
-stands for
-.Li % .
-.Pp
-.It %c' Va C'
-where
-.Va C
-is a single character, stands for
-.Va C .
-.Va C
-may not be a backslash or an apostrophe. For example,
-.Li %c':'
-stands for a colon.
-.Pp
-.It %c'\e Va O'
-where
-.Va O
-is a string of 1, 2, or 3 octal digits, stands for the character with octal
-code
-.Va O .
-For example,
-.Li %c'\e0'
-stands for a null character.
-.Pp
-.It Va Fn
-where
-.Va F
-is a
-.Li printf
-conversion specification, stands for the line number formatted with
-.Va F .
-For example,
-.Li %.5dn
-prints the line number using the
-.Li printf
-format
-.Li "%.5d" .
-See Section.Dq Line Group Formats ,
-for more about printf conversion specifications.
-.Pp
-.El
-The default line format is
-.Li %l
-followed by a newline character.
-.Pp
-If the input contains tab characters and it is important that they line up
-on output, you should ensure that
-.Li %l
-or
-.Li %L
-in a line format is just after a tab stop (e.g. by preceding
-.Li %l
-or
-.Li %L
-with a tab character), or you should use the
-.Op -t
-or
-.Op --expand-tabs
-option.
-.Pp
-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
-.Xr diff
-format. You can tailor this command to get fine control over
-.Xr diff
-output.
-.Pp
-.Bd -literal -offset indent
-diff \e
- --old-line-format='< %l
-\&' \e
- --new-line-format='> %l
-\&' \e
- --old-group-format='%df%(f=l?:,%dl)d%dE
-%<' \e
- --new-group-format='%dea%dF%(F=L?:,%dL)
-%>' \e
- --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
-%<---
-%>' \e
- --unchanged-group-format=\(rq \e
- old new
-.Ed
-.Pp
-.Em An Example of If-then-else Format
-.Pp
-Here is the output of
-.Li diff -DTWO lao tzu
-(see Section
-.Dq Sample diff Input ,
-for the complete contents of the two files):
-.Pp
-.Bd -literal -offset indent
-#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 */
-.Ed
-.Pp
-.Em Detailed Description of If-then-else Format
-.Pp
-For lines common to both files,
-.Xr 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,
-.Xr diff
-uses the old line group format; if the hunk contains only lines from the second
-file,
-.Xr diff
-uses the new group format; otherwise,
-.Xr diff
-uses the changed group format.
-.Pp
-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.
-.Pp
-The option
-.Op --ifdef= Va name
-is equivalent to the following sequence of options using shell syntax:
-.Pp
-.Bd -literal -offset indent
---old-group-format='#ifndef name
-%<#endif /* ! name */
-\&' \e
---new-group-format='#ifdef name
-%>#endif /* name */
-\&' \e
---unchanged-group-format='%=' \e
---changed-group-format='#ifndef name
-%<#else /* name */
-%>#endif /* name */
-\&'
-.Ed
-.Pp
-You should carefully check the
-.Xr diff
-output for proper nesting. For example, when using the
-.Op -D Va name
-or
-.Op --ifdef= Va name
-option, you should check that if the differing lines contain any of the C
-preprocessor directives
-.Li #ifdef ,
-.Li #ifndef ,
-.Li #else ,
-.Li #elif ,
-or
-.Li #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.
-.Pp
-The
-.Xr patch
-.Op -D Va name
-option behaves like the
-.Xr diff
-.Op -D Va name
-option, except it operates on a file and a diff to produce a merged file;See Section
-.Dq patch Options .
-.Pp
-.Sh Incomplete Lines
-When an input file ends in a non-newline character, its last line is called
-an
-.Em incomplete line
-because its last character is not a newline. All other lines are called
-.Em full lines
-and end in a newline character. Incomplete lines do not match full lines unless
-differences in white space are ignored (see Section
-.Dq White Space ) .
-.Pp
-An incomplete line is normally distinguished on output from a full line by
-a following line that starts with
-.Li \e .
-However, the RCS format (see Section
-.Dq 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
-.Li \e
-or
-.Li /
-gutter marker;See Section
-.Dq Side by Side .
-The if-then-else line format preserves a line's incompleteness with
-.Li %L ,
-and discards the newline with
-.Li %l
-;See Section
-.Dq Line Formats .
-Finally, with the
-.Xr ed
-and forward
-.Xr ed
-output formats (see Section
-.Dq Output Formats )
-.Xr diff
-cannot represent an incomplete line, so it pretends there was a newline and
-reports an error.
-.Pp
-For example, suppose
-.Pa F
-and
-.Pa G
-are one-byte files that contain just
-.Li f
-and
-.Li g ,
-respectively. Then
-.Li diff F G
-outputs
-.Pp
-.Bd -literal -offset indent
-1c1
-< f
-\e No newline at end of file
----
-> g
-\e No newline at end of file
-.Ed
-.Pp
-(The exact message may differ in non-English locales.)
-.Li diff -n F G
-outputs the following without a trailing newline:
-.Pp
-.Bd -literal -offset indent
-d1 1
-a1 1
-g
-.Ed
-.Pp
-.Li diff -e F G
-reports two errors and outputs the following:
-.Pp
-.Bd -literal -offset indent
-1c
-g
-\&.
-.Ed
-.Pp
-.Sh Comparing Directories
-You can use
-.Xr diff
-to compare some or all of the files in two directory trees. When both file
-name arguments to
-.Xr diff
-are directories, it compares each file that is contained in both directories,
-examining file names in alphabetical order as specified by the
-.Ev LC_COLLATE
-locale category. Normally
-.Xr diff
-is silent about pairs of files that contain no differences, but if you use
-the
-.Op -s
-or
-.Op --report-identical-files
-option, it reports pairs of identical files. Normally
-.Xr diff
-reports subdirectories common to both directories without comparing subdirectories'
-files, but if you use the
-.Op -r
-or
-.Op --recursive
-option, it compares every corresponding pair of files in the directory trees,
-as many levels deep as they go.
-.Pp
-For file names that are in only one of the directories,
-.Xr 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
-.Xr 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
-.Op -N
-or
-.Op --new-file
-option.
-.Pp
-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
-.Op --unidirectional-new-file
-option instead of
-.Op -N .
-This option is like
-.Op -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.See Section
-.Dq Making Patches ,
-for more discussion of making patches for distribution.
-.Pp
-To ignore some files while comparing directories, use the
-.Op -x Va pattern
-or
-.Op --exclude= Va pattern
-option. This option ignores any files or subdirectories whose base names match
-the shell pattern
-.Va 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
-.Va pattern
-in quotes so that the shell does not expand it. For example, the option
-.Op -x '*.[ao]'
-ignores any file whose name ends with
-.Li .a
-or
-.Li .o .
-.Pp
-This option accumulates if you specify it more than once. For example, using
-the options
-.Op -x 'RCS' -x '*,v'
-ignores any file or subdirectory whose base name is
-.Li RCS
-or ends with
-.Li ,v .
-.Pp
-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
-.Op -X Va file
-or
-.Op --exclude-from= Va file
-option. Trailing white space and empty lines are ignored in the pattern file.
-.Pp
-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
-.Op -S Va file
-or
-.Op --starting-file= Va file
-option. This compares only the file
-.Va file
-and all alphabetically later files in the topmost directory level.
-.Pp
-If two directories differ only in that file names are lower case in one directory
-and upper case in the upper,
-.Xr diff
-normally reports many differences because it compares file names in a case
-sensitive way. With the
-.Op --ignore-file-name-case
-option,
-.Xr diff
-ignores case differences in file names, so that for example the contents of
-the file
-.Pa Tao
-in one directory are compared to the contents of the file
-.Pa TAO
-in the other. The
-.Op --no-ignore-file-name-case
-option cancels the effect of the
-.Op --ignore-file-name-case
-option, reverting to the default behavior.
-.Pp
-If an
-.Op -x Va pattern
-or
-.Op --exclude= Va pattern
-option, or an
-.Op -X Va file
-or
-.Op --exclude-from= Va file
-option, is specified while the
-.Op --ignore-file-name-case
-option is in effect, case is ignored when excluding file names matching the
-specified patterns.
-.Pp
-.Sh Making Xr diff Output Prettier
-.Xr diff
-provides several ways to adjust the appearance of its output. These adjustments
-can be applied to any output format.
-.Pp
-.Ss Preserving Tab Stop Alignment
-The lines of text in some of the
-.Xr 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
-.Xr diff
-provides two ways to make tab-aligned columns line up correctly.
-.Pp
-The first way is to have
-.Xr diff
-convert all tabs into the correct number of spaces before outputting them;
-select this method with the
-.Op -t
-or
-.Op --expand-tabs
-option. To use this form of output with
-.Xr patch ,
-you must give
-.Xr patch
-the
-.Op -l
-or
-.Op --ignore-white-space
-option (see Section
-.Dq Changed White Space ,
-for more information).
-.Xr diff
-normally assumes that tab stops are set every 8 print columns, but this can
-be altered by the
-.Op --tabsize= Va columns
-option.
-.Pp
-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
-.Op -T
-or
-.Op --initial-tab
-option.
-.Pp
-.Ss Paginating Xr diff Output
-It can be convenient to have long output page-numbered and time-stamped. The
-.Op -l
-or
-.Op --paginate
-option does this by sending the
-.Xr diff
-output through the
-.Xr pr
-program. Here is what the page header might look like for
-.Li diff -lc lao tzu :
-.Pp
-.Bd -literal -offset indent
-2002-02-22 14:20 diff -lc lao tzu Page 1
-.Ed
-.Pp
-.Sh Xr diff Performance Tradeoffs
-GNU
-.Xr diff
-runs quite efficiently; however, in some circumstances you can cause it to
-run faster or produce a more compact set of changes.
-.Pp
-One way to improve
-.Xr diff
-performance is to use hard or symbolic links to files instead of copies. This
-improves performance because
-.Xr 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
-.Li 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
-.Li cp -lR
-or
-.Li 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.
-.Pp
-You can also affect the performance of GNU
-.Xr 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.
-.Pp
-The way that GNU
-.Xr 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
-.Xr diff
-output is large, you might want
-.Xr diff
-to use a modified algorithm that sometimes produces a smaller set of differences.
-The
-.Op -d
-or
-.Op --minimal
-option does this; however, it can also cause
-.Xr diff
-to run more slowly than usual, so it is not the default behavior.
-.Pp
-When the files you are comparing are large and have small groups of changes
-scattered throughout them, you can use the
-.Op --speed-large-files
-option to make a different modification to the algorithm that
-.Xr 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,
-.Xr diff
-might produce a larger set of differences; however, the output will still
-be correct.
-.Pp
-Normally
-.Xr diff
-discards the prefix and suffix that is common to both files before it attempts
-to find a minimal set of differences. This makes
-.Xr diff
-run faster, but occasionally it may produce non-minimal output. The
-.Op --horizon-lines= Va lines
-option prevents
-.Xr diff
-from discarding the last
-.Va lines
-lines of the prefix and the first
-.Va lines
-lines of the suffix. This gives
-.Xr diff
-further opportunities to find a minimal output.
-.Pp
-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
-.Xr diff
-command is free to choose which identical sequence is included in the hunk.
-In this case,
-.Xr 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.
-.Pp
-.Sh Comparing Three Files
-Use the program
-.Xr diff3
-to compare three files and show any differences among them. (
-.Xr diff3
-can also merge files; see diff3 Merging).
-.Pp
-The \(lqnormal\(rq
-.Xr 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.
-.Pp
-See Section.Dq Invoking diff3 ,
-for more information on how to run
-.Xr diff3 .
-.Pp
-.Ss A Third Sample Input File
-Here is a third sample file that will be used in examples to illustrate the
-output of
-.Xr diff3
-and how various options can change it. The first two files are the same that
-we used for
-.Xr diff
-(see Section
-.Dq Sample diff Input ) .
-This is the third sample file, called
-.Pa tao :
-.Pp
-.Bd -literal -offset indent
-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
-.Ed
-.Pp
-.Ss An Example of Xr diff3 Normal Format
-Here is the output of the command
-.Li diff3 lao tzu tao
-(see Section
-.Dq Sample diff3 Input ,
-for the complete contents of the files). Notice that it shows only the lines
-that are different among the three files.
-.Pp
-.Bd -literal -offset indent
-====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
-.Ed
-.Pp
-.Ss Detailed Description of Xr diff3 Normal Format
-Each hunk begins with a line marked
-.Li ==== .
-Three-way hunks have plain
-.Li ====
-lines, and two-way hunks have
-.Li 1 ,
-.Li 2 ,
-or
-.Li 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.
-.Pp
-Normally, two spaces precede each copy of an input line to distinguish it
-from the commands. But with the
-.Op -T
-or
-.Op --initial-tab
-option,
-.Xr diff3
-uses a tab instead of two spaces; this lines up tabs correctly.See Section
-.Dq Tabs ,
-for more information.
-.Pp
-Commands take the following forms:
-.Pp
-.Bl -tag -width Ds
-.It Va file: Va la
-This hunk appears after line
-.Va l
-of file
-.Va 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,
-.Li 1:11a
-means that the hunk follows line 11 in the first file and contains no lines
-from that file.
-.Pp
-.It Va file: Va rc
-This hunk contains the lines in the range
-.Va r
-of file
-.Va file .
-The range
-.Va 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,
-.Li 2:11,13c
-means that the hunk contains lines 11 through 13 from the second file.
-.El
-.Pp
-If the last line in a set of input lines is incomplete (see Section
-.Dq Incomplete Lines ) ,
-it is distinguished on output from a full line by a following line that starts
-with
-.Li \e .
-.Pp
-.Ss Xr diff3 Hunks
-Groups of lines that differ in two or three of the input files are called
-.Em diff3 hunks ,
-by analogy with
-.Xr diff
-hunks (see Section
-.Dq Hunks ) .
-If all three input files differ in a
-.Xr diff3
-hunk, the hunk is called a
-.Em three-way hunk
-; if just two input files differ, it is a
-.Em two-way hunk .
-.Pp
-As with
-.Xr diff ,
-several solutions are possible. When comparing the files
-.Li A ,
-.Li B ,
-and
-.Li C ,
-.Xr diff3
-normally finds
-.Xr diff3
-hunks by merging the two-way hunks output by the two commands
-.Li diff A B
-and
-.Li diff A C .
-This does not necessarily minimize the size of the output, but exceptions
-should be rare.
-.Pp
-For example, suppose
-.Pa F
-contains the three lines
-.Li a ,
-.Li b ,
-.Li f ,
-.Pa G
-contains the lines
-.Li g ,
-.Li b ,
-.Li g ,
-and
-.Pa H
-contains the lines
-.Li a ,
-.Li b ,
-.Li h .
-.Li diff3 F G H
-might output the following:
-.Pp
-.Bd -literal -offset indent
-====2
-1:1c
-3:1c
- a
-2:1c
- g
-====
-1:3c
- f
-2:3c
- g
-3:3c
- h
-.Ed
-.Pp
-because it found a two-way hunk containing
-.Li a
-in the first and third files and
-.Li g
-in the second file, then the single line
-.Li b
-common to all three files, then a three-way hunk containing the last line
-of each file.
-.Pp
-.Sh Merging From a Common Ancestor
-When two people have made changes to copies of the same file,
-.Xr diff3
-can produce a merged output that contains both sets of changes together with
-warnings about conflicts.
-.Pp
-One might imagine programs with names like
-.Xr diff4
-and
-.Xr diff5
-to compare more than three files simultaneously, but in practice the need
-rarely arises. You can use
-.Xr diff3
-to merge three or more sets of changes to a file by merging two change sets
-at a time.
-.Pp
-.Xr 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:
-.Pp
-.Bd -literal -offset indent
-diff3 mine older yours
-.Ed
-.Pp
-You can remember the order of the arguments by noting that they are in alphabetical
-order.
-.Pp
-You can think of this as subtracting
-.Va older
-from
-.Va yours
-and adding the result to
-.Va mine ,
-or as merging into
-.Va mine
-the changes that would turn
-.Va older
-into
-.Va yours .
-This merging is well-defined as long as
-.Va mine
-and
-.Va older
-match in the neighborhood of each such change. This fails to be true when
-all three input files differ or when only
-.Va older
-differs; we call this a
-.Em conflict .
-When all three input files differ, we call the conflict an
-.Em overlap .
-.Pp
-.Xr 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
-.Li <<<<<<<
-and
-.Li >>>>>>>
-lines.
-.Pp
-.Xr diff3
-can output the merge results as an
-.Xr ed
-script that that can be applied to the first file to yield the merged output.
-However, it is usually better to have
-.Xr diff3
-generate the merged output directly; this bypasses some problems with
-.Xr ed .
-.Pp
-.Ss Selecting Which Changes to Incorporate
-You can select all unmerged changes from
-.Va older
-to
-.Va yours
-for merging into
-.Va mine
-with the
-.Op -e
-or
-.Op --ed
-option. You can select only the nonoverlapping unmerged changes with
-.Op -3
-or
-.Op --easy-only ,
-and you can select only the overlapping changes with
-.Op -x
-or
-.Op --overlap-only .
-.Pp
-The
-.Op -e ,
-.Op -3
-and
-.Op -x
-options select only
-.Em unmerged changes ,
-i.e. changes where
-.Va mine
-and
-.Va yours
-differ; they ignore changes from
-.Va older
-to
-.Va yours
-where
-.Va mine
-and
-.Va 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
-.Op -A
-or
-.Op --show-all
-option (see Section
-.Dq Marking Conflicts ) .
-.Pp
-Here is the output of the command
-.Xr diff3
-with each of these three options (see Section
-.Dq Sample diff3 Input ,
-for the complete contents of the files). Notice that
-.Op -e
-outputs the union of the disjoint sets of changes output by
-.Op -3
-and
-.Op -x .
-.Pp
-Output of
-.Li diff3 -e lao tzu tao :
-.Bd -literal -offset indent
-11a
-
- -- The Way of Lao-Tzu, tr. Wing-tsit Chan
-\&.
-8c
- so we may see their result.
-\&.
-.Ed
-.Pp
-Output of
-.Li diff3 -3 lao tzu tao :
-.Bd -literal -offset indent
-8c
- so we may see their result.
-\&.
-.Ed
-.Pp
-Output of
-.Li diff3 -x lao tzu tao :
-.Bd -literal -offset indent
-11a
-
- -- The Way of Lao-Tzu, tr. Wing-tsit Chan
-\&.
-.Ed
-.Pp
-.Ss Marking Conflicts
-.Xr diff3
-can mark conflicts in the merged output by bracketing them with special marker
-lines. A conflict that comes from two files
-.Va A
-and
-.Va B
-is marked as follows:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< A
-lines from A
-=======
-lines from B
->>>>>>> B
-.Ed
-.Pp
-A conflict that comes from three files
-.Va A ,
-.Va B
-and
-.Va C
-is marked as follows:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< A
-lines from A
-||||||| B
-lines from B
-=======
-lines from C
->>>>>>> C
-.Ed
-.Pp
-The
-.Op -A
-or
-.Op --show-all
-option acts like the
-.Op -e
-option, except that it brackets conflicts, and it outputs all changes from
-.Va older
-to
-.Va yours ,
-not just the unmerged changes. Thus, given the sample input files (see Section
-.Dq Sample diff3 Input ) ,
-.Li diff3 -A lao tzu tao
-puts brackets around the conflict where only
-.Pa tzu
-differs:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< 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
-.Ed
-.Pp
-And it outputs the three-way conflict as follows:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< 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
-.Ed
-.Pp
-The
-.Op -E
-or
-.Op --show-overlap
-option outputs less information than the
-.Op -A
-or
-.Op --show-all
-option, because it outputs only unmerged changes, and it never outputs the
-contents of the second file. Thus the
-.Op -E
-option acts like the
-.Op -e
-option, except that it brackets the first and third files from three-way overlapping
-changes. Similarly,
-.Op -X
-acts like
-.Op -x ,
-except it brackets all its (necessarily overlapping) changes. For example,
-for the three-way overlapping change above, the
-.Op -E
-and
-.Op -X
-options output the following:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< lao
-=======
-
- -- The Way of Lao-Tzu, tr. Wing-tsit Chan
->>>>>>> tao
-.Ed
-.Pp
-If you are comparing files that have meaningless or uninformative names, you
-can use the
-.Op --label= Va label
-option to show alternate names in the
-.Li <<<<<<< ,
-.Li |||||||
-and
-.Li >>>>>>>
-brackets. This option can be given up to three times, once for each input
-file. Thus
-.Li diff3 -A --label X --label Y --label Z A B C
-acts like
-.Li diff3 -A A B C ,
-except that the output looks like it came from files named
-.Li X ,
-.Li Y
-and
-.Li Z
-rather than from files named
-.Li A ,
-.Li B
-and
-.Li C .
-.Pp
-.Ss Generating the Merged Output Directly
-With the
-.Op -m
-or
-.Op --merge
-option,
-.Xr diff3
-outputs the merged file directly. This is more efficient than using
-.Xr ed
-to generate it, and works even with non-text files that
-.Xr ed
-would reject. If you specify
-.Op -m
-without an
-.Xr ed
-script option,
-.Op -A
-is assumed.
-.Pp
-For example, the command
-.Li diff3 -m lao tzu tao
-(see Section
-.Dq Sample diff3 Input
-for a copy of the input files) would output the following:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< 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
-.Ed
-.Pp
-.Ss How Xr diff3 Merges Incomplete Lines
-With
-.Op -m ,
-incomplete lines (see Section
-.Dq 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
-.Li ||||||| ,
-.Li =======
-or
-.Li >>>>>>>
-brackets appear somewhere other than the start of a line because they are
-appended to the incomplete line.
-.Pp
-Without
-.Op -m ,
-if an
-.Xr ed
-script option is specified and an incomplete line is found,
-.Xr diff3
-generates a warning and acts as if a newline had been present.
-.Pp
-.Ss Saving the Changed File
-Traditional Unix
-.Xr diff3
-generates an
-.Xr ed
-script without the trailing
-.Li w
-and
-.Li q
-commands that save the changes. System V
-.Xr diff3
-generates these extra commands. GNU
-.Xr diff3
-normally behaves like traditional Unix
-.Xr diff3 ,
-but with the
-.Op -i
-option it behaves like System V
-.Xr diff3
-and appends the
-.Li w
-and
-.Li q
-commands.
-.Pp
-The
-.Op -i
-option requires one of the
-.Xr ed
-script options
-.Op -AeExX3 ,
-and is incompatible with the merged output option
-.Op -m .
-.Pp
-.Sh Interactive Merging with Xr sdiff
-With
-.Xr sdiff ,
-you can merge two files interactively based on a side-by-side
-.Op -y
-format comparison (see Section
-.Dq Side by Side ) .
-Use
-.Op -o Va file
-or
-.Op --output= Va file
-to specify where to put the merged text.See Section
-.Dq Invoking sdiff ,
-for more details on the options to
-.Xr sdiff .
-.Pp
-Another way to merge files interactively is to use the Emacs Lisp package
-.Xr emerge .
-See Section.Dq emerge ,
-for more information.
-.Pp
-.Ss Specifying Xr diff Options to Xr sdiff
-The following
-.Xr sdiff
-options have the same meaning as for
-.Xr diff .
-See Section.Dq diff Options ,
-for the use of these options.
-.Pp
-.Bd -literal -offset indent
--a -b -d -i -t -v
--B -E -I regexp
-
---expand-tabs
---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
---tabsize=columns --text --version --width=columns
-.Ed
-.Pp
-For historical reasons,
-.Xr sdiff
-has alternate names for some options. The
-.Op -l
-option is equivalent to the
-.Op --left-column
-option, and similarly
-.Op -s
-is equivalent to
-.Op --suppress-common-lines .
-The meaning of the
-.Xr sdiff
-.Op -w
-and
-.Op -W
-options is interchanged from that of
-.Xr diff :
-with
-.Xr sdiff ,
-.Op -w Va columns
-is equivalent to
-.Op --width= Va columns ,
-and
-.Op -W
-is equivalent to
-.Op --ignore-all-space .
-.Xr sdiff
-without the
-.Op -o
-option is equivalent to
-.Xr diff
-with the
-.Op -y
-or
-.Op --side-by-side
-option (see Section
-.Dq Side by Side ) .
-.Pp
-.Ss 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,
-.Xr sdiff
-prompts with
-.Li %
-and pauses, waiting for one of the following commands. Follow each command
-with RET.
-.Pp
-.Bl -tag -width Ds
-.It e
-Discard both versions. Invoke a text editor on an empty temporary file, then
-copy the resulting file to the output.
-.Pp
-.It eb
-Concatenate the two versions, edit the result in a temporary file, then copy
-the edited result to the output.
-.Pp
-.It ed
-Like
-.Li eb ,
-except precede each version with a header that shows what file and lines the
-version came from.
-.Pp
-.It el
-.It e1
-Edit a copy of the left version, then copy the result to the output.
-.Pp
-.It er
-.It e2
-Edit a copy of the right version, then copy the result to the output.
-.Pp
-.It l
-.It 1
-Copy the left version to the output.
-.Pp
-.It q
-Quit.
-.Pp
-.It r
-.It 2
-Copy the right version to the output.
-.Pp
-.It s
-Silently copy common lines.
-.Pp
-.It v
-Verbosely copy common lines. This is the default.
-.El
-.Pp
-The text editor invoked is specified by the
-.Ev EDITOR
-environment variable if it is set. The default is system-dependent.
-.Pp
-.Sh Merging with Xr patch
-.Xr patch
-takes comparison output produced by
-.Xr diff
-and applies the differences to a copy of the original file, producing a patched
-version. With
-.Xr patch ,
-you can distribute just the changes to a set of files instead of distributing
-the entire file set; your correspondents can apply
-.Xr patch
-to update their copy of the files with your changes.
-.Xr 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
-.Xr patch .
-.Pp
-.Xr patch
-detects and warns about common problems like forward patches. It saves any
-patches that it could not apply. It can also maintain a
-.Li patchlevel.h
-file to ensure that your correspondents apply diffs in the proper order.
-.Pp
-.Xr patch
-accepts a series of diffs in its standard input, usually separated by headers
-that specify which file to patch. It applies
-.Xr diff
-hunks (see Section
-.Dq Hunks )
-one by one. If a hunk does not exactly match the original file,
-.Xr patch
-uses heuristics to try to patch the file as well as it can. If no approximate
-match can be found,
-.Xr patch
-rejects the hunk and skips to the next hunk.
-.Xr patch
-normally replaces each file
-.Va f
-with its new version, putting reject hunks (if any) into
-.Li Va f.rej .
-.Pp
-See Section.Dq Invoking patch ,
-for detailed information on the options to
-.Xr patch .
-.Pp
-.Ss Selecting the Xr patch Input Format
-.Xr patch
-normally determines which
-.Xr 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
-.Xr patch
-to interpret the patch file as a certain format of diff. The output formats
-listed here are the only ones that
-.Xr patch
-can understand.
-.Pp
-.Bl -tag -width Ds
-.It -c
-.It --context
-context diff.
-.Pp
-.It -e
-.It --ed
-.Xr ed
-script.
-.Pp
-.It -n
-.It --normal
-normal diff.
-.Pp
-.It -u
-.It --unified
-unified diff.
-.El
-.Pp
-.Ss Revision Control
-If a nonexistent input file is under a revision control system supported by
-.Xr patch ,
-.Xr 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,
-.Xr patch
-also asks when the input file is read-only and matches the default version
-in the revision control system.
-.Pp
-The
-.Op -g Va num
-or
-.Op --get= Va num
-option affects access to files under supported revision control systems. If
-.Va num
-is positive,
-.Xr patch
-gets the file without asking the user; if zero,
-.Xr patch
-neither asks the user nor gets the file; and if negative,
-.Xr patch
-asks the user before getting the file. The default value of
-.Va num
-is given by the value of the
-.Ev PATCH_GET
-environment variable if it is set; if not, the default value is zero if
-.Xr patch
-is conforming to POSIX, negative otherwise.See Section
-.Dq patch and POSIX .
-.Pp
-The choice of revision control system is unaffected by the
-.Ev VERSION_CONTROL
-environment variable (see Section
-.Dq Backup Names ) .
-.Pp
-.Ss Applying Imperfect Patches
-.Xr 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
-.Xr patch ,
-and it should work. If the entire diff is indented by a constant amount of
-white space,
-.Xr patch
-automatically ignores the indentation. If a context diff contains trailing
-carriage return on each line,
-.Xr patch
-automatically ignores the carriage return. If a context diff has been encapsulated
-by prepending
-.Li -
-to lines beginning with
-.Li -
-as per
-.Lk ftp://ftp.isi.edu/in-notes/rfc934.txt ,
-.Xr patch
-automatically unencapsulates the input.
-.Pp
-However, certain other types of imperfect input require user intervention
-or testing.
-.Pp
-.Em Applying Patches with Changed White Space
-.Pp
-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
-.Xr patch
-will not be able to match them properly. If this problem occurs, use the
-.Op -l
-or
-.Op --ignore-white-space
-option, which makes
-.Xr 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.
-.Pp
-.Em Applying Reversed Patches
-.Pp
-Sometimes people run
-.Xr diff
-with the new file first instead of second. This creates a diff that is \(lqreversed\(rq.
-To apply such patches, give
-.Xr patch
-the
-.Op -R
-or
-.Op --reverse
-option.
-.Xr patch
-then attempts to swap each hunk around before applying it. Rejects come out
-in the swapped format.
-.Pp
-Often
-.Xr patch
-can guess that the patch is reversed. If the first hunk of a patch fails,
-.Xr patch
-reverses the hunk to see if it can apply it that way. If it can,
-.Xr patch
-asks you if you want to have the
-.Op -R
-option set; if it can't,
-.Xr 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
-.Xr patch
-notices.
-.Pp
-If you apply a patch that you have already applied,
-.Xr 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
-.Li n
-to this offer and to the subsequent \(lqapply anyway\(rq question---or type
-.Li C-c
-to kill the
-.Xr patch
-process.
-.Pp
-.Em Helping Xr patch Find Inexact Matches
-.Pp
-For context diffs, and to a lesser extent normal diffs,
-.Xr 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,
-.Xr patch
-scans both forward and backward for a set of lines matching the context given
-in the hunk.
-.Pp
-First
-.Xr 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
-.Xr 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.
-.Pp
-The
-.Op -F Va lines
-or
-.Op --fuzz= Va lines
-option sets the maximum fuzz factor to
-.Va lines .
-This option only applies to context and unified diffs; it ignores up to
-.Va 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.
-.Pp
-If
-.Xr patch
-cannot find a place to install a hunk of the patch, it writes the hunk out
-to a reject file (see Section
-.Dq 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
-.Xr 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
-.Xr patch
-thinks the failed hunks belong in the new file rather than in the old one.
-.Pp
-If the
-.Op --verbose
-option is given, then as it completes each hunk
-.Xr patch
-tells you whether the hunk succeeded or failed, and if it failed, on which
-line (in the new file)
-.Xr 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
-.Em may
-indicate that
-.Xr patch
-installed a hunk in the wrong place.
-.Xr patch
-also tells you if it used a fuzz factor to make the match, in which case you
-should also be slightly suspicious.
-.Pp
-.Xr patch
-cannot tell if the line numbers are off in an
-.Xr 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.
-.Pp
-A patch against an empty file applies to a nonexistent file, and vice versa.See Section
-.Dq Creating and Removing .
-.Pp
-.Xr 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.
-.Pp
-.Em Predicting what Xr patch will do
-.Pp
-It may not be obvious in advance what
-.Xr patch
-will do with a complicated or poorly formatted patch. If you are concerned
-that the input might cause
-.Xr patch
-to modify the wrong files, you can use the
-.Op --dry-run
-option, which causes
-.Xr 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
-.Xr 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
-.Xr patch )
-and try another dry run. Once you are satisfied with the proposed patch you
-can apply it by invoking
-.Xr patch
-as before, but this time without the
-.Op --dry-run
-option.
-.Pp
-.Ss Creating and Removing Files
-Sometimes when comparing two directories, a file may exist in one directory
-but not the other. If you give
-.Xr diff
-the
-.Op -N
-or
-.Op --new-file
-option, or if you supply an old or new file that is named
-.Pa /dev/null
-or is empty and is dated the Epoch (1970-01-01 00:00:00 UTC),
-.Xr diff
-outputs a patch that adds or deletes the contents of this file. When given
-such a patch,
-.Xr patch
-normally creates a new file or removes the old file. However, when conforming
-to POSIX (see Section
-.Dq patch and POSIX ) ,
-.Xr patch
-does not remove the old file, but leaves it empty. The
-.Op -E
-or
-.Op --remove-empty-files
-option causes
-.Xr 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.
-.Pp
-If the patch appears to create a file that already exists,
-.Xr patch
-asks for confirmation before applying the patch.
-.Pp
-.Ss Updating Time Stamps on Patched Files
-When
-.Xr patch
-updates a file, it normally sets the file's last-modified time stamp to the
-current time of day. If you are using
-.Xr patch
-to track a software distribution, this can cause
-.Xr make
-to incorrectly conclude that a patched file is out of date. For example, if
-.Pa syntax.c
-depends on
-.Pa syntax.y ,
-and
-.Xr patch
-updates
-.Pa syntax.c
-and then
-.Pa syntax.y ,
-then
-.Pa syntax.c
-will normally appear to be out of date with respect to
-.Pa syntax.y
-even though its contents are actually up to date.
-.Pp
-The
-.Op -Z
-or
-.Op --set-utc
-option causes
-.Xr 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).
-.Pp
-The
-.Op -T
-or
-.Op --set-time
-option acts like
-.Op -Z
-or
-.Op --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
-.Op -Z
-or
-.Op --set-utc .
-.Pp
-.Xr 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
-.Op -f
-or
-.Op --force
-option is given, the file's time stamps are set regardless.
-.Pp
-Due to the limitations of the current
-.Xr diff
-format,
-.Xr 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
-.Li make clean )
-all files that depend on the patched files, so that later invocations of
-.Xr make
-do not get confused by the patched files' times.
-.Pp
-.Ss 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,
-.Xr 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 (see Section
-.Dq Making Patches ,
-for more on that topic).
-.Pp
-.Xr patch
-uses the following rules to intuit a file name from the leading text before
-a patch. First,
-.Xr patch
-takes an ordered list of candidate file names as follows:
-.Pp
-.Bl -bullet
-.It
-If the header is that of a context diff,
-.Xr 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
-.Op -p Va num
-or
-.Op --strip= Va num
-option. The name
-.Pa /dev/null
-is also ignored.
-.Pp
-.It
-If there is an
-.Li Index:
-line in the leading garbage and if either the old and new names are both absent
-or if
-.Xr patch
-is conforming to POSIX,
-.Xr patch
-takes the name in the
-.Li Index:
-line.
-.Pp
-.It
-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.
-.El
-.Pp
-Then
-.Xr patch
-selects a file name from the candidate list as follows:
-.Pp
-.Bl -bullet
-.It
-If some of the named files exist,
-.Xr patch
-selects the first name if conforming to POSIX, and the best name otherwise.
-.Pp
-.It
-If
-.Xr patch
-is not ignoring RCS, ClearCase, and SCCS (see Section
-.Dq Revision Control ) ,
-and no named files exist but an RCS, ClearCase, or SCCS master is found,
-.Xr patch
-selects the first named file with an RCS, ClearCase, or SCCS master.
-.Pp
-.It
-If no named files exist, no RCS, ClearCase, or SCCS master was found, some
-names are given,
-.Xr patch
-is not conforming to POSIX, and the patch appears to create a file,
-.Xr patch
-selects the best name requiring the creation of the fewest directories.
-.Pp
-.It
-If no file name results from the above heuristics, you are asked for the name
-of the file to patch, and
-.Xr patch
-selects that name.
-.El
-.Pp
-To determine the
-.Em best
-of a nonempty list of file names,
-.Xr 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.
-.Pp
-See Section.Dq patch and POSIX ,
-to see whether
-.Xr patch
-is conforming to POSIX.
-.Pp
-.Ss Applying Patches in Other Directories
-The
-.Op -d Va directory
-or
-.Op --directory= Va directory
-option to
-.Xr patch
-makes directory
-.Va directory
-the current directory for interpreting both file names in the patch file,
-and file names given as arguments to other options (such as
-.Op -B
-and
-.Op -o ) .
-For example, while in a mail reading program, you can patch a file in the
-.Pa /usr/src/emacs
-directory directly from a message containing the patch like this:
-.Pp
-.Bd -literal -offset indent
-| patch -d /usr/src/emacs
-.Ed
-.Pp
-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
-.Op -p Va number
-or
-.Op --strip= Va number
-option to set the file name strip count to
-.Va number .
-The strip count tells
-.Xr 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,
-.Xr patch
-strips off all leading directories, leaving just the base file names.
-.Pp
-For example, suppose the file name in the patch file is
-.Pa /gnu/src/emacs/etc/NEWS .
-Using
-.Op -p0
-gives the entire file name unmodified,
-.Op -p1
-gives
-.Pa gnu/src/emacs/etc/NEWS
-(no leading slash),
-.Op -p4
-gives
-.Pa etc/NEWS ,
-and not specifying
-.Op -p
-at all gives
-.Pa NEWS .
-.Pp
-.Xr patch
-looks for each file (after any slashes have been stripped) in the current
-directory, or if you used the
-.Op -d Va directory
-option, in that directory.
-.Pp
-.Ss Backup Files
-Normally,
-.Xr 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
-.Li patch -R
-(see Section
-.Dq Reversed Patches ) .
-However, when conforming to POSIX,
-.Xr patch
-does not create backup files by default.See Section
-.Dq patch and POSIX .
-.Pp
-The
-.Op -b
-or
-.Op --backup
-option causes
-.Xr patch
-to make a backup file regardless of whether the patch matches the original
-input. The
-.Op --backup-if-mismatch
-option causes
-.Xr patch
-to create backup files for mismatches files; this is the default when not
-conforming to POSIX. The
-.Op --no-backup-if-mismatch
-option causes
-.Xr patch
-to not create backup files, even for mismatched patches; this is the default
-when conforming to POSIX.
-.Pp
-When backing up a file that does not exist, an empty, unreadable backup file
-is created as a placeholder to represent the nonexistent file.
-.Pp
-.Ss Backup File Names
-Normally,
-.Xr patch
-renames an original input file into a backup file by appending to its name
-the extension
-.Li .orig ,
-or
-.Li ~
-if using
-.Li .orig
-would make the backup file name too long. The
-.Op -z Va backup-suffix
-or
-.Op --suffix= Va backup-suffix
-option causes
-.Xr patch
-to use
-.Va backup-suffix
-as the backup extension instead.
-.Pp
-Alternately, you can specify the extension for backup files with the
-.Ev SIMPLE_BACKUP_SUFFIX
-environment variable, which the options override.
-.Pp
-.Xr patch
-can also create numbered backup files the way GNU Emacs does. With this method,
-instead of having a single backup of each file,
-.Xr patch
-makes a new backup file name each time it patches a file. For example, the
-backups of a file named
-.Pa sink
-would be called, successively,
-.Pa sink.~1~ ,
-.Pa sink.~2~ ,
-.Pa sink.~3~ ,
-etc.
-.Pp
-The
-.Op -V Va backup-style
-or
-.Op --version-control= Va backup-style
-option takes as an argument a method for creating backup file names. You can
-alternately control the type of backups that
-.Xr patch
-makes with the
-.Ev PATCH_VERSION_CONTROL
-environment variable, which the
-.Op -V
-option overrides. If
-.Ev PATCH_VERSION_CONTROL
-is not set, the
-.Ev 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 (see Section
-.Dq Revision Control ) .
-.Pp
-The values of these environment variables and the argument to the
-.Op -V
-option are like the GNU Emacs
-.Li version-control
-variable (see Section
-.Dq 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.
-.Pp
-.Bl -tag -width Ds
-.It t
-.It numbered
-Always make numbered backups.
-.Pp
-.It nil
-.It existing
-Make numbered backups of files that already have them, simple backups of the
-others. This is the default.
-.Pp
-.It never
-.It simple
-Always make simple backups.
-.El
-.Pp
-You can also tell
-.Xr patch
-to prepend a prefix, such as a directory name, to produce backup file names.
-The
-.Op -B Va prefix
-or
-.Op --prefix= Va prefix
-option makes backup files by prepending
-.Va prefix
-to them. The
-.Op -Y Va prefix
-or
-.Op --basename-prefix= Va prefix
-prepends
-.Va prefix
-to the last file name component of backup file names instead; for example,
-.Op -Y ~
-causes the backup name for
-.Pa dir/file.c
-to be
-.Pa dir/~file.c .
-If you use either of these prefix options, the suffix-based options are ignored.
-.Pp
-If you specify the output file with the
-.Op -o
-option, that file is the one that is backed up, not the input file.
-.Pp
-Options that affect the names of backup files do not affect whether backups
-are made. For example, if you specify the
-.Op --no-backup-if-mismatch
-option, none of the options described in this section have any affect, because
-no backups are made.
-.Pp
-.Ss Reject File Names
-The names for reject files (files containing patches that
-.Xr patch
-could not find a place to apply) are normally the name of the output file
-with
-.Li .rej
-appended (or
-.Li #
-if using
-.Li .rej
-would make the backup file name too long).
-.Pp
-Alternatively, you can tell
-.Xr patch
-to place all of the rejected patches in a single file. The
-.Op -r Va reject-file
-or
-.Op --reject-file= Va reject-file
-option uses
-.Va reject-file
-as the reject file name.
-.Pp
-.Ss Messages and Questions from Xr patch
-.Xr 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,
-.Xr 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.
-.Pp
-.Xr 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.
-.Pp
-.Em Controlling the Verbosity of Xr patch
-.Pp
-You can cause
-.Xr patch
-to produce more messages by using the
-.Op --verbose
-option. For example, when you give this option, the message
-.Li Hmm...
-indicates that
-.Xr 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.
-.Pp
-You can inhibit all terminal output from
-.Xr patch ,
-unless an error occurs, by using the
-.Op -s ,
-.Op --quiet ,
-or
-.Op --silent
-option.
-.Pp
-.Em Inhibiting Keyboard Input
-.Pp
-There are two ways you can prevent
-.Xr patch
-from asking you any questions. The
-.Op -f
-or
-.Op --force
-option assumes that you know what you are doing. It causes
-.Xr patch
-to do the following:
-.Pp
-.Bl -bullet
-.It
-Skip patches that do not contain file names in their headers.
-.Pp
-.It
-Patch files even though they have the wrong version for the
-.Li Prereq:
-line in the patch;
-.Pp
-.It
-Assume that patches are not reversed even if they look like they are.
-.El
-.Pp
-The
-.Op -t
-or
-.Op --batch
-option is similar to
-.Op -f ,
-in that it suppresses questions, but it makes somewhat different assumptions:
-.Pp
-.Bl -bullet
-.It
-Skip patches that do not contain file names in their headers (the same as
-.Op -f ) .
-.Pp
-.It
-Skip patches for which the file has the wrong version for the
-.Li Prereq:
-line in the patch;
-.Pp
-.It
-Assume that patches are reversed if they look like they are.
-.El
-.Pp
-.Em Xr patch Quoting Style
-.Pp
-When
-.Xr 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
-.Op --quoting-style= Va word
-option controls how names are output. The
-.Va word
-should be one of the following:
-.Pp
-.Bl -tag -width Ds
-.It literal
-Output names as-is.
-.It shell
-Quote names for the shell if they contain shell metacharacters or would cause
-ambiguous output.
-.It shell-always
-Quote names for the shell, even if they would normally not require quoting.
-.It c
-Quote names as for a C language string.
-.It escape
-Quote as with
-.Li c
-except omit the surrounding double-quote characters.
-.El
-.Pp
-You can specify the default value of the
-.Op --quoting-style
-option with the environment variable
-.Ev QUOTING_STYLE .
-If that environment variable is not set, the default value is
-.Li shell ,
-but this default may change in a future version of
-.Xr patch .
-.Pp
-.Ss Xr patch and the POSIX Standard
-If you specify the
-.Op --posix
-option, or set the
-.Ev POSIXLY_CORRECT
-environment variable,
-.Xr patch
-conforms more strictly to the POSIX standard, as follows:
-.Pp
-.Bl -bullet
-.It
-Take the first existing file from the list (old, new, index) when intuiting
-file names from diff headers.See Section
-.Dq Multiple Patches .
-.Pp
-.It
-Do not remove files that are removed by a diff.See Section
-.Dq Creating and Removing .
-.Pp
-.It
-Do not ask whether to get files from RCS, ClearCase, or SCCS.See Section
-.Dq Revision Control .
-.Pp
-.It
-Require that all options precede the files in the command line.
-.Pp
-.It
-Do not backup files, even when there is a mismatch.See Section
-.Dq Backups .
-.Pp
-.El
-.Ss GNU Xr patch and Traditional Xr patch
-The current version of GNU
-.Xr patch
-normally follows the POSIX standard.See Section
-.Dq patch and POSIX ,
-for the few exceptions to this general rule.
-.Pp
-Unfortunately, POSIX redefined the behavior of
-.Xr patch
-in several important ways. You should be aware of the following differences
-if you must interoperate with traditional
-.Xr patch ,
-or with GNU
-.Xr patch
-version 2.1 and earlier.
-.Pp
-.Bl -bullet
-.It
-In traditional
-.Xr patch ,
-the
-.Op -p
-option's operand was optional, and a bare
-.Op -p
-was equivalent to
-.Op -p0 .
-The
-.Op -p
-option now requires an operand, and
-.Op -p 0
-is now equivalent to
-.Op -p0 .
-For maximum compatibility, use options like
-.Op -p0
-and
-.Op -p1 .
-.Pp
-Also, traditional
-.Xr patch
-simply counted slashes when stripping path prefixes;
-.Xr 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
-.Pa //
-in file names.
-.Pp
-.It
-In traditional
-.Xr patch ,
-backups were enabled by default. This behavior is now enabled with the
-.Op -b
-or
-.Op --backup
-option.
-.Pp
-Conversely, in POSIX
-.Xr patch ,
-backups are never made, even when there is a mismatch. In GNU
-.Xr patch ,
-this behavior is enabled with the
-.Op --no-backup-if-mismatch
-option, or by conforming to POSIX.
-.Pp
-The
-.Op -b Va suffix
-option of traditional
-.Xr patch
-is equivalent to the
-.Li -b -z Va suffix
-options of GNU
-.Xr patch .
-.Pp
-.It
-Traditional
-.Xr 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
-.Xr 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
-.Li 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.
-.Pp
-.It
-When traditional
-.Xr 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,
-.Pa /dev/tty ,
-and standard input. Now
-.Xr patch
-sends questions to standard output and gets answers from
-.Pa /dev/tty .
-Defaults for some answers have been changed so that
-.Xr patch
-never goes into an infinite loop when using default answers.
-.Pp
-.It
-Traditional
-.Xr patch
-exited with a status value that counted the number of bad hunks, or with status
-1 if there was real trouble. Now
-.Xr patch
-exits with status 1 if some hunks failed, or with 2 if there was real trouble.
-.Pp
-.It
-Limit yourself to the following options when sending instructions meant to
-be executed by anyone running GNU
-.Xr patch ,
-traditional
-.Xr patch ,
-or a
-.Xr patch
-that conforms to POSIX. Spaces are significant in the following list, and
-operands are required.
-.Pp
-.Bd -literal -offset indent
--c
--d dir
--D define
--e
--l
--n
--N
--o outfile
--pnum
--R
--r rejectfile
-.Ed
-.Pp
-.El
-.Sh 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.
-.Pp
-Here are some other things you should keep in mind if you are going to distribute
-patches for updating a software package.
-.Pp
-.Ss 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
-.Xr tar
-archives of the two versions.
-.Pp
-To generate the patch, use the command
-.Li diff -Naur Va old Va new
-where
-.Va old
-and
-.Va new
-identify the old and new directories. The names
-.Va old
-and
-.Va new
-should not contain any slashes. The
-.Op -N
-option lets the patch create and remove files;
-.Op -a
-lets the patch update non-text files;
-.Op -u
-generates useful time stamps and enough context; and
-.Op -r
-lets the patch update subdirectories. Here is an example command, using Bourne
-shell syntax:
-.Pp
-.Bd -literal -offset indent
-diff -Naur gcc-3.0.3 gcc-3.0.4
-.Ed
-.Pp
-Tell your recipients how to apply the patches. This should include which working
-directory to use, and which
-.Xr patch
-options to use; the option
-.Li -p1
-is recommended. Test your procedure by pretending to be a recipient and applying
-your patches to a copy of the original files.
-.Pp
-See Section.Dq Avoiding Common Mistakes ,
-for how to avoid common mistakes when generating a patch.
-.Pp
-.Ss 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.
-.Pp
-GNU
-.Xr diff
-can analyze files with arbitrarily long lines and files that end in incomplete
-lines. However, older versions of
-.Xr patch
-cannot patch such files. If you are having trouble applying such patches,
-try upgrading to a recent version of GNU
-.Xr patch .
-.Pp
-.Ss Avoiding Common Mistakes
-When producing a patch for multiple files, apply
-.Xr diff
-to directories whose names do not have slashes. This reduces confusion when
-the patch consumer specifies the
-.Op -p Va 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:
-.Pp
-.Bd -literal -offset indent
-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
-.Ed
-.Pp
-because the two file names have different numbers of slashes, and different
-versions of
-.Xr patch
-interpret the file names differently. To avoid confusion, send output that
-looks like this instead:
-.Pp
-.Bd -literal -offset indent
-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
-.Ed
-.Pp
-Make sure you have specified the file names correctly, either in a context
-diff header or with an
-.Li Index:
-line. Take care to not send out reversed patches, since these make people
-wonder whether they have already applied the patch.
-.Pp
-Avoid sending patches that compare backup file names like
-.Pa README.orig
-or
-.Pa README~ ,
-since this might confuse
-.Xr 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.
-.Pa old/README
-and
-.Pa new/README .
-.Pp
-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
-.Pa patchlevel.h
-or
-.Pa version.c ,
-which contains a patch level or version number. If the input file contains
-the wrong version number,
-.Xr patch
-will complain immediately.
-.Pp
-An even clearer way to prevent this problem is to put a
-.Li Prereq:
-line before the patch. If the leading text in the patch file contains a line
-that starts with
-.Li Prereq: ,
-.Xr 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,
-.Xr patch
-prompts you for confirmation before proceeding. This makes it difficult to
-accidentally apply patches in the wrong order.
-.Pp
-.Ss Generating Smaller Patches
-The simplest way to generate a patch is to use
-.Li diff -Naur
-(see Section
-.Dq 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
-.Xr rm
-and
-.Xr 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.
-.Pp
-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,
-.Pa TAGS
-and output from
-.Xr yacc
-and
-.Xr makeinfo ) ,
-exclude them from the patch by giving
-.Xr diff
-the
-.Op -x Va pattern
-option (see Section
-.Dq 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
-.Xr make .
-.Pp
-Now you can create the patch using
-.Li diff -Naur .
-Make sure to specify the scratch directory first and the newer directory second.
-.Pp
-Add to the top of the patch a note telling the user any
-.Xr rm
-and
-.Xr mv
-commands to run before applying the patch. Then you can remove the scratch
-directory.
-.Pp
-You can also shrink the patch size by using fewer lines of context, but bear
-in mind that
-.Xr patch
-typically needs at least two lines for proper operation when patches do not
-exactly match the input files.
-.Pp
-.Sh Invoking Xr cmp
-The
-.Xr cmp
-command compares two files, and if they differ, tells the first byte and line
-number where they differ or reports that one file is a prefix of the other.
-Bytes and lines are numbered starting with 1. The arguments of
-.Xr cmp
-are as follows:
-.Pp
-.Bd -literal -offset indent
-cmp options... from-file [to-file [from-skip [to-skip]]]
-.Ed
-.Pp
-The file name
-.Pa -
-is always the standard input.
-.Xr cmp
-also uses the standard input if one file name is omitted. The
-.Va from-skip
-and
-.Va to-skip
-operands specify how many bytes to ignore at the start of each file; they
-are equivalent to the
-.Op --ignore-initial= Va from-skip: Va to-skip
-option.
-.Pp
-By default,
-.Xr cmp
-outputs nothing if the two files have the same contents. If one file is a
-prefix of the other,
-.Xr cmp
-prints to standard error a message of the following form:
-.Pp
-.Bd -literal -offset indent
-cmp: EOF on shorter-file
-.Ed
-.Pp
-Otherwise,
-.Xr cmp
-prints to standard output a message of the following form:
-.Pp
-.Bd -literal -offset indent
-from-file to-file differ: char byte-number, line line-number
-.Ed
-.Pp
-The message formats can differ outside the POSIX locale. Also, POSIX allows
-the EOF message to be followed by a blank and some additional information.
-.Pp
-An exit status of 0 means no differences were found, 1 means some differences
-were found, and 2 means trouble.
-.Pp
-.Ss Options to Xr cmp
-Below is a summary of all of the options that GNU
-.Xr cmp
-accepts. Most options have two equivalent names, one of which is a single
-letter preceded by
-.Li - ,
-and the other of which is a long name preceded by
-.Li -- .
-Multiple single letter options (unless they take an argument) can be combined
-into a single command line word:
-.Op -bl
-is equivalent to
-.Op -b -l .
-.Pp
-.Bl -tag -width Ds
-.It -b
-.It --print-bytes
-Print the differing bytes. Display control bytes as a
-.Li ^
-followed by a letter of the alphabet and precede bytes that have the high
-bit set with
-.Li M-
-(which stands for \(lqmeta\(rq).
-.Pp
-.It --help
-Output a summary of usage and then exit.
-.Pp
-.It -i Va skip
-.It --ignore-initial= Va skip
-Ignore any differences in the first
-.Va skip
-bytes of the input files. Treat files with fewer than
-.Va skip
-bytes as if they are empty. If
-.Va skip
-is of the form
-.Op Va from-skip: Va to-skip ,
-skip the first
-.Va from-skip
-bytes of the first input file and the first
-.Va to-skip
-bytes of the second.
-.Pp
-.It -l
-.It --verbose
-Output the (decimal) byte numbers and (octal) values of all differing bytes,
-instead of the default standard output.
-.Pp
-.It -n Va count
-.It --bytes= Va count
-Compare at most
-.Va count
-input bytes.
-.Pp
-.It -s
-.It --quiet
-.It --silent
-Do not print anything; only return an exit status indicating whether the files
-differ.
-.Pp
-.It -v
-.It --version
-Output version information and then exit.
-.El
-.Pp
-In the above table, operands that are byte counts are normally decimal, but
-may be preceded by
-.Li 0
-for octal and
-.Li 0x
-for hexadecimal.
-.Pp
-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
-.Li iB ,
-specifies a multiple using powers of 1024. A size letter followed by
-.Li B
-specifies powers of 1000 instead. For example,
-.Op -n 4M
-and
-.Op -n 4MiB
-are equivalent to
-.Op -n 4194304 ,
-whereas
-.Op -n 4MB
-is equivalent to
-.Op -n 4000000 .
-This notation is upward compatible with the
-.Lk http://www.bipm.fr/enus/3_SI/si-prefixes.html
-for decimal multiples and with the
-.Lk http://physics.nist.gov/cuu/Units/binary.html .
-.Pp
-The following suffixes are defined. Large sizes like
-.Li 1Y
-may be rejected by your computer due to limitations of its arithmetic.
-.Pp
-.Bl -tag -width Ds
-.It kB
-kilobyte: 10^3 = 1000.
-.It k
-.It K
-.It KiB
-kibibyte: 2^10 = 1024.
-.Li K
-is special: the SI prefix is
-.Li k
-and the IEC 60027-2 prefix is
-.Li Ki ,
-but tradition and POSIX use
-.Li k
-to mean
-.Li KiB .
-.It MB
-megabyte: 10^6 = 1,000,000.
-.It M
-.It MiB
-mebibyte: 2^20 = 1,048,576.
-.It GB
-gigabyte: 10^9 = 1,000,000,000.
-.It G
-.It GiB
-gibibyte: 2^30 = 1,073,741,824.
-.It TB
-terabyte: 10^12 = 1,000,000,000,000.
-.It T
-.It TiB
-tebibyte: 2^40 = 1,099,511,627,776.
-.It PB
-petabyte: 10^15 = 1,000,000,000,000,000.
-.It P
-.It PiB
-pebibyte: 2^50 = 1,125,899,906,842,624.
-.It EB
-exabyte: 10^18 = 1,000,000,000,000,000,000.
-.It E
-.It EiB
-exbibyte: 2^60 = 1,152,921,504,606,846,976.
-.It ZB
-zettabyte: 10^21 = 1,000,000,000,000,000,000,000
-.It Z
-.It ZiB
-2^70 = 1,180,591,620,717,411,303,424. (
-.Li Zi
-is a GNU extension to IEC 60027-2.)
-.It YB
-yottabyte: 10^24 = 1,000,000,000,000,000,000,000,000.
-.It Y
-.It YiB
-2^80 = 1,208,925,819,614,629,174,706,176. (
-.Li Yi
-is a GNU extension to IEC 60027-2.)
-.El
-.Pp
-.Sh Invoking Xr diff
-The format for running the
-.Xr diff
-command is:
-.Pp
-.Bd -literal -offset indent
-diff options... files...
-.Ed
-.Pp
-In the simplest case, two file names
-.Va from-file
-and
-.Va to-file
-are given, and
-.Xr diff
-compares the contents of
-.Va from-file
-and
-.Va to-file .
-A file name of
-.Pa -
-stands for text read from the standard input. As a special case,
-.Li diff - -
-compares a copy of standard input to itself.
-.Pp
-If one file is a directory and the other is not,
-.Xr diff
-compares the file in the directory whose name is that of the non-directory.
-The non-directory file must not be
-.Pa - .
-.Pp
-If two file names are given and both are directories,
-.Xr diff
-compares corresponding files in both directories, in alphabetical order; this
-comparison is not recursive unless the
-.Op -r
-or
-.Op --recursive
-option is given.
-.Xr 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 \(lqfile with the same name\(rq does not apply.
-.Pp
-If the
-.Op --from-file= Va file
-option is given, the number of file names is arbitrary, and
-.Va file
-is compared to each named file. Similarly, if the
-.Op --to-file= Va file
-option is given, each named file is compared to
-.Va file .
-.Pp
-.Xr diff
-options begin with
-.Li - ,
-so normally file names may not begin with
-.Li - .
-However,
-.Op --
-as an argument by itself treats the remaining arguments as file names even
-if they begin with
-.Li - .
-.Pp
-An exit status of 0 means no differences were found, 1 means some differences
-were found, and 2 means trouble. Normally, differing binary files count as
-trouble, but this can be altered by using the
-.Op -a
-or
-.Op --text
-option, or the
-.Op -q
-or
-.Op --brief
-option.
-.Pp
-.Ss Options to Xr diff
-Below is a summary of all of the options that GNU
-.Xr diff
-accepts. Most options have two equivalent names, one of which is a single
-letter preceded by
-.Li - ,
-and the other of which is a long name preceded by
-.Li -- .
-Multiple single letter options (unless they take an argument) can be combined
-into a single command line word:
-.Op -ac
-is equivalent to
-.Op -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.
-.Pp
-.Bl -tag -width Ds
-.It -a
-.It --text
-Treat all files as text and compare them line-by-line, even if they do not
-seem to be text.See Section
-.Dq Binary .
-.Pp
-.It -b
-.It --ignore-space-change
-Ignore changes in amount of white space.See Section
-.Dq White Space .
-.Pp
-.It -B
-.It --ignore-blank-lines
-Ignore changes that just insert or delete blank lines.See Section
-.Dq Blank Lines .
-.Pp
-.It --binary
-Read and write data in binary mode.See Section
-.Dq Binary .
-.Pp
-.It -c
-Use the context output format, showing three lines of context.See Section
-.Dq Context Format .
-.Pp
-.It -C Va lines
-.It --context[= Va lines]
-Use the context output format, showing
-.Va lines
-(an integer) lines of context, or three if
-.Va lines
-is not given.See Section
-.Dq Context Format .
-For proper operation,
-.Xr patch
-typically needs at least two lines of context.
-.Pp
-On older systems,
-.Xr diff
-supports an obsolete option
-.Op - Va lines
-that has effect when combined with
-.Op -c
-or
-.Op -p .
-POSIX 1003.1-2001 (see Section
-.Dq Standards conformance )
-does not allow this; use
-.Op -C Va lines
-instead.
-.Pp
-.It --changed-group-format= Va format
-Use
-.Va format
-to output a line group containing differing lines from both files in if-then-else
-format.See Section
-.Dq Line Group Formats .
-.Pp
-.It -d
-.It --minimal
-Change the algorithm perhaps find a smaller set of changes. This makes
-.Xr diff
-slower (sometimes much slower).See Section
-.Dq diff Performance .
-.Pp
-.It -D Va name
-.It --ifdef= Va name
-Make merged
-.Li #ifdef
-format output, conditional on the preprocessor macro
-.Va name .
-See Section.Dq If-then-else .
-.Pp
-.It -e
-.It --ed
-Make output that is a valid
-.Xr ed
-script.See Section
-.Dq ed Scripts .
-.Pp
-.It -E
-.It --ignore-tab-expansion
-Ignore changes due to tab expansion.See Section
-.Dq White Space .
-.Pp
-.It -f
-.It --forward-ed
-Make output that looks vaguely like an
-.Xr ed
-script but has changes in the order they appear in the file.See Section
-.Dq Forward ed .
-.Pp
-.It -F Va regexp
-.It --show-function-line= Va regexp
-In context and unified format, for each hunk of differences, show some of
-the last preceding line that matches
-.Va regexp .
-See Section.Dq Specified Headings .
-.Pp
-.It --from-file= Va file
-Compare
-.Va file
-to each operand;
-.Va file
-may be a directory.
-.Pp
-.It --help
-Output a summary of usage and then exit.
-.Pp
-.It --horizon-lines= Va lines
-Do not discard the last
-.Va lines
-lines of the common prefix and the first
-.Va lines
-lines of the common suffix.See Section
-.Dq diff Performance .
-.Pp
-.It -i
-.It --ignore-case
-Ignore changes in case; consider upper- and lower-case letters equivalent.See Section
-.Dq Case Folding .
-.Pp
-.It -I Va regexp
-.It --ignore-matching-lines= Va regexp
-Ignore changes that just insert or delete lines that match
-.Va regexp .
-See Section.Dq Specified Lines .
-.Pp
-.It --ignore-file-name-case
-Ignore case when comparing file names during recursive comparison.See Section
-.Dq Comparing Directories .
-.Pp
-.It -l
-.It --paginate
-Pass the output through
-.Xr pr
-to paginate it.See Section
-.Dq Pagination .
-.Pp
-.It --label= Va label
-Use
-.Va label
-instead of the file name in the context format (see Section
-.Dq Context Format )
-and unified format (see Section
-.Dq Unified Format )
-headers.See Section
-.Dq RCS .
-.Pp
-.It --left-column
-Print only the left column of two common lines in side by side format.See Section
-.Dq Side by Side Format .
-.Pp
-.It --line-format= Va format
-Use
-.Va format
-to output all input lines in if-then-else format.See Section
-.Dq Line Formats .
-.Pp
-.It -n
-.It --rcs
-Output RCS-format diffs; like
-.Op -f
-except that each command specifies the number of lines affected.See Section
-.Dq RCS .
-.Pp
-.It -N
-.It --new-file
-In directory comparison, if a file is found in only one directory, treat it
-as present but empty in the other directory.See Section
-.Dq Comparing Directories .
-.Pp
-.It --new-group-format= Va format
-Use
-.Va format
-to output a group of lines taken from just the second file in if-then-else
-format.See Section
-.Dq Line Group Formats .
-.Pp
-.It --new-line-format= Va format
-Use
-.Va format
-to output a line taken from just the second file in if-then-else format.See Section
-.Dq Line Formats .
-.Pp
-.It --old-group-format= Va format
-Use
-.Va format
-to output a group of lines taken from just the first file in if-then-else
-format.See Section
-.Dq Line Group Formats .
-.Pp
-.It --old-line-format= Va format
-Use
-.Va format
-to output a line taken from just the first file in if-then-else format.See Section
-.Dq Line Formats .
-.Pp
-.It -p
-.It --show-c-function
-Show which C function each change is in.See Section
-.Dq C Function Headings .
-.Pp
-.It -q
-.It --brief
-Report only whether the files differ, not the details of the differences.See Section
-.Dq Brief .
-.Pp
-.It -r
-.It --recursive
-When comparing directories, recursively compare any subdirectories found.See Section
-.Dq Comparing Directories .
-.Pp
-.It -s
-.It --report-identical-files
-Report when two files are the same.See Section
-.Dq Comparing Directories .
-.Pp
-.It -S Va file
-.It --starting-file= Va file
-When comparing directories, start with the file
-.Va file .
-This is used for resuming an aborted comparison.See Section
-.Dq Comparing Directories .
-.Pp
-.It --speed-large-files
-Use heuristics to speed handling of large files that have numerous scattered
-small changes.See Section
-.Dq diff Performance .
-.Pp
-.It --strip-trailing-cr
-Strip any trailing carriage return at the end of an input line.See Section
-.Dq Binary .
-.Pp
-.It --suppress-common-lines
-Do not print common lines in side by side format.See Section
-.Dq Side by Side Format .
-.Pp
-.It -t
-.It --expand-tabs
-Expand tabs to spaces in the output, to preserve the alignment of tabs in
-the input files.See Section
-.Dq Tabs .
-.Pp
-.It -T
-.It --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.See Section
-.Dq Tabs .
-.Pp
-.It --tabsize= Va columns
-Assume that tab stops are set every
-.Va columns
-(default 8) print columns.See Section
-.Dq Tabs .
-.Pp
-.It --to-file= Va file
-Compare each operand to
-.Va file
-;
-.Va file
-may be a directory.
-.Pp
-.It -u
-Use the unified output format, showing three lines of context.See Section
-.Dq Unified Format .
-.Pp
-.It --unchanged-group-format= Va format
-Use
-.Va format
-to output a group of common lines taken from both files in if-then-else format.See Section
-.Dq Line Group Formats .
-.Pp
-.It --unchanged-line-format= Va format
-Use
-.Va format
-to output a line common to both files in if-then-else format.See Section
-.Dq Line Formats .
-.Pp
-.It --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.See Section
-.Dq Comparing Directories .
-.Pp
-.It -U Va lines
-.It --unified[= Va lines]
-Use the unified output format, showing
-.Va lines
-(an integer) lines of context, or three if
-.Va lines
-is not given.See Section
-.Dq Unified Format .
-For proper operation,
-.Xr patch
-typically needs at least two lines of context.
-.Pp
-On older systems,
-.Xr diff
-supports an obsolete option
-.Op - Va lines
-that has effect when combined with
-.Op -u .
-POSIX 1003.1-2001 (see Section
-.Dq Standards conformance )
-does not allow this; use
-.Op -U Va lines
-instead.
-.Pp
-.It -v
-.It --version
-Output version information and then exit.
-.Pp
-.It -w
-.It --ignore-all-space
-Ignore white space when comparing lines.See Section
-.Dq White Space .
-.Pp
-.It -W Va columns
-.It --width= Va columns
-Output at most
-.Va columns
-(default 130) print columns per line in side by side format.See Section
-.Dq Side by Side Format .
-.Pp
-.It -x Va pattern
-.It --exclude= Va pattern
-When comparing directories, ignore files and subdirectories whose basenames
-match
-.Va pattern .
-See Section.Dq Comparing Directories .
-.Pp
-.It -X Va file
-.It --exclude-from= Va file
-When comparing directories, ignore files and subdirectories whose basenames
-match any pattern contained in
-.Va file .
-See Section.Dq Comparing Directories .
-.Pp
-.It -y
-.It --side-by-side
-Use the side by side output format.See Section
-.Dq Side by Side Format .
-.El
-.Pp
-.Sh Invoking Xr diff3
-The
-.Xr diff3
-command compares three files and outputs descriptions of their differences.
-Its arguments are as follows:
-.Pp
-.Bd -literal -offset indent
-diff3 options... mine older yours
-.Ed
-.Pp
-The files to compare are
-.Va mine ,
-.Va older ,
-and
-.Va yours .
-At most one of these three file names may be
-.Pa - ,
-which tells
-.Xr diff3
-to read the standard input for that file.
-.Pp
-An exit status of 0 means
-.Xr diff3
-was successful, 1 means some conflicts were found, and 2 means trouble.
-.Pp
-.Ss Options to Xr diff3
-Below is a summary of all of the options that GNU
-.Xr diff3
-accepts. Multiple single letter options (unless they take an argument) can
-be combined into a single command line argument.
-.Pp
-.Bl -tag -width Ds
-.It -a
-.It --text
-Treat all files as text and compare them line-by-line, even if they do not
-appear to be text.See Section
-.Dq Binary .
-.Pp
-.It -A
-.It --show-all
-Incorporate all unmerged changes from
-.Va older
-to
-.Va yours
-into
-.Va mine ,
-surrounding conflicts with bracket lines.See Section
-.Dq Marking Conflicts .
-.Pp
-.It --diff-program= Va program
-Use the compatible comparison program
-.Va program
-to compare files instead of
-.Xr diff .
-.Pp
-.It -e
-.It --ed
-Generate an
-.Xr ed
-script that incorporates all the changes from
-.Va older
-to
-.Va yours
-into
-.Va mine .
-See Section.Dq Which Changes .
-.Pp
-.It -E
-.It --show-overlap
-Like
-.Op -e ,
-except bracket lines from overlapping changes' first and third files.See Section
-.Dq Marking Conflicts .
-With
-.Op -E ,
-an overlapping change looks like this:
-.Pp
-.Bd -literal -offset indent
-<<<<<<< mine
-lines from mine
-=======
-lines from yours
->>>>>>> yours
-.Ed
-.Pp
-.It --help
-Output a summary of usage and then exit.
-.Pp
-.It -i
-Generate
-.Li w
-and
-.Li q
-commands at the end of the
-.Xr ed
-script for System V compatibility. This option must be combined with one of
-the
-.Op -AeExX3
-options, and may not be combined with
-.Op -m .
-See Section.Dq Saving the Changed File .
-.Pp
-.It --label= Va label
-Use the label
-.Va label
-for the brackets output by the
-.Op -A ,
-.Op -E
-and
-.Op -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
-.Li diff3 --label X --label Y --label Z -m A B C
-acts like
-.Li diff3 -m A B C ,
-except that the output looks like it came from files named
-.Li X ,
-.Li Y
-and
-.Li Z
-rather than from files named
-.Li A ,
-.Li B
-and
-.Li C .
-See Section.Dq Marking Conflicts .
-.Pp
-.It -m
-.It --merge
-Apply the edit script to the first file and send the result to standard output.
-Unlike piping the output from
-.Xr diff3
-to
-.Xr ed ,
-this works even for binary files and incomplete lines.
-.Op -A
-is assumed if no edit script option is specified.See Section
-.Dq Bypassing ed .
-.Pp
-.It --strip-trailing-cr
-Strip any trailing carriage return at the end of an input line.See Section
-.Dq Binary .
-.Pp
-.It -T
-.It --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.See Section
-.Dq Tabs .
-.Pp
-.It -v
-.It --version
-Output version information and then exit.
-.Pp
-.It -x
-.It --overlap-only
-Like
-.Op -e ,
-except output only the overlapping changes.See Section
-.Dq Which Changes .
-.Pp
-.It -X
-Like
-.Op -E ,
-except output only the overlapping changes. In other words, like
-.Op -x ,
-except bracket changes as in
-.Op -E .
-See Section.Dq Marking Conflicts .
-.Pp
-.It -3
-.It --easy-only
-Like
-.Op -e ,
-except output only the nonoverlapping changes.See Section
-.Dq Which Changes .
-.El
-.Pp
-.Sh Invoking Xr patch
-Normally
-.Xr patch
-is invoked like this:
-.Pp
-.Bd -literal -offset indent
-patch <patchfile
-.Ed
-.Pp
-The full format for invoking
-.Xr patch
-is:
-.Pp
-.Bd -literal -offset indent
-patch options... [origfile [patchfile]]
-.Ed
-.Pp
-You can also specify where to read the patch from with the
-.Op -i Va patchfile
-or
-.Op --input= Va patchfile
-option. If you do not specify
-.Va patchfile ,
-or if
-.Va patchfile
-is
-.Pa - ,
-.Xr patch
-reads the patch (that is, the
-.Xr diff
-output) from the standard input.
-.Pp
-If you do not specify an input file on the command line,
-.Xr patch
-tries to intuit from the
-.Em leading text
-(any text in the patch that comes before the
-.Xr diff
-output) which file to edit.See Section
-.Dq Multiple Patches .
-.Pp
-By default,
-.Xr patch
-replaces the original input file with the patched version, possibly after
-renaming the original file into a backup file (see Section
-.Dq Backup Names ,
-for a description of how
-.Xr patch
-names backup files). You can also specify where to put the output with the
-.Op -o Va file
-or
-.Op --output= Va file
-option; however, do not use this option if
-.Va file
-is one of the input files.
-.Pp
-.Ss Options to Xr patch
-Here is a summary of all of the options that GNU
-.Xr patch
-accepts.See Section
-.Dq patch and Tradition ,
-for which of these options are safe to use in older versions of
-.Xr patch .
-.Pp
-Multiple single-letter options that do not take an argument can be combined
-into a single command line argument with only one dash.
-.Pp
-.Bl -tag -width Ds
-.It -b
-.It --backup
-Back up the original contents of each file, even if backups would normally
-not be made.See Section
-.Dq Backups .
-.Pp
-.It -B Va prefix
-.It --prefix= Va prefix
-Prepend
-.Va prefix
-to backup file names.See Section
-.Dq Backup Names .
-.Pp
-.It --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.See Section
-.Dq Backups .
-.Pp
-.It --binary
-Read and write all files in binary mode, except for standard output and
-.Pa /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
-.Li diff -a --binary .
-See Section.Dq Binary .
-.Pp
-.It -c
-.It --context
-Interpret the patch file as a context diff.See Section
-.Dq patch Input .
-.Pp
-.It -d Va directory
-.It --directory= Va directory
-Make directory
-.Va directory
-the current directory for interpreting both file names in the patch file,
-and file names given as arguments to other options.See Section
-.Dq patch Directories .
-.Pp
-.It -D Va name
-.It --ifdef= Va name
-Make merged if-then-else output using
-.Va name .
-See Section.Dq If-then-else .
-.Pp
-.It --dry-run
-Print the results of applying the patches without actually changing any files.See Section
-.Dq Dry Runs .
-.Pp
-.It -e
-.It --ed
-Interpret the patch file as an
-.Xr ed
-script.See Section
-.Dq patch Input .
-.Pp
-.It -E
-.It --remove-empty-files
-Remove output files that are empty after the patches have been applied.See Section
-.Dq Creating and Removing .
-.Pp
-.It -f
-.It --force
-Assume that the user knows exactly what he or she is doing, and do not ask
-any questions.See Section
-.Dq patch Messages .
-.Pp
-.It -F Va lines
-.It --fuzz= Va lines
-Set the maximum fuzz factor to
-.Va lines .
-See Section.Dq Inexact .
-.Pp
-.It -g Va num
-.It --get= Va num
-If
-.Va 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.See Section
-.Dq Revision Control .
-.Pp
-.It --help
-Output a summary of usage and then exit.
-.Pp
-.It -i Va patchfile
-.It --input= Va patchfile
-Read the patch from
-.Va patchfile
-rather than from standard input.See Section
-.Dq patch Options .
-.Pp
-.It -l
-.It --ignore-white-space
-Let any sequence of blanks (spaces or tabs) in the patch file match any sequence
-of blanks in the input file.See Section
-.Dq Changed White Space .
-.Pp
-.It -n
-.It --normal
-Interpret the patch file as a normal diff.See Section
-.Dq patch Input .
-.Pp
-.It -N
-.It --forward
-Ignore patches that
-.Xr patch
-thinks are reversed or already applied. See also
-.Op -R .
-See Section.Dq Reversed Patches .
-.Pp
-.It --no-backup-if-mismatch
-Do not back up the original contents of files. This is the default behavior
-when conforming to POSIX.See Section
-.Dq Backups .
-.Pp
-.It -o Va file
-.It --output= Va file
-Use
-.Va file
-as the output file name.See Section
-.Dq patch Options .
-.Pp
-.It -p Va number
-.It --strip= Va number
-Set the file name strip count to
-.Va number .
-See Section.Dq patch Directories .
-.Pp
-.It --posix
-Conform to POSIX, as if the
-.Ev POSIXLY_CORRECT
-environment variable had been set.See Section
-.Dq patch and POSIX .
-.Pp
-.It --quoting-style= Va word
-Use style
-.Va word
-to quote names in diagnostics, as if the
-.Ev QUOTING_STYLE
-environment variable had been set to
-.Va word .
-See Section.Dq patch Quoting Style .
-.Pp
-.It -r Va reject-file
-.It --reject-file= Va reject-file
-Use
-.Va reject-file
-as the reject file name.See Section
-.Dq Reject Names .
-.Pp
-.It -R
-.It --reverse
-Assume that this patch was created with the old and new files swapped.See Section
-.Dq Reversed Patches .
-.Pp
-.It -s
-.It --quiet
-.It --silent
-Work silently unless an error occurs.See Section
-.Dq patch Messages .
-.Pp
-.It -t
-.It --batch
-Do not ask any questions.See Section
-.Dq patch Messages .
-.Pp
-.It -T
-.It --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.See Section
-.Dq Patching Time Stamps .
-.Pp
-.It -u
-.It --unified
-Interpret the patch file as a unified diff.See Section
-.Dq patch Input .
-.Pp
-.It -v
-.It --version
-Output version information and then exit.
-.Pp
-.It -V Va backup-style
-.It --version=control= Va backup-style
-Select the naming convention for backup file names.See Section
-.Dq Backup Names .
-.Pp
-.It --verbose
-Print more diagnostics than usual.See Section
-.Dq patch Messages .
-.Pp
-.It -x Va number
-.It --debug= Va number
-Set internal debugging flags. Of interest only to
-.Xr patch
-patchers.
-.Pp
-.It -Y Va prefix
-.It --basename-prefix= Va prefix
-Prepend
-.Va prefix
-to base names of backup files.See Section
-.Dq Backup Names .
-.Pp
-.It -z Va suffix
-.It --suffix= Va suffix
-Use
-.Va suffix
-as the backup extension instead of
-.Li .orig
-or
-.Li ~ .
-See Section.Dq Backup Names .
-.Pp
-.It -Z
-.It --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.See Section
-.Dq Patching Time Stamps .
-.Pp
-.El
-.Sh Invoking Xr sdiff
-The
-.Xr sdiff
-command merges two files and interactively outputs the results. Its arguments
-are as follows:
-.Pp
-.Bd -literal -offset indent
-sdiff -o outfile options... from-file to-file
-.Ed
-.Pp
-This merges
-.Va from-file
-with
-.Va to-file ,
-with output to
-.Va outfile .
-If
-.Va from-file
-is a directory and
-.Va to-file
-is not,
-.Xr sdiff
-compares the file in
-.Va from-file
-whose file name is that of
-.Va to-file ,
-and vice versa.
-.Va from-file
-and
-.Va to-file
-may not both be directories.
-.Pp
-.Xr sdiff
-options begin with
-.Li - ,
-so normally
-.Va from-file
-and
-.Va to-file
-may not begin with
-.Li - .
-However,
-.Op --
-as an argument by itself treats the remaining arguments as file names even
-if they begin with
-.Li - .
-You may not use
-.Pa -
-as an input file.
-.Pp
-.Xr sdiff
-without
-.Op -o
-(or
-.Op --output )
-produces a side-by-side difference. This usage is obsolete; use the
-.Op -y
-or
-.Op --side-by-side
-option of
-.Xr diff
-instead.
-.Pp
-An exit status of 0 means no differences were found, 1 means some differences
-were found, and 2 means trouble.
-.Pp
-.Ss Options to Xr sdiff
-Below is a summary of all of the options that GNU
-.Xr sdiff
-accepts. Each option has two equivalent names, one of which is a single letter
-preceded by
-.Li - ,
-and the other of which is a long name preceded by
-.Li -- .
-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.
-.Pp
-.Bl -tag -width Ds
-.It -a
-.It --text
-Treat all files as text and compare them line-by-line, even if they do not
-appear to be text.See Section
-.Dq Binary .
-.Pp
-.It -b
-.It --ignore-space-change
-Ignore changes in amount of white space.See Section
-.Dq White Space .
-.Pp
-.It -B
-.It --ignore-blank-lines
-Ignore changes that just insert or delete blank lines.See Section
-.Dq Blank Lines .
-.Pp
-.It -d
-.It --minimal
-Change the algorithm to perhaps find a smaller set of changes. This makes
-.Xr sdiff
-slower (sometimes much slower).See Section
-.Dq diff Performance .
-.Pp
-.It --diff-program= Va program
-Use the compatible comparison program
-.Va program
-to compare files instead of
-.Xr diff .
-.Pp
-.It -E
-.It --ignore-tab-expansion
-Ignore changes due to tab expansion.See Section
-.Dq White Space .
-.Pp
-.It --help
-Output a summary of usage and then exit.
-.Pp
-.It -i
-.It --ignore-case
-Ignore changes in case; consider upper- and lower-case to be the same.See Section
-.Dq Case Folding .
-.Pp
-.It -I Va regexp
-.It --ignore-matching-lines= Va regexp
-Ignore changes that just insert or delete lines that match
-.Va regexp .
-See Section.Dq Specified Lines .
-.Pp
-.It -l
-.It --left-column
-Print only the left column of two common lines.See Section
-.Dq Side by Side Format .
-.Pp
-.It -o Va file
-.It --output= Va file
-Put merged output into
-.Va file .
-This option is required for merging.
-.Pp
-.It -s
-.It --suppress-common-lines
-Do not print common lines.See Section
-.Dq Side by Side Format .
-.Pp
-.It --speed-large-files
-Use heuristics to speed handling of large files that have numerous scattered
-small changes.See Section
-.Dq diff Performance .
-.Pp
-.It --strip-trailing-cr
-Strip any trailing carriage return at the end of an input line.See Section
-.Dq Binary .
-.Pp
-.It -t
-.It --expand-tabs
-Expand tabs to spaces in the output, to preserve the alignment of tabs in
-the input files.See Section
-.Dq Tabs .
-.Pp
-.It --tabsize= Va columns
-Assume that tab stops are set every
-.Va columns
-(default 8) print columns.See Section
-.Dq Tabs .
-.Pp
-.It -v
-.It --version
-Output version information and then exit.
-.Pp
-.It -w Va columns
-.It --width= Va columns
-Output at most
-.Va columns
-(default 130) print columns per line.See Section
-.Dq Side by Side Format .
-Note that for historical reasons, this option is
-.Op -W
-in
-.Xr diff ,
-.Op -w
-in
-.Xr sdiff .
-.Pp
-.It -W
-.It --ignore-all-space
-Ignore white space when comparing lines.See Section
-.Dq White Space .
-Note that for historical reasons, this option is
-.Op -w
-in
-.Xr diff ,
-.Op -W
-in
-.Xr sdiff .
-.El
-.Pp
-.Sh Standards conformance
-In a few cases, the GNU utilities' default behavior is incompatible with the
-POSIX standard. To suppress these incompatibilities, define the
-.Ev POSIXLY_CORRECT
-environment variable. Unless you are checking for POSIX conformance, you probably
-do not need to define
-.Ev POSIXLY_CORRECT .
-.Pp
-Normally options and operands can appear in any order, and programs act as
-if all the options appear before any operands. For example,
-.Li diff lao tzu -C 2
-acts like
-.Li diff -C 2 lao tzu ,
-since
-.Li 2
-is an option-argument of
-.Op -C .
-However, if the
-.Ev POSIXLY_CORRECT
-environment variable is set, options must appear before operands, unless otherwise
-specified for a particular command.
-.Pp
-Newer versions of POSIX are occasionally incompatible with older versions.
-For example, older versions of POSIX allowed the command
-.Li diff -c -10
-to have the same meaning as
-.Li diff -C 10 ,
-but POSIX 1003.1-2001
-.Li diff
-no longer allows digit-string options like
-.Op -10 .
-.Pp
-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
-.Ev _POSIX2_VERSION
-environment variable to a value of the form
-.Va yyyymm
-specifying the year and month the standard was adopted. Two values are currently
-supported for
-.Ev _POSIX2_VERSION :
-.Li 199209
-stands for POSIX 1003.2-1992, and
-.Li 200112
-stands for POSIX 1003.1-2001. For example, if you are running older software
-that assumes an older version of POSIX and uses
-.Li diff -c -10 ,
-you can work around the compatibility problems by setting
-.Li _POSIX2_VERSION=199209
-in your environment.
-.Pp
-.Sh Future Projects
-Here are some ideas for improving GNU
-.Xr diff
-and
-.Xr 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.
-.Pp
-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
-.Mt gvc@gnu.org
-to coordinate with other volunteers.
-.Pp
-.Ss Suggested Projects for Improving GNU Xr diff and Xr patch
-One should be able to use GNU
-.Xr diff
-to generate a patch from any pair of directory trees, and given the patch
-and a copy of one such tree, use
-.Xr patch
-to generate a faithful copy of the other. Unfortunately, some changes to directory
-trees cannot be expressed using current patch formats; also,
-.Xr patch
-does not handle some of the existing formats. These shortcomings motivate
-the following suggested projects.
-.Pp
-.Em Handling Multibyte and Varying-Width Characters
-.Pp
-.Xr diff ,
-.Xr diff3
-and
-.Xr 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,
-.Xr diff
-does not properly ignore a multibyte space character.
-.Pp
-Also,
-.Xr 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
-.Op -y
-or
-.Op --side-by-side
-option of
-.Xr diff .
-.Pp
-These problems need to be fixed without unduly affecting the performance of
-the utilities in unibyte environments.
-.Pp
-The IBM GNU/Linux Technology Center Internationalization Team has proposed
-.Lk 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
-.Xr diff ,
-so more work needs to be done in this area.
-.Pp
-.Em Handling Changes to the Directory Structure
-.Pp
-.Xr diff
-and
-.Xr patch
-do not handle some changes to directory structure. For example, suppose one
-directory tree contains a directory named
-.Li D
-with some subsidiary files, and another contains a file with the same name
-.Li D .
-.Li diff -r
-does not output enough information for
-.Xr patch
-to transform the directory subtree into the file.
-.Pp
-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
-.Xr patch
-that a file was renamed, even if there is no way for
-.Xr diff
-to generate such information. There should be a way to tell
-.Xr patch
-that a file's time stamp has changed, even if its contents have not changed.
-.Pp
-These problems can be fixed by extending the
-.Xr diff
-output format to represent changes in directory structure, and extending
-.Xr patch
-to understand these extensions.
-.Pp
-.Em Files that are Neither Directories Nor Regular Files
-.Pp
-Some files are neither directories nor regular files: they are unusual files
-like symbolic links, device special files, named pipes, and sockets. Currently,
-.Xr diff
-treats symbolic links as if they were the pointed-to files, except that a
-recursive
-.Xr diff
-reports an error if it detects infinite loops of symbolic links (e.g., symbolic
-links to
-.Pa .. ) .
-.Xr diff
-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
-.Xr patch
-cannot represent changes to such files. For example, if you change which file
-a symbolic link points to,
-.Xr diff
-outputs the difference between the two files, instead of the change to the
-symbolic link.
-.Pp
-.Xr diff
-should optionally report changes to special files specially, and
-.Xr patch
-should be extended to understand these extensions.
-.Pp
-.Em File Names that Contain Unusual Characters
-.Pp
-When a file name contains an unusual character like a newline or white space,
-.Li diff -r
-generates a patch that
-.Xr patch
-cannot parse. The problem is with format of
-.Xr diff
-output, not just with
-.Xr patch ,
-because with odd enough file names one can cause
-.Xr diff
-to generate a patch that is syntactically correct but patches the wrong files.
-The format of
-.Xr diff
-output should be extended to handle all possible file names.
-.Pp
-.Em Outputting Diffs in Time Stamp Order
-.Pp
-Applying
-.Xr patch
-to a multiple-file diff can result in files whose time stamps are out of order.
-GNU
-.Xr patch
-has options to restore the time stamps of the updated files (see Section
-.Dq 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
-.Xr diff
-option to output diffs in time stamp order.
-.Pp
-.Em Ignoring Certain Changes
-.Pp
-It would be nice to have a feature for specifying two strings, one in
-.Va from-file
-and one in
-.Va to-file ,
-which should be considered to match. Thus, if the two strings are
-.Li foo
-and
-.Li bar ,
-then if two lines differ only in that
-.Li foo
-in file 1 corresponds to
-.Li bar
-in file 2, the lines are treated as identical.
-.Pp
-It is not clear how general this feature can or should be, or what syntax
-should be used for it.
-.Pp
-A partial substitute is to filter one or both files before comparing, e.g.:
-.Pp
-.Bd -literal -offset indent
-sed 's/foo/bar/g' file1 | diff - file2
-.Ed
-.Pp
-However, this outputs the filtered text, not the original.
-.Pp
-.Em Improving Performance
-.Pp
-When comparing two large directory structures, one of which was originally
-copied from the other with time stamps preserved (e.g., with
-.Li cp -pR ) ,
-it would greatly improve performance if an option told
-.Xr diff
-to assume that two files with the same size and time stamps have the same
-content.See Section
-.Dq diff Performance .
-.Pp
-.Ss Reporting Bugs
-If you think you have found a bug in GNU
-.Xr cmp ,
-.Xr diff ,
-.Xr diff3 ,
-or
-.Xr sdiff ,
-please report it by electronic mail to the
-.Lk http://mail.gnu.org/mailman/listinfo/bug-gnu-utils
-.Mt bug-gnu-utils@gnu.org .
-Please send bug reports for GNU
-.Xr patch
-to
-.Mt bug-patch@gnu.org .
-Send as precise a description of the problem as you can, including the output
-of the
-.Op --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
-.Lk ftp://alpha.gnu.org/gnu/diffutils/ .
-.Pp
-.Sh Copying This Manual
-.Ss GNU Free Documentation License
-.Bd -filled -offset indent
-Copyright \(co 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place,
-Suite 330, Boston, MA 02111-1307, USA
-.Pp
-Everyone is permitted to copy and distribute verbatim copies of this license
-document, but changing it is not allowed.
-.Ed
-.Pp
-.Bl -enum
-.It
-PREAMBLE
-.Pp
-The purpose of this License is to make a manual, textbook, or other functional
-and useful document
-.Em 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.
-.Pp
-This License is a kind of \(lqcopyleft\(rq, 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.
-.Pp
-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.
-.Pp
-.It
-APPLICABILITY AND DEFINITIONS
-.Pp
-This License applies to any manual or other work, in any medium, that contains
-a notice placed by the copyright holder saying it can be distributed under
-the terms of this License. Such a notice grants a world-wide, royalty-free
-license, unlimited in duration, to use that work under the conditions stated
-herein. The \(lqDocument\(rq, below, refers to any such manual or work. Any member
-of the public is a licensee, and is addressed as \(lqyou\(rq. You accept the license
-if you copy, modify or distribute the work in a way requiring permission under
-copyright law.
-.Pp
-A \(lqModified Version\(rq 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.
-.Pp
-A \(lqSecondary Section\(rq is a named appendix or a front-matter section of the Document
-that deals exclusively with the relationship of the publishers or authors
-of the Document to the Document's overall subject (or to related matters)
-and contains nothing that could fall directly within that overall subject.
-(Thus, if the Document is in part a textbook of mathematics, a Secondary Section
-may not explain any mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal, commercial,
-philosophical, ethical or political position regarding them.
-.Pp
-The \(lqInvariant Sections\(rq are certain Secondary Sections whose titles are designated,
-as being those of Invariant Sections, in the notice that says that the Document
-is released under this License. If a section does not fit the above definition
-of Secondary then it is not allowed to be designated as Invariant. The Document
-may contain zero Invariant Sections. If the Document does not identify any
-Invariant Sections then there are none.
-.Pp
-The \(lqCover Texts\(rq are certain short passages of text that are listed, as Front-Cover
-Texts or Back-Cover Texts, in the notice that says that the Document is released
-under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover
-Text may be at most 25 words.
-.Pp
-A \(lqTransparent\(rq copy of the Document means a machine-readable copy, represented
-in a format whose specification is available to the general public, that is
-suitable for revising the document straightforwardly with generic text editors
-or (for images composed of pixels) generic paint programs or (for drawings)
-some widely available drawing editor, and that is suitable for input to text
-formatters or for automatic translation to a variety of formats suitable for
-input to text formatters. A copy made in an otherwise Transparent file format
-whose markup, or absence of markup, has been arranged to thwart or discourage
-subsequent modification by readers is not Transparent. An image format is
-not Transparent if used for any substantial amount of text. A copy that is
-not \(lqTransparent\(rq is called \(lqOpaque\(rq.
-.Pp
-Examples of suitable formats for Transparent copies include plain ascii without
-markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly
-available DTD, and standard-conforming simple HTML, PostScript or PDF designed
-for human modification. Examples of transparent image formats include PNG,
-XCF and JPG. Opaque formats include proprietary formats that can be read and
-edited only by proprietary word processors, SGML or XML for which the DTD
-and/or processing tools are not generally available, and the machine-generated
-HTML, PostScript or PDF produced by some word processors for output purposes
-only.
-.Pp
-The \(lqTitle Page\(rq 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, \(lqTitle Page\(rq means the text near the most prominent
-appearance of the work's title, preceding the beginning of the body of the
-text.
-.Pp
-A section \(lqEntitled XYZ\(rq means a named subunit of the Document whose title either
-is precisely XYZ or contains XYZ in parentheses following text that translates
-XYZ in another language. (Here XYZ stands for a specific section name mentioned
-below, such as \(lqAcknowledgements\(rq, \(lqDedications\(rq, \(lqEndorsements\(rq, or \(lqHistory\(rq.) To
-\(lqPreserve the Title\(rq of such a section when you modify the Document means that
-it remains a section \(lqEntitled XYZ\(rq according to this definition.
-.Pp
-The Document may include Warranty Disclaimers next to the notice which states
-that this License applies to the Document. These Warranty Disclaimers are
-considered to be included by reference in this License, but only as regards
-disclaiming warranties: any other implication that these Warranty Disclaimers
-may have is void and has no effect on the meaning of this License.
-.Pp
-.It
-VERBATIM COPYING
-.Pp
-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.
-.Pp
-You may also lend copies, under the same conditions stated above, and you
-may publicly display copies.
-.Pp
-.It
-COPYING IN QUANTITY
-.Pp
-If you publish printed copies (or copies in media that commonly have printed
-covers) of the Document, numbering more than 100, and the Document's license
-notice requires Cover Texts, you must enclose the copies in covers that carry,
-clearly and legibly, all these Cover Texts: Front-Cover Texts on the front
-cover, and Back-Cover Texts on the back cover. Both covers must also clearly
-and legibly identify you as the publisher of these copies. The front cover
-must present the full title with all words of the title equally prominent
-and visible. You may add other material on the covers in addition. Copying
-with changes limited to the covers, as long as they preserve the title of
-the Document and satisfy these conditions, can be treated as verbatim copying
-in other respects.
-.Pp
-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.
-.Pp
-If you publish or distribute Opaque copies of the Document numbering more
-than 100, you must either include a machine-readable Transparent copy along
-with each Opaque copy, or state in or with each Opaque copy a computer-network
-location from which the general network-using public has access to download
-using public-standard network protocols a complete Transparent copy of the
-Document, free of added material. If you use the latter option, you must take
-reasonably prudent steps, when you begin distribution of Opaque copies in
-quantity, to ensure that this Transparent copy will remain thus accessible
-at the stated location until at least one year after the last time you distribute
-an Opaque copy (directly or through your agents or retailers) of that edition
-to the public.
-.Pp
-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.
-.Pp
-.It
-MODIFICATIONS
-.Pp
-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:
-.Pp
-.Bl -enum
-.It
-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.
-.Pp
-.It
-List on the Title Page, as authors, one or more persons or entities responsible
-for authorship of the modifications in the Modified Version, together with
-at least five of the principal authors of the Document (all of its principal
-authors, if it has fewer than five), unless they release you from this requirement.
-.Pp
-.It
-State on the Title page the name of the publisher of the Modified Version,
-as the publisher.
-.Pp
-.It
-Preserve all the copyright notices of the Document.
-.Pp
-.It
-Add an appropriate copyright notice for your modifications adjacent to the
-other copyright notices.
-.Pp
-.It
-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.
-.Pp
-.It
-Preserve in that license notice the full lists of Invariant Sections and required
-Cover Texts given in the Document's license notice.
-.Pp
-.It
-Include an unaltered copy of this License.
-.Pp
-.It
-Preserve the section Entitled \(lqHistory\(rq, Preserve its Title, and add to it an
-item stating at least the title, year, new authors, and publisher of the Modified
-Version as given on the Title Page. If there is no section Entitled \(lqHistory\(rq
-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.
-.Pp
-.It
-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 \(lqHistory\(rq 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.
-.Pp
-.It
-For any section Entitled \(lqAcknowledgements\(rq or \(lqDedications\(rq, Preserve the Title
-of the section, and preserve in the section all the substance and tone of
-each of the contributor acknowledgements and/or dedications given therein.
-.Pp
-.It
-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.
-.Pp
-.It
-Delete any section Entitled \(lqEndorsements\(rq. Such a section may not be included
-in the Modified Version.
-.Pp
-.It
-Do not retitle any existing section to be Entitled \(lqEndorsements\(rq or to conflict
-in title with any Invariant Section.
-.Pp
-.It
-Preserve any Warranty Disclaimers.
-.El
-.Pp
-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.
-.Pp
-You may add a section Entitled \(lqEndorsements\(rq, 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.
-.Pp
-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.
-.Pp
-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.
-.Pp
-.It
-COMBINING DOCUMENTS
-.Pp
-You may combine the Document with other documents released under this License,
-under the terms defined in section 4 above for modified versions, provided
-that you include in the combination all of the Invariant Sections of all of
-the original documents, unmodified, and list them all as Invariant Sections
-of your combined work in its license notice, and that you preserve all their
-Warranty Disclaimers.
-.Pp
-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.
-.Pp
-In the combination, you must combine any sections Entitled \(lqHistory\(rq in the
-various original documents, forming one section Entitled \(lqHistory\(rq; likewise
-combine any sections Entitled \(lqAcknowledgements\(rq, and any sections Entitled
-\(lqDedications\(rq. You must delete all sections Entitled \(lqEndorsements.\(rq
-.Pp
-.It
-COLLECTIONS OF DOCUMENTS
-.Pp
-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.
-.Pp
-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.
-.Pp
-.It
-AGGREGATION WITH INDEPENDENT WORKS
-.Pp
-A compilation of the Document or its derivatives with other separate and independent
-documents or works, in or on a volume of a storage or distribution medium,
-is called an \(lqaggregate\(rq if the copyright resulting from the compilation is
-not used to limit the legal rights of the compilation's users beyond what
-the individual works permit. When the Document is included in an aggregate,
-this License does not apply to the other works in the aggregate which are
-not themselves derivative works of the Document.
-.Pp
-If the Cover Text requirement of section 3 is applicable to these copies of
-the Document, then if the Document is less than one half of the entire aggregate,
-the Document's Cover Texts may be placed on covers that bracket the Document
-within the aggregate, or the electronic equivalent of covers if the Document
-is in electronic form. Otherwise they must appear on printed covers that bracket
-the whole aggregate.
-.Pp
-.It
-TRANSLATION
-.Pp
-Translation is considered a kind of modification, so you may distribute translations
-of the Document under the terms of section 4. Replacing Invariant Sections
-with translations requires special permission from their copyright holders,
-but you may include translations of some or all Invariant Sections in addition
-to the original versions of these Invariant Sections. You may include a translation
-of this License, and all the license notices in the Document, and any Warranty
-Disclaimers, provided that you also include the original English version of
-this License and the original versions of those notices and disclaimers. In
-case of a disagreement between the translation and the original version of
-this License or a notice or disclaimer, the original version will prevail.
-.Pp
-If a section in the Document is Entitled \(lqAcknowledgements\(rq, \(lqDedications\(rq, or
-\(lqHistory\(rq, the requirement (section 4) to Preserve its Title (section 1) will
-typically require changing the actual title.
-.Pp
-.It
-TERMINATION
-.Pp
-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.
-.Pp
-.It
-FUTURE REVISIONS OF THIS LICENSE
-.Pp
-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
-.Lk http://www.gnu.org/copyleft/ .
-.Pp
-Each version of the License is given a distinguishing version number. If the
-Document specifies that a particular numbered version of this License \(lqor any
-later version\(rq 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.
-.El
-.Pp
-.Em ADDENDUM: How to use this License for your documents
-.Pp
-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:
-.Pp
-.Bd -literal -offset indent
-
- Copyright (C) year your name.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled \(lqGNU
- Free Documentation License\(rq.
-
-.Ed
-.Pp
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace
-the \(lqwith...Texts.\(rq line with this:
-.Pp
-.Bd -literal -offset indent
-
- with the Invariant Sections being list their titles, with
- the Front-Cover Texts being list, and with the Back-Cover Texts
- being list.
-
-.Ed
-.Pp
-If you have Invariant Sections without Cover Texts, or some other combination
-of the three, merge those two alternatives to suit the situation.
-.Pp
-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.
-.Pp
-.Sh Translations of This Manual
-Nishio Futoshi of the GNUjdoc project has prepared a Japanese translation
-of this manual. Its most recent version can be found at
-.Lk http://openlab.ring.gr.jp/gnujdoc/cvsweb/cvsweb.cgi/gnujdoc/ .
-.Pp
-.Sh Index
Index: contrib/diff/doc/diff.texi
===================================================================
--- contrib/diff/doc/diff.texi
+++ /dev/null
@@ -1,4653 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@comment $Id: diff.texi,v 1.25 2004/04/12 07:44:35 eggert 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 @acronym{GNU} @command{diff}, @command{diff3},
-@command{sdiff}, and @command{cmp} commands for showing the
-differences between files and the @acronym{GNU} @command{patch} command for
-using their output to update files.
-
-Copyright @copyright{} 1992, 1993, 1994, 1998, 2001, 2002, 2004 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 Text creation and manipulation
-@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 @acronym{POSIX} standard.
-* Projects:: If you've found a bug or other shortcoming.
-
-* Copying This Manual:: How to make copies of this manual.
-* Translations:: Available translations 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 @acronym{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.
-
-@acronym{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
-by Eugene W. Myers in ``An O(ND) Difference Algorithm and its Variations'',
-@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 by E. Ukkonen in
-``Algorithms for Approximate String Matching'',
-@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.
-Unless the @option{--minimal} option is used, @command{diff} uses a
-heuristic by Paul Eggert that limits the cost to @math{O(N^1.5 log N)}
-at the price of producing suboptimal output for large inputs with many
-differences. Related algorithms are surveyed by Alfred V. Aho in
-section 6.3 of ``Algorithms for Finding Patterns in Strings'',
-@cite{Handbook of Theoretical Computer Science} (Jan Van Leeuwen,
-ed.), Vol.@: A, @cite{Algorithms and Complexity}, Elsevier/MIT Press,
-1990, pp.@: 255--300.
-
-@acronym{GNU} @command{diff3} was written by Randy Smith. @acronym{GNU}
-@command{sdiff} was written by Thomas Lord. @acronym{GNU} @command{cmp}
-was written by Torbj@"orn Granlund and David MacKenzie.
-
-@acronym{GNU} @command{patch} was written mainly by Larry Wall and Paul Eggert;
-several @acronym{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.
-
-@acronym{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 whose lines are all blank.
-* Specified Lines:: Suppressing differences whose lines all match a pattern.
-* Case Folding:: Suppressing differences in alphabetic case.
-* 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{-d} or @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} or @option{--ignore-tab-expansion} option ignores 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 (@pxref{Tabs}).
-
-The @option{-b} or @option{--ignore-space-change} option is stronger.
-It ignores white space at line end, and considers all other sequences of
-one or more white space characters within a line to be equivalent. With this
-option, @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} or @option{--ignore-all-space} option is stronger still.
-It ignores differences 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 this option, @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 Whose Lines Are All Blank
-@cindex blank line difference suppression
-
-The @option{-B} or @option{--ignore-blank-lines} option ignores changes
-that consist entirely of blank lines. With this option, 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
-
-Normally this option affects only lines that are completely empty, but
-if you also specify the @option{-b} or @option{--ignore-space-change}
-option, or the @option{-w} or @option{--ignore-all-space} option,
-lines are also affected if they look empty but contain white space.
-In other words, @option{-B} is equivalent to @samp{-I '^$'} by
-default, but it is equivalent to @option{-I '^[[:space:]]*$'} if
-@option{-b} or @option{-w} is also specified.
-
-@node Specified Lines
-@section Suppressing Differences Whose Lines All Match 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 Case Folding
-@section Suppressing Case Differences
-@cindex case difference suppression
-
-@acronym{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 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}
-or @option{--brief} option selects 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, or reports that one
-file is a prefix of the other. You can use
-the @option{-s}, @option{--quiet}, or @option{--silent} 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 report only whether files differ
-(but not how). Use the @option{-q} or @option{--brief} option for
-this.
-
-Normally, differing binary files count as 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 generate a form of output that
-represents differences as requested.
-
-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 @acronym{POSIX}-compliant system
-like @acronym{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 @acronym{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} or @option{--verbose}
-option to show the values of each differing byte in the two files.
-With @acronym{GNU} @command{cmp}, you can also use the @option{-b} or
-@option{--print-bytes} option to show the @acronym{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} option.
-
-@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.
-* Context:: Showing differences with the surrounding text.
-* Side by Side:: Showing differences in two columns.
-* Normal:: Showing differences without surrounding text.
-* 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 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}.
-
-@acronym{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
-* Example Context:: Sample output in context format.
-* Less Context:: Another sample with less context.
-* Detailed Context:: A detailed description of the context output format.
-@end menu
-
-@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 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}. (The fractional seconds are omitted on hosts that do
-not support fractional time stamps.) 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-numbers} ****
- @var{from-file-line}
- @var{from-file-line}@dots{}
---- @var{to-file-line-numbers} ----
- @var{to-file-line}
- @var{to-file-line}@dots{}
-@end example
-
-If a hunk contains two or more lines, its line numbers look like
-@samp{@var{start},@var{end}}. Otherwise only its end line number
-appears. An empty hunk is considered to end at the line that precedes
-the hunk.
-
-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 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 @acronym{GNU} @command{diff} can produce this format and
-only @acronym{GNU} @command{patch} can automatically apply diffs in this
-format. For proper operation, @command{patch} typically needs at
-least three lines of context.
-
-@menu
-* Example Unified:: Sample output in unified format.
-* Detailed Unified:: A detailed description of unified format.
-@end menu
-
-@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 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.
-The fractional seconds are omitted on hosts that do not support
-fractional time stamps.
-
-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-line-numbers} @var{to-file-line-numbers} @@@@
- @var{line-from-either-file}
- @var{line-from-either-file}@dots{}
-@end example
-
-If a hunk contains just one line, only its start line number appears.
-Otherwise its line numbers look like @samp{@var{start},@var{count}}.
-An empty hunk is considered to start at the line that follows the hunk.
-
-If a hunk and its context contain two or more lines, its
-line numbers look like @samp{@var{start},@var{count}}. Otherwise only
-its end line number appears. An empty hunk is considered to end at
-the line that precedes the hunk.
-
-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 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. @acronym{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} or @option{--show-function-line} option finds the nearest
-unchanged line that precedes each hunk of differences and matches the
-given regular expression. Then it adds 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, this option leaves the output for
-that hunk unchanged. If that line is more than 40 characters long, it
-outputs 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} or @option{--show-c-function} option is equivalent to
-@option{-F '^[[:alpha:]$_]'} if the unified format is specified, otherwise
-@option{-c -F '^[[:alpha:]$_]'} (@pxref{Specified Headings}). @acronym{GNU}
-@command{diff} provides this option 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 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 @acronym{POSIX}
-standard. Use the @option{--normal} option to select this output
-format explicitly.
-
-@menu
-* Example Normal:: Sample output in the normal format.
-* Detailed Normal:: A detailed description of normal output format.
-@end menu
-
-@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 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 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 @acronym{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
-* Example ed:: A sample @command{ed} script.
-* Detailed ed:: A detailed description of @command{ed} format.
-@end menu
-
-@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 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, @acronym{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 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 @acronym{RCS} Scripts
-@cindex @acronym{RCS} script output format
-
-The @acronym{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.
-* Example If-then-else:: Sample if-then-else format output.
-* Detailed If-then-else:: A detailed description of if-then-else format.
-@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
-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 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 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 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
-@acronym{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. Trailing
-white space and empty lines are ignored in the pattern file.
-
-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}} or @option{--exclude=@var{pattern}}
-option, or an @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. @acronym{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. 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). @command{diff} normally assumes that tab stops are set
-every 8 print columns, but this can be altered by the
-@option{--tabsize=@var{columns}} option.
-
-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} or @option{--paginate} option does 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}
-
-@acronym{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 @acronym{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 @acronym{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 @acronym{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.
-* Example diff3 Normal:: Sample output in the normal format.
-* diff3 Hunks:: The format of normal output format.
-* Detailed diff3 Normal:: A detailed description of normal output 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 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 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 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{--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 --label X
---label Y --label 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} 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. @acronym{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
-@acronym{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}
-
---expand-tabs
---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
---tabsize=@var{columns} --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
-@itemx e1
-Edit a copy of the left version, then copy the result to the output.
-
-@item er
-@itemx e2
-Edit a copy of the right version, then copy the result to the output.
-
-@item l
-@itemx 1
-Copy the left version to the output.
-
-@item q
-Quit.
-
-@item r
-@itemx 2
-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 @acronym{RCS}, @acronym{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 @acronym{POSIX} standard.
-* patch and Tradition:: @acronym{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 @acronym{RCS}
-@cindex ClearCase
-@cindex @acronym{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 @acronym{RCS}, ClearCase and
-@acronym{SCCS}. Under @acronym{RCS} and @acronym{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}} option 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 @acronym{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 @acronym{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 (@acronym{UTC}, often known as @acronym{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 @acronym{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 @acronym{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 @acronym{POSIX}, and the best name otherwise.
-
-@item
-If @command{patch} is not ignoring @acronym{RCS}, ClearCase, and @acronym{SCCS}
-(@pxref{Revision Control}), and no named files exist but an @acronym{RCS},
-ClearCase, or @acronym{SCCS} master is found, @command{patch} selects the
-first named file with an @acronym{RCS}, ClearCase, or @acronym{SCCS} master.
-
-@item
-If no named files exist, no @acronym{RCS}, ClearCase, or @acronym{SCCS} master
-was found, some names are given, @command{patch} is not conforming to
-@acronym{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 @acronym{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 @acronym{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 @acronym{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 @acronym{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 @acronym{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
-@acronym{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 @acronym{GNU} Emacs @code{version-control}
-variable (@pxref{Backup Names, , , emacs, The @acronym{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 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 @acronym{POSIX} Standard
-@cindex @acronym{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 @acronym{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 @acronym{RCS}, ClearCase, or
-@acronym{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 @acronym{GNU} @command{patch} and Traditional @command{patch}
-@cindex traditional @command{patch}
-
-The current version of @acronym{GNU} @command{patch} normally follows the
-@acronym{POSIX} standard. @xref{patch and POSIX}, for the few exceptions
-to this general rule.
-
-Unfortunately, @acronym{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 @acronym{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 @acronym{POSIX} @command{patch}, backups are never made,
-even when there is a mismatch. In @acronym{GNU} @command{patch}, this
-behavior is enabled with the @option{--no-backup-if-mismatch} option,
-or by conforming to @acronym{POSIX}.
-
-The @option{-b@ @var{suffix}} option of traditional @command{patch} is
-equivalent to the @samp{-b -z@ @var{suffix}} options of @acronym{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 @acronym{POSIX}, and had
-a few gotchas. Now @command{patch} uses a different, equally
-complicated (but better documented) method that is optionally
-@acronym{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 @acronym{GNU} @command{patch},
-traditional @command{patch}, or a @command{patch} that conforms to
-@acronym{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.
-
-@acronym{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 @acronym{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 or reports
-that one file is a prefix of the other. 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.
-
-By default, @command{cmp} outputs nothing if the two files have the
-same contents. If one file is a prefix of the other, @command{cmp}
-prints to standard error a message of the following form:
-
-@example
-cmp: EOF on @var{shorter-file}
-@end example
-
-Otherwise, @command{cmp} prints to standard output a message of the
-following form:
-
-@example
-@var{from-file} @var{to-file} differ: char @var{byte-number}, line @var{line-number}
-@end example
-
-The message formats can differ outside the @acronym{POSIX} locale.
-Also, @acronym{POSIX} allows the @acronym{EOF} message to be followed
-by a blank and some additional information.
-
-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 @acronym{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
-Output the (decimal) byte numbers and (octal) values of all differing bytes,
-instead of the default standard output.
-
-@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
-@acronym{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. Normally, differing
-binary files count as trouble, but this can be altered by using the
-@option{-a} or @option{--text} option, or the @option{-q} or
-@option{--brief} option.
-
-@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 @acronym{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}. @acronym{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 Lines}.
-
-@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 @acronym{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 --tabsize=@var{columns}
-Assume that tab stops are set every @var{columns} (default 8) print
-columns. @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}.
-@acronym{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 @acronym{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 --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 --label X --label Y --label 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 --strip-trailing-cr
-Strip any trailing carriage return at the end of an input line.
-@xref{Binary}.
-
-@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 @acronym{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 @acronym{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
-@acronym{POSIX}-conforming systems like @acronym{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 @acronym{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 @acronym{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 @acronym{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 @acronym{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 Lines}.
-
-@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 --tabsize=@var{columns}
-Assume that tab stops are set every @var{columns} (default 8) print
-columns. @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 @acronym{POSIX}
-
-@vindex POSIXLY_CORRECT
-In a few cases, the @acronym{GNU} utilities' default behavior is
-incompatible with the @acronym{POSIX} standard. To suppress these
-incompatibilities, define the @env{POSIXLY_CORRECT} environment
-variable. Unless you are checking for @acronym{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 @acronym{POSIX} are occasionally incompatible with older
-versions. For example, older versions of @acronym{POSIX} allowed the
-command @samp{diff -c -10} to have the same meaning as @samp{diff -C
-10}, but @acronym{POSIX} 1003.1-2001 @samp{diff} no longer allows
-digit-string options like @option{-10}.
-
-@vindex _POSIX2_VERSION
-The @acronym{GNU} utilities normally conform to the version of @acronym{POSIX}
-that is standard for your system. To cause them to conform to a
-different version of @acronym{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
-@acronym{POSIX} 1003.2-1992, and @samp{200112} stands for @acronym{POSIX}
-1003.1-2001. For example, if you are running older software that
-assumes an older version of @acronym{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 @acronym{GNU} @command{diff} and
-@command{patch}. The @acronym{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
-@acronym{GNU} project, please consider volunteering for one of these
-projects. If you are seriously contemplating work, please write to
-@email{gvc@@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 @acronym{GNU} @command{diff} and @command{patch}
-@cindex projects for directories
-
-One should be able to use @acronym{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
-@uref{http://oss.software.ibm.com/developer/opensource/linux/patches/i18n/diffutils-2.7.2-i18n-0.1.patch.gz,patches
-to support internationalized @command{diff}}.
-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 as if they
-were the pointed-to files, except that a recursive @command{diff}
-reports an error if it detects infinite loops of symbolic links (e.g.,
-symbolic links to @file{..}). @command{diff} 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. @acronym{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 @acronym{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 @acronym{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 @acronym{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 Translations
-@appendix Translations of This Manual
-
-Nishio Futoshi of the GNUjdoc project has prepared a Japanese
-translation of this manual. Its most recent version can be found at
-@uref{http://openlab.ring.gr.jp/gnujdoc/cvsweb/cvsweb.cgi/gnujdoc/}.
-
-@node Index
-@appendix Index
-
-@printindex cp
-
-@bye
Index: contrib/diff/doc/fdl.texi
===================================================================
--- contrib/diff/doc/fdl.texi
+++ /dev/null
@@ -1,452 +0,0 @@
-
-@node GNU Free Documentation License
-@appendixsec GNU Free Documentation License
-
-@cindex FDL, GNU Free Documentation License
-@center Version 1.2, November 2002
-
-@display
-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
-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
-functional and useful document @dfn{free} in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-@item
-APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The ``Document'', below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as ``you''. You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject. (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-@sc{ascii} without markup, Texinfo input format, La@TeX{} input
-format, @acronym{SGML} or @acronym{XML} using a publicly available
-@acronym{DTD}, and standard-conforming simple @acronym{HTML},
-PostScript or @acronym{PDF} designed for human modification. Examples
-of transparent image formats include @acronym{PNG}, @acronym{XCF} and
-@acronym{JPG}. Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, @acronym{SGML} or
-@acronym{XML} for which the @acronym{DTD} and/or processing tools are
-not generally available, and the machine-generated @acronym{HTML},
-PostScript or @acronym{PDF} produced by some word processors for
-output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-@item
-VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-@item
-COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-@item
-MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-@enumerate A
-@item
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document). You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-@item
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-@item
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-@item
-Preserve all the copyright notices of the Document.
-
-@item
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-@item
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-@item
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-@item
-Include an unaltered copy of this License.
-
-@item
-Preserve the section Entitled ``History'', Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page. If
-there is no section Entitled ``History'' in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-@item
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on. These may be placed in the ``History'' section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-@item
-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-@item
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles. Section numbers
-or the equivalent are not considered part of the section titles.
-
-@item
-Delete any section Entitled ``Endorsements''. Such a section
-may not be included in the Modified Version.
-
-@item
-Do not retitle any existing section to be Entitled ``Endorsements'' or
-to conflict in title with any Invariant Section.
-
-@item
-Preserve any Warranty Disclaimers.
-@end enumerate
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties---for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-@item
-COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''. You must delete all
-sections Entitled ``Endorsements.''
-
-@item
-COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-@item
-AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-@item
-TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-@item
-TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-@uref{http://www.gnu.org/copyleft/}.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-@end enumerate
-
-@page
-@appendixsubsec ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-@smallexample
-@group
- Copyright (C) @var{year} @var{your name}.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-@end group
-@end smallexample
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with...Texts.'' line with this:
-
-@smallexample
-@group
- with the Invariant Sections being @var{list their titles}, with
- the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
- being @var{list}.
-@end group
-@end smallexample
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-
-@c Local Variables:
-@c ispell-local-pdict: "ispell-dict"
-@c End:
-
Index: contrib/diff/doc/stamp-vti
===================================================================
--- contrib/diff/doc/stamp-vti
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 12 April 2004
-@set UPDATED-MONTH April 2004
-@set EDITION 2.8.7
-@set VERSION 2.8.7
Index: contrib/diff/doc/version.texi
===================================================================
--- contrib/diff/doc/version.texi
+++ /dev/null
@@ -1,4 +0,0 @@
-@set UPDATED 12 April 2004
-@set UPDATED-MONTH April 2004
-@set EDITION 2.8.7
-@set VERSION 2.8.7
Index: contrib/diff/lib/basename.c
===================================================================
--- contrib/diff/lib/basename.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* basename.c -- return the last element in a path
-
- Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003 Free Software
- Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "dirname.h"
-#include <string.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;
-}
Index: contrib/diff/lib/c-stack.h
===================================================================
--- contrib/diff/lib/c-stack.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Stack overflow handling.
-
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-int c_stack_action (void (*) (int));
Index: contrib/diff/lib/c-stack.c
===================================================================
--- contrib/diff/lib/c-stack.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/* Stack overflow handling.
-
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Paul Eggert. */
-
-/* NOTES:
-
- A program that uses alloca, dynamic arrays, or large local
- variables may extend the stack by more than a page at a time. If
- so, when the stack overflows the operating system may not detect
- the overflow until the program uses the array, and this module may
- incorrectly report a program error instead of a stack overflow.
-
- To avoid this problem, allocate only small objects on the stack; a
- program should be OK if it limits single allocations to a page or
- less. Allocate larger arrays in static storage, or on the heap
- (e.g., with malloc). Yes, this is a pain, but we don't know of any
- better solution that is portable.
-
- No attempt has been made to deal with multithreaded applications. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef __attribute__
-# if __GNUC__ < 3 || __STRICT_ANSI__
-# define __attribute__(x)
-# endif
-#endif
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
-#include <errno.h>
-#ifndef ENOTSUP
-# define ENOTSUP EINVAL
-#endif
-#ifndef EOVERFLOW
-# define EOVERFLOW EINVAL
-#endif
-
-#include <signal.h>
-#if ! HAVE_STACK_T && ! defined stack_t
-typedef struct sigaltstack stack_t;
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#if HAVE_SYS_RESOURCE_H
-/* Include sys/time.h here, because...
- SunOS-4.1.x <sys/resource.h> fails to include <sys/time.h>.
- This gives "incomplete type" errors for ru_utime and tu_stime. */
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# endif
-# include <sys/resource.h>
-#endif
-
-#if HAVE_UCONTEXT_H
-# include <ucontext.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-#if DEBUG
-# include <stdio.h>
-#endif
-
-#include "c-stack.h"
-#include "exitfail.h"
-
-#if (HAVE_STRUCT_SIGACTION_SA_SIGACTION && defined SA_NODEFER \
- && defined SA_ONSTACK && defined SA_RESETHAND && defined SA_SIGINFO)
-# define SIGACTION_WORKS 1
-#else
-# define SIGACTION_WORKS 0
-#endif
-
-extern char *program_name;
-
-/* The user-specified action to take when a SEGV-related program error
- or stack overflow occurs. */
-static void (* volatile segv_action) (int);
-
-/* 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. */
-
-static void die (int) __attribute__ ((noreturn));
-static void
-die (int signo)
-{
- char const *message;
- segv_action (signo);
- 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);
- kill (getpid (), signo);
- abort ();
-}
-
-#if HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK
-
-/* 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
-
-/* 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;
- long l;
- void *p;
-} alternate_signal_stack;
-
-# if SIGACTION_WORKS
-
-/* Handle a segmentation violation and exit. This function is
- async-signal-safe. */
-
-static void segv_handler (int, siginfo_t *, void *) __attribute__((noreturn));
-static void
-segv_handler (int signo, siginfo_t *info,
- void *context __attribute__ ((unused)))
-{
- /* Clear SIGNO if it seems to have been a stack overflow. */
- if (0 < info->si_code)
- {
-# if ! HAVE_XSI_STACK_OVERFLOW_HEURISTIC
- /* We can't easily determine whether it is a stack overflow; so
- assume that the rest of our program is perfect (!) and that
- this segmentation violation is a stack overflow. */
- signo = 0;
-# else
- /* 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_base = 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_base;
- size_t page_size = sysconf (_SC_PAGESIZE);
- if (find_stack_direction (0) < 0)
- s += page_size;
- if (s < stack_size + page_size)
- signo = 0;
-
-# if DEBUG
- {
- char buf[1024];
- sprintf (buf,
- "segv_handler fault=%p base=%p size=%lx page=%lx signo=%d\n",
- faulting_address, stack_base, (unsigned long) stack_size,
- (unsigned long) page_size, signo);
- write (STDERR_FILENO, buf, strlen (buf));
- }
-# endif
-# endif
- }
-
- die (signo);
-}
-# endif
-
-static void
-null_action (int signo __attribute__ ((unused)))
-{
-}
-
-/* Set up ACTION so that it is invoked on C stack overflow. Return -1
- (setting errno) if this cannot be done.
-
- When ACTION is called, it is passed an argument equal to SIGSEGV
- for a segmentation violation that does not appear related to stack
- overflow, and is passed zero otherwise. On many platforms it is
- hard to tell; when in doubt, zero is passed.
-
- A null ACTION acts like an action that does nothing.
-
- ACTION must be async-signal-safe. ACTION together with its callees
- must not require more than SIGSTKSZ bytes of stack space. */
-
-int
-c_stack_action (void (*action) (int))
-{
- int r;
- stack_t st;
- 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;
-
- segv_action = action ? action : null_action;
- program_error_message = _("program error");
- stack_overflow_message = _("stack overflow");
-
- {
-# if SIGACTION_WORKS
- struct sigaction act;
- 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);
-# else
- return signal (SIGSEGV, die) == SIG_ERR ? -1 : 0;
-# endif
- }
-}
-
-#else /* ! (HAVE_SIGALTSTACK && HAVE_DECL_SIGALTSTACK) */
-
-int
-c_stack_action (void (*action) (int) __attribute__ ((unused)))
-{
- errno = ENOTSUP;
- return -1;
-}
-
-#endif
-
-
-
-#if DEBUG
-
-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 __attribute__ ((unused)), char **argv)
-{
- program_name = argv[0];
- fprintf (stderr,
- "The last output line should contain \"stack overflow\".\n");
- if (c_stack_action (0) == 0)
- return recurse ("\1");
- perror ("c_stack_action");
- return 1;
-}
-
-#endif /* DEBUG */
-
-/*
-Local Variables:
-compile-command: "gcc -DDEBUG -DHAVE_CONFIG_H -I.. -g -O -Wall -W c-stack.c"
-End:
-*/
Index: contrib/diff/lib/cmpbuf.h
===================================================================
--- contrib/diff/lib/cmpbuf.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* 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);
Index: contrib/diff/lib/cmpbuf.c
===================================================================
--- contrib/diff/lib/cmpbuf.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* 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;
-}
Index: contrib/diff/lib/dirname.h
===================================================================
--- contrib/diff/lib/dirname.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Take file names apart into directory and base names.
-
- Copyright (C) 1998, 2001, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef DIRNAME_H_
-# define DIRNAME_H_ 1
-
-# include <stddef.h>
-
-# 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 (char const *path);
-char *dir_name (char const *path);
-size_t base_len (char const *path);
-size_t dir_len (char const *path);
-
-int strip_trailing_slashes (char *path);
-
-#endif /* not DIRNAME_H_ */
Index: contrib/diff/lib/error.h
===================================================================
--- contrib/diff/lib/error.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Declaration for error-reporting function
- Copyright (C) 1995, 1996, 1997, 2003 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 _ERROR_H
-#define _ERROR_H 1
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-# define __attribute__(Spec) /* empty */
-# endif
-/* The __-protected variants of `format' and `printf' attributes
- are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-# define __format__ format
-# define __printf__ printf
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Print a message with `fprintf (stderr, FORMAT, ...)';
- if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
- If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
-
-extern void error (int __status, int __errnum, const char *__format, ...)
- __attribute__ ((__format__ (__printf__, 3, 4)));
-
-extern void error_at_line (int __status, int __errnum, const char *__fname,
- unsigned int __lineno, const char *__format, ...)
- __attribute__ ((__format__ (__printf__, 5, 6)));
-
-/* If NULL, error will flush stdout, then print on stderr the program
- name, a colon and a space. Otherwise, error will call this
- function without parameters instead. */
-extern void (*error_print_progname) (void);
-
-/* This variable is incremented each time `error' is called. */
-extern unsigned int error_message_count;
-
-/* Sometimes we want to have at most one error per line. This
- variable controls whether this mode is selected or not. */
-extern int error_one_per_line;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* error.h */
Index: contrib/diff/lib/error.c
===================================================================
--- contrib/diff/lib/error.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* Error handler for noninteractive utilities
- Copyright (C) 1990-1998, 2000-2002, 2003 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. */
-
-/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "error.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef _LIBC
-# include <libintl.h>
-#else
-# include "gettext.h"
-#endif
-
-#ifdef _LIBC
-# include <wchar.h>
-# define mbsrtowcs __mbsrtowcs
-#endif
-
-#if !_LIBC
-# include "unlocked-io.h"
-#endif
-
-#ifndef _
-# define _(String) String
-#endif
-
-/* If NULL, error will flush stdout, then print on stderr the program
- name, a colon and a space. Otherwise, error will call this
- function without parameters instead. */
-void (*error_print_progname) (void);
-
-/* This variable is incremented each time `error' is called. */
-unsigned int error_message_count;
-
-#ifdef _LIBC
-/* In the GNU C library, there is a predefined variable for this. */
-
-# define program_name program_invocation_name
-# include <errno.h>
-# include <libio/libioP.h>
-
-/* In GNU libc we want do not want to use the common name `error' directly.
- Instead make it a weak alias. */
-extern void __error (int status, int errnum, const char *message, ...)
- __attribute__ ((__format__ (__printf__, 3, 4)));
-extern void __error_at_line (int status, int errnum, const char *file_name,
- unsigned int line_number, const char *message,
- ...)
- __attribute__ ((__format__ (__printf__, 5, 6)));;
-# define error __error
-# define error_at_line __error_at_line
-
-# include <libio/iolibio.h>
-# define fflush(s) INTUSE(_IO_fflush) (s)
-# undef putc
-# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
-
-# include <bits/libc-lock.h>
-
-#else /* not _LIBC */
-
-# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
-# ifndef HAVE_DECL_STRERROR_R
-"this configure-time declaration test was not run"
-# endif
-char *strerror_r ();
-# endif
-
-# ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-# endif
-
-/* The calling program should define program_name and set it to the
- name of the executing program. */
-extern char *program_name;
-
-# if HAVE_STRERROR_R || defined strerror_r
-# define __strerror_r strerror_r
-# endif
-#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
- if (_IO_fwide (stderr, 0) > 0)
- {
- __fwprintf (stderr, L": %s", s);
- return;
- }
-#endif
-
- fprintf (stderr, ": %s", s);
-}
-
-static void
-error_tail (int status, int errnum, const char *message, va_list args)
-{
-#if _LIBC
- if (_IO_fwide (stderr, 0) > 0)
- {
-# define ALLOCA_LIMIT 2000
- size_t len = strlen (message) + 1;
- const wchar_t *wmessage = L"out of memory";
- wchar_t *wbuf = (len < ALLOCA_LIMIT
- ? alloca (len * sizeof *wbuf)
- : len <= SIZE_MAX / sizeof *wbuf
- ? malloc (len * sizeof *wbuf)
- : NULL);
-
- if (wbuf)
- {
- size_t res;
- mbstate_t st;
- const char *tmp = message;
- memset (&st, '\0', sizeof (st));
- res = mbsrtowcs (wbuf, &tmp, len, &st);
- wmessage = res == (size_t) -1 ? L"???" : wbuf;
- }
-
- __vfwprintf (stderr, wmessage, args);
- if (! (len < ALLOCA_LIMIT))
- free (wbuf);
- }
- else
-#endif
- vfprintf (stderr, message, args);
- va_end (args);
-
- ++error_message_count;
- if (errnum)
- print_errno_message (errnum);
-#if _LIBC
- if (_IO_fwide (stderr, 0) > 0)
- putwc (L'\n', stderr);
- else
-#endif
- putc ('\n', stderr);
- fflush (stderr);
- if (status)
- exit (status);
-}
-
-
-/* Print the program name and error message MESSAGE, which is a printf-style
- format string with optional args.
- If ERRNUM is nonzero, print its corresponding system error message.
- Exit with status STATUS if it is nonzero. */
-void
-error (int status, int errnum, const char *message, ...)
-{
- va_list args;
-
-#if defined _LIBC && defined __libc_ptf_call
- /* We do not want this call to be cut short by a thread
- cancellation. Therefore disable cancellation for now. */
- int state = PTHREAD_CANCEL_ENABLE;
- __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
- 0);
-#endif
-
- fflush (stdout);
-#ifdef _LIBC
- _IO_flockfile (stderr);
-#endif
- if (error_print_progname)
- (*error_print_progname) ();
- else
- {
-#if _LIBC
- if (_IO_fwide (stderr, 0) > 0)
- __fwprintf (stderr, L"%s: ", program_name);
- else
-#endif
- fprintf (stderr, "%s: ", program_name);
- }
-
- va_start (args, message);
- error_tail (status, errnum, message, args);
-
-#ifdef _LIBC
- _IO_funlockfile (stderr);
-# ifdef __libc_ptf_call
- __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
-# endif
-#endif
-}
-
-/* Sometimes we want to have at most one error per line. This
- variable controls whether this mode is selected or not. */
-int error_one_per_line;
-
-void
-error_at_line (int status, int errnum, const char *file_name,
- unsigned int line_number, const char *message, ...)
-{
- va_list args;
-
- if (error_one_per_line)
- {
- static const char *old_file_name;
- static unsigned int old_line_number;
-
- if (old_line_number == line_number
- && (file_name == old_file_name
- || strcmp (old_file_name, file_name) == 0))
- /* Simply return and print nothing. */
- return;
-
- old_file_name = file_name;
- old_line_number = line_number;
- }
-
-#if defined _LIBC && defined __libc_ptf_call
- /* We do not want this call to be cut short by a thread
- cancellation. Therefore disable cancellation for now. */
- int state = PTHREAD_CANCEL_ENABLE;
- __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
- 0);
-#endif
-
- fflush (stdout);
-#ifdef _LIBC
- _IO_flockfile (stderr);
-#endif
- if (error_print_progname)
- (*error_print_progname) ();
- else
- {
-#if _LIBC
- 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
- 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);
- }
-
- va_start (args, message);
- error_tail (status, errnum, message, args);
-
-#ifdef _LIBC
- _IO_funlockfile (stderr);
-# ifdef __libc_ptf_call
- __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
-# endif
-#endif
-}
-
-#ifdef _LIBC
-/* Make the weak alias. */
-# undef error
-# undef error_at_line
-weak_alias (__error, error)
-weak_alias (__error_at_line, error_at_line)
-#endif
Index: contrib/diff/lib/exclude.h
===================================================================
--- contrib/diff/lib/exclude.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* exclude.h -- declarations for excluding file names
-
- Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001, 2002, 2003 Free
- Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; 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> */
-
-/* Exclude options, which can be ORed with fnmatch options. */
-
-/* Patterns must match the start of file names, instead of matching
- anywhere after a '/'. */
-#define EXCLUDE_ANCHORED (1 << 30)
-
-/* Include instead of exclude. */
-#define EXCLUDE_INCLUDE (1 << 29)
-
-/* '?', '*', '[', and '\\' are special in patterns. Without this
- option, these characters are ordinary and fnmatch is not used. */
-#define EXCLUDE_WILDCARDS (1 << 28)
-
-struct exclude;
-
-struct exclude *new_exclude (void);
-void free_exclude (struct exclude *);
-void add_exclude (struct exclude *, char const *, int);
-int add_exclude_file (void (*) (struct exclude *, char const *, int),
- struct exclude *, char const *, int, char);
-bool excluded_filename (struct exclude const *, char const *);
Index: contrib/diff/lib/exclude.c
===================================================================
--- contrib/diff/lib/exclude.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* exclude.c -- exclude file names
-
- Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003 Free
- Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; 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 <stdbool.h>
-
-#include <ctype.h>
-#include <errno.h>
-#ifndef errno
-extern int errno;
-#endif
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "exclude.h"
-#include "fnmatch.h"
-#include "unlocked-io.h"
-#include "xalloc.h"
-
-#if STDC_HEADERS || (! defined isascii && ! HAVE_ISASCII)
-# define IN_CTYPE_DOMAIN(c) true
-#else
-# define IN_CTYPE_DOMAIN(c) isascii (c)
-#endif
-
-static inline bool
-is_space (unsigned char c)
-{
- return IN_CTYPE_DOMAIN (c) && isspace (c);
-}
-
-/* Verify a requirement at compile-time (unlike assert, which is runtime). */
-#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
-
-/* Non-GNU systems lack these options, so we don't need to check them. */
-#ifndef FNM_CASEFOLD
-# define FNM_CASEFOLD 0
-#endif
-#ifndef FNM_LEADING_DIR
-# define FNM_LEADING_DIR 0
-#endif
-
-verify (EXCLUDE_macros_do_not_collide_with_FNM_macros,
- (((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
- & (FNM_PATHNAME | 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)
-{
- return xzalloc (sizeof *new_exclude ());
-}
-
-/* Free the storage associated with an exclude list. */
-
-void
-free_exclude (struct exclude *ex)
-{
- free (ex->exclude);
- free (ex);
-}
-
-/* Return zero if PATTERN matches F, obeying OPTIONS, except that
- (unlike fnmatch) wildcards are disabled in PATTERN. */
-
-static int
-fnmatch_no_wildcards (char const *pattern, char const *f, int options)
-{
- if (! (options & FNM_LEADING_DIR))
- return ((options & FNM_CASEFOLD)
- ? 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) (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_count == ex->exclude_alloc)
- ex->exclude = x2nrealloc (ex->exclude, &ex->exclude_alloc,
- sizeof *ex->exclude);
-
- patopts = &ex->exclude[ex->exclude_count++];
- patopts->pattern = pattern;
- patopts->options = options;
-}
-
-/* Use ADD_FUNC to append to EX the patterns in FILENAME, each with
- OPTIONS. LINE_END terminates each pattern in the file. If
- LINE_END is a space character, ignore trailing spaces and empty
- lines in FILE. Return -1 on failure, 0 on success. */
-
-int
-add_exclude_file (void (*add_func) (struct exclude *, char const *, int),
- struct exclude *ex, char const *filename, int options,
- char line_end)
-{
- bool use_stdin = filename[0] == '-' && !filename[1];
- FILE *in;
- char *buf = NULL;
- char *p;
- char const *pattern;
- char const *lim;
- size_t buf_alloc = 0;
- size_t buf_count = 0;
- int c;
- int e = 0;
-
- if (use_stdin)
- in = stdin;
- else if (! (in = fopen (filename, "r")))
- return -1;
-
- while ((c = getc (in)) != EOF)
- {
- if (buf_count == buf_alloc)
- buf = x2realloc (buf, &buf_alloc);
- buf[buf_count++] = c;
- }
-
- if (ferror (in))
- e = errno;
-
- if (!use_stdin && fclose (in) != 0)
- e = errno;
-
- buf = xrealloc (buf, buf_count + 1);
- buf[buf_count] = line_end;
- lim = buf + buf_count + ! (buf_count == 0 || buf[buf_count - 1] == line_end);
- pattern = buf;
-
- for (p = buf; p < lim; p++)
- if (*p == line_end)
- {
- char *pattern_end = p;
-
- if (is_space (line_end))
- {
- for (; ; pattern_end--)
- if (pattern_end == pattern)
- goto next_pattern;
- else if (! is_space (pattern_end[-1]))
- break;
- }
-
- *pattern_end = '\0';
- (*add_func) (ex, pattern, options);
-
- next_pattern:
- pattern = p + 1;
- }
-
- errno = e;
- return e ? -1 : 0;
-}
Index: contrib/diff/lib/exit.h
===================================================================
--- contrib/diff/lib/exit.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* exit() function.
- Copyright (C) 1995, 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 _EXIT_H
-#define _EXIT_H
-
-/* Get exit() declaration. */
-#include <stdlib.h>
-
-/* Some systems do not define EXIT_*, even with STDC_HEADERS. */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#endif /* _EXIT_H */
Index: contrib/diff/lib/exitfail.h
===================================================================
--- contrib/diff/lib/exitfail.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* 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;
Index: contrib/diff/lib/exitfail.c
===================================================================
--- contrib/diff/lib/exitfail.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Failure exit status
-
- Copyright (C) 2002, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; 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 "exitfail.h"
-#include "exit.h"
-
-int volatile exit_failure = EXIT_FAILURE;
Index: contrib/diff/lib/file-type.h
===================================================================
--- contrib/diff/lib/file-type.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Return a string describing the type of a file.
-
- Copyright (C) 1993, 1994, 2001, 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Paul Eggert and Jim Meyering. */
-
-#ifndef FILE_TYPE_H
-# define FILE_TYPE_H 1
-
-# if ! defined S_ISREG && ! defined S_IFREG
-you must include <sys/stat.h> before including this file
-# endif
-
-char const *file_type (struct stat const *);
-
-# ifndef S_IFMT
-# define S_IFMT 0170000
-# endif
-
-# if STAT_MACROS_BROKEN
-# undef S_ISBLK
-# undef S_ISCHR
-# undef S_ISDIR
-# undef S_ISDOOR
-# undef S_ISFIFO
-# undef S_ISLNK
-# undef S_ISNAM
-# undef S_ISMPB
-# undef S_ISMPC
-# undef S_ISNWK
-# undef S_ISREG
-# undef S_ISSOCK
-# endif
-
-
-# ifndef S_ISBLK
-# ifdef S_IFBLK
-# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
-# else
-# define S_ISBLK(m) 0
-# endif
-# endif
-
-# ifndef S_ISCHR
-# ifdef S_IFCHR
-# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
-# else
-# define S_ISCHR(m) 0
-# endif
-# endif
-
-# ifndef S_ISDIR
-# ifdef S_IFDIR
-# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-# else
-# define S_ISDIR(m) 0
-# endif
-# endif
-
-# ifndef S_ISDOOR /* Solaris 2.5 and up */
-# ifdef S_IFDOOR
-# define S_ISDOOR(m) (((m) & S_IFMT) == S_IFDOOR)
-# else
-# define S_ISDOOR(m) 0
-# endif
-# endif
-
-# ifndef S_ISFIFO
-# ifdef S_IFIFO
-# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
-# else
-# define S_ISFIFO(m) 0
-# endif
-# endif
-
-# ifndef S_ISLNK
-# ifdef S_IFLNK
-# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
-# else
-# define S_ISLNK(m) 0
-# endif
-# endif
-
-# ifndef S_ISMPB /* V7 */
-# ifdef S_IFMPB
-# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
-# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
-# else
-# define S_ISMPB(m) 0
-# define S_ISMPC(m) 0
-# endif
-# endif
-
-# ifndef S_ISNAM /* Xenix */
-# ifdef S_IFNAM
-# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
-# else
-# define S_ISNAM(m) 0
-# endif
-# endif
-
-# ifndef S_ISNWK /* HP/UX */
-# ifdef S_IFNWK
-# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
-# else
-# define S_ISNWK(m) 0
-# endif
-# endif
-
-# ifndef S_ISREG
-# ifdef S_IFREG
-# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
-# else
-# define S_ISREG(m) 0
-# endif
-# endif
-
-# ifndef S_ISSOCK
-# ifdef S_IFSOCK
-# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
-# else
-# define S_ISSOCK(m) 0
-# endif
-# endif
-
-
-# ifndef S_TYPEISMQ
-# define S_TYPEISMQ(p) 0
-# endif
-
-# ifndef S_TYPEISTMO
-# define S_TYPEISTMO(p) 0
-# endif
-
-
-# ifndef S_TYPEISSEM
-# ifdef S_INSEM
-# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
-# else
-# define S_TYPEISSEM(p) 0
-# endif
-# endif
-
-# ifndef S_TYPEISSHM
-# ifdef S_INSHD
-# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
-# else
-# define S_TYPEISSHM(p) 0
-# endif
-# endif
-
-#endif /* FILE_TYPE_H */
Index: contrib/diff/lib/file-type.c
===================================================================
--- contrib/diff/lib/file-type.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Return a string describing the type of a file.
-
- Copyright (C) 1993, 1994, 2001, 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Paul Eggert. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "file-type.h"
-
-#include <gettext.h>
-#define _(text) gettext (text)
-
-char const *
-file_type (struct stat const *st)
-{
- /* See POSIX 1003.1-2001 XCU Table 4-8 lines 17093-17107 for some of
- 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");
-
- if (S_ISBLK (st->st_mode))
- return _("block special file");
-
- if (S_ISCHR (st->st_mode))
- return _("character special file");
-
- if (S_ISFIFO (st->st_mode))
- return _("fifo");
-
- if (S_ISLNK (st->st_mode))
- return _("symbolic link");
-
- if (S_ISSOCK (st->st_mode))
- return _("socket");
-
- if (S_TYPEISMQ (st))
- return _("message queue");
-
- if (S_TYPEISSEM (st))
- return _("semaphore");
-
- if (S_TYPEISSHM (st))
- return _("shared memory object");
-
- if (S_TYPEISTMO (st))
- return _("typed memory object");
-
- return _("weird file");
-}
Index: contrib/diff/lib/getopt.h
===================================================================
--- contrib/diff/lib/getopt.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Declarations for getopt.
- Copyright (C) 1989-1994,1996-1999,2001,2003,2004
- Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation,
- Inc., 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
-
-#ifndef __THROW
-# ifndef __GNUC_PREREQ
-# define __GNUC_PREREQ(maj, min) (0)
-# endif
-# if defined __cplusplus && __GNUC_PREREQ (2,8)
-# define __THROW throw ()
-# else
-# define __THROW
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* For communication from `getopt' to the caller.
- When `getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when `ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
-
-extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to `getopt'.
-
- On entry to `getopt', zero means this is the first call; initialize.
-
- When `getopt' returns -1, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, `optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-extern int optind;
-
-/* Callers store zero here to inhibit the error message `getopt' prints
- for unrecognized options. */
-
-extern int opterr;
-
-/* Set to an option character which was unrecognized. */
-
-extern int optopt;
-
-#ifndef __need_getopt
-/* Describe the long-named options requested by the application.
- The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
- of `struct option' terminated by an element containing a name which is
- zero.
-
- The field `has_arg' is:
- no_argument (or 0) if the option does not take an argument,
- required_argument (or 1) if the option requires an argument,
- optional_argument (or 2) if the option takes an optional argument.
-
- If the field `flag' is not NULL, it points to a variable that is set
- to the value given in the field `val' when the option is found, but
- left unchanged if the option is not found.
-
- To have a long-named option do something other than set an `int' to
- a compiled-in constant, such as set a value from `optarg', set the
- option's `flag' field to zero and its `val' field to a nonzero
- value (the equivalent single-letter option character, if there is
- one). For long options that have a zero `flag' field, `getopt'
- returns the contents of the `val' field. */
-
-struct option
-{
- const char *name;
- /* has_arg can't be an enum because some compilers complain about
- type mismatches in all the code that assumes it is an int. */
- int has_arg;
- int *flag;
- int val;
-};
-
-/* Names for the values of the `has_arg' field of `struct option'. */
-
-# define no_argument 0
-# define required_argument 1
-# define optional_argument 2
-#endif /* need getopt */
-
-
-/* Get definitions and prototypes for functions to process the
- arguments in ARGV (ARGC of them, minus the program name) for
- options given in OPTS.
-
- Return the option character from OPTS just read. Return -1 when
- there are no more options. For unrecognized options, or options
- missing arguments, `optopt' is set to the option letter, and '?' is
- returned.
-
- The OPTS string is a list of characters which are recognized option
- letters, optionally followed by colons, specifying that that letter
- takes an argument, to be placed in `optarg'.
-
- If a letter in OPTS is followed by two colons, its argument is
- optional. This behavior is specific to the GNU `getopt'.
-
- The argument `--' causes premature termination of argument
- scanning, explicitly telling `getopt' that there are no more
- options.
-
- If OPTS begins with `--', then non-option arguments are treated as
- arguments to the option '\0'. This behavior is specific to the GNU
- `getopt'. */
-
-#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)
- __THROW;
-#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)
- __THROW;
-extern int getopt_long_only (int ___argc, char *const *___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind)
- __THROW;
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-/* Make sure we later can get all the definitions and declarations. */
-#undef __need_getopt
-
-#endif /* getopt.h */
Index: contrib/diff/lib/gettext.h
===================================================================
--- contrib/diff/lib/gettext.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* 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 General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You 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 _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
-
-/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
- chokes if dcgettext is defined as a macro. So include it now, to make
- later inclusions of <locale.h> a NOP. We don't include <libintl.h>
- as well because people using "gettext.h" will not include <libintl.h>,
- and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
- is OK. */
-#if defined(__sun)
-# include <locale.h>
-#endif
-
-/* 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 */
Index: contrib/diff/lib/gnulib.mk
===================================================================
--- contrib/diff/lib/gnulib.mk
+++ /dev/null
@@ -1,90 +0,0 @@
-# This file is generated automatically by "bootstrap".
-BUILT_SOURCES += $(ALLOCA_H)
-EXTRA_DIST += alloca_.h
-
-# We need the following in order to create an <alloca.h> when the system
-# doesn't have one that works with the given compiler.
-all-local $(lib_OBJECTS): $(ALLOCA_H)
-alloca.h: alloca_.h
- cp $(srcdir)/alloca_.h $@-t
- mv $@-t $@
-MOSTLYCLEANFILES += alloca.h alloca.h-t
-
-lib_SOURCES += c-stack.h c-stack.c
-
-lib_SOURCES += dirname.h dirname.c basename.c stripslash.c
-
-
-lib_SOURCES += exclude.h exclude.c
-
-lib_SOURCES += exit.h
-
-lib_SOURCES += exitfail.h exitfail.c
-
-
-lib_SOURCES += file-type.h file-type.c
-
-BUILT_SOURCES += $(FNMATCH_H)
-EXTRA_DIST += fnmatch_.h fnmatch_loop.c
-
-# We need the following in order to create an <fnmatch.h> when the system
-# doesn't have one that supports the required API.
-all-local $(lib_OBJECTS): $(FNMATCH_H)
-fnmatch.h: fnmatch_.h
- cp $(srcdir)/fnmatch_.h $@-t
- mv $@-t $@
-MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t
-
-
-lib_SOURCES += getopt.h getopt.c getopt1.c getopt_int.h
-
-lib_SOURCES += gettext.h
-
-
-lib_SOURCES += hard-locale.h hard-locale.c
-
-EXTRA_DIST += inttostr.c
-lib_SOURCES += imaxtostr.c inttostr.h offtostr.c umaxtostr.c
-
-
-
-lib_SOURCES += posixver.h posixver.c
-
-
-lib_SOURCES += regex.h
-
-
-BUILT_SOURCES += $(STDBOOL_H)
-EXTRA_DIST += stdbool_.h
-
-# We need the following in order to create an <stdbool.h> when the system
-# doesn't have one that works.
-all-local $(lib_OBJECTS): $(STDBOOL_H)
-stdbool.h: stdbool_.h
- sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t
- mv $@-t $@
-MOSTLYCLEANFILES += stdbool.h stdbool.h-t
-
-lib_SOURCES += strcase.h
-
-lib_SOURCES += strftime.c
-
-
-
-
-
-
-
-lib_SOURCES += time_r.h
-
-
-lib_SOURCES += unlocked-io.h
-
-lib_SOURCES += version-etc.h version-etc.c
-
-lib_SOURCES += xalloc.h xmalloc.c xstrdup.c
-
-lib_SOURCES += xstrtol.h xstrtol.c xstrtoul.c
-
-lib_SOURCES += xstrtoumax.c
-
Index: contrib/diff/lib/hard-locale.h
===================================================================
--- contrib/diff/lib/hard-locale.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Determine whether a locale is hard.
-
- Copyright (C) 1999, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef HARD_LOCALE_H_
-# define HARD_LOCALE_H_ 1
-
-int hard_locale (int);
-
-#endif /* HARD_LOCALE_H_ */
Index: contrib/diff/lib/hard-locale.c
===================================================================
--- contrib/diff/lib/hard-locale.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* hard-locale.c -- Determine whether a locale is hard.
-
- Copyright (C) 1997, 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "hard-locale.h"
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#endif
-
-#include <stdlib.h>
-#include <string.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
-}
Index: contrib/diff/lib/inttostr.h
===================================================================
--- contrib/diff/lib/inttostr.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* inttostr.h -- convert integers to printable strings
-
- Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 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_STDINT_H
-# include <stdint.h>
-#endif
-
-#include <limits.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-/* 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 - 1) * 302 / 1000 + 2)
-
-#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
-
-char *offtostr (off_t, char *);
-char *imaxtostr (intmax_t, char *);
-char *umaxtostr (uintmax_t, char *);
Index: contrib/diff/lib/posixver.h
===================================================================
--- contrib/diff/lib/posixver.h
+++ /dev/null
@@ -1 +0,0 @@
-int posix2_version (void);
Index: contrib/diff/lib/posixver.c
===================================================================
--- contrib/diff/lib/posixver.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Which POSIX version to conform to, for utilities.
-
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Paul Eggert. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "posixver.h"
-
-#include <limits.h>
-#include <stdlib.h>
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#ifndef _POSIX2_VERSION
-# define _POSIX2_VERSION 0
-#endif
-
-#ifndef DEFAULT_POSIX2_VERSION
-# define DEFAULT_POSIX2_VERSION _POSIX2_VERSION
-#endif
-
-/* The POSIX version that utilities should conform to. The default is
- specified by the system. */
-
-int
-posix2_version (void)
-{
- long int v = DEFAULT_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;
-}
Index: contrib/diff/lib/prepargs.h
===================================================================
--- contrib/diff/lib/prepargs.h
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Parse arguments from a string and prepend them to an argv. */
-
-void prepend_default_options (char const *, int *, char ***);
Index: contrib/diff/lib/prepargs.c
===================================================================
--- contrib/diff/lib/prepargs.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* 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;
- }
-}
Index: contrib/diff/lib/quotesys.h
===================================================================
--- contrib/diff/lib/quotesys.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* 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 *));
Index: contrib/diff/lib/quotesys.c
===================================================================
--- contrib/diff/lib/quotesys.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* 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++;
- }
-}
Index: contrib/diff/lib/setmode.h
===================================================================
--- contrib/diff/lib/setmode.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Set a file descriptor's mode to binary or to text.
-
- Copyright (C) 2001, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING.
- If not, write to the Free Software Foundation,
- 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) true
-# endif
-#endif
Index: contrib/diff/lib/strcase.h
===================================================================
--- contrib/diff/lib/strcase.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Case-insensitive string comparison functions.
- Copyright (C) 1995-1996, 2001, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef _STRCASE_H
-#define _STRCASE_H
-
-#include <stddef.h>
-
-/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
- greater than zero if S1 is lexicographically less than, equal to or greater
- than S2.
- Note: This function does not work correctly in multibyte locales. */
-extern int strcasecmp (const char *s1, const char *s2);
-
-/* 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.
- Note: This function can not work correctly in multibyte locales. */
-extern int strncasecmp (const char *s1, const char *s2, size_t n);
-
-#endif /* _STRCASE_H */
Index: contrib/diff/lib/strftime.c
===================================================================
--- contrib/diff/lib/strftime.c
+++ /dev/null
@@ -1,1330 +0,0 @@
-/* Copyright (C) 1991-1999, 2000, 2001, 2003 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. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifdef _LIBC
-# 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
-# include "../locale/localeinfo.h"
-#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
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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
-
-# define MEMCPY(d, s, n) memcpy (d, s, n)
-# 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
-
-#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 tzname __tzname
-# define tzset __tzset
-#endif
-
-#if !HAVE_TM_GMTOFF
-/* Portable standalone applications should supply a "time_r.h" that
- declares a POSIX-compliant localtime_r, for the benefit of older
- implementations that lack localtime_r or have a nonstandard one.
- See the gnulib time_r module for one way to implement this. */
-# include "time_r.h"
-# undef __gmtime_r
-# undef __localtime_r
-# define __gmtime_r gmtime_r
-# define __localtime_r localtime_r
-#endif
-
-
-#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
-
-#define add(n, f) \
- do \
- { \
- int _n = (n); \
- int _delta = width - _n; \
- int _incr = _n + (_delta > 0 ? _delta : 0); \
- if ((size_t) _incr >= maxsize - i) \
- 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 LOCALE_ARG); \
- else if (to_uppcase) \
- memcpy_uppcase (p, (s), _n LOCALE_ARG); \
- else \
- MEMCPY ((void *) p, (void const *) (s), _n))
-
-#ifdef COMPILE_WIDE
-# ifndef USE_IN_EXTENDED_LOCALE_MODEL
-# undef __mbsrtowcs_l
-# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
-# endif
-# define widen(os, ws, l) \
- { \
- mbstate_t __st; \
- const char *__s = os; \
- memset (&__st, '\0', sizeof (__st)); \
- l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \
- ws = (wchar_t *) alloca ((l + 1) * sizeof (wchar_t)); \
- (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \
- }
-#endif
-
-
-#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
-/* We use this code also for the extended locale handling where the
- function gets as an additional argument the locale which has to be
- used. To access the values we have to redefine the _NL_CURRENT
- macro. */
-# define strftime __strftime_l
-# define wcsftime __wcsftime_l
-# undef _NL_CURRENT
-# define _NL_CURRENT(category, item) \
- (current->values[_NL_ITEM_INDEX (item)].string)
-# define LOCALE_ARG , loc
-# define LOCALE_PARAM_PROTO , __locale_t loc
-# define HELPER_LOCALE_ARG , current
-#else
-# define LOCALE_PARAM_PROTO
-# define LOCALE_ARG
-# ifdef _LIBC
-# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
-# else
-# define HELPER_LOCALE_ARG
-# endif
-#endif
-
-#ifdef COMPILE_WIDE
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define TOUPPER(Ch, L) __towupper_l (Ch, L)
-# define TOLOWER(Ch, L) __towlower_l (Ch, L)
-# else
-# define TOUPPER(Ch, L) towupper (Ch)
-# define TOLOWER(Ch, L) towlower (Ch)
-# endif
-#else
-# ifdef _LIBC
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define TOUPPER(Ch, L) __toupper_l (Ch, L)
-# define TOLOWER(Ch, L) __tolower_l (Ch, L)
-# else
-# define TOUPPER(Ch, L) toupper (Ch)
-# define TOLOWER(Ch, L) tolower (Ch)
-# endif
-# else
-# define TOUPPER(Ch, L) (islower (Ch) ? toupper (Ch) : (Ch))
-# define TOLOWER(Ch, L) (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 (CHAR_T *dest, const CHAR_T *src,
- size_t len LOCALE_PARAM_PROTO)
-{
- while (len-- > 0)
- dest[len] = TOLOWER ((UCHAR_T) src[len], loc);
- return dest;
-}
-
-static CHAR_T *
-memcpy_uppcase (CHAR_T *dest, const CHAR_T *src,
- size_t len LOCALE_PARAM_PROTO)
-{
- while (len-- > 0)
- dest[len] = TOUPPER ((UCHAR_T) src[len], loc);
- 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 (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)
-#ifdef __GNUC__
-__inline__
-#endif
-static int
-iso_week_days (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
-#else
-# ifdef COMPILE_WIDE
-# define my_strftime wcsftime
-# define nl_get_alt_digit _nl_get_walt_digit
-# else
-# define my_strftime strftime
-# define nl_get_alt_digit _nl_get_alt_digit
-# endif
-# define extra_args
-# define extra_args_spec
-/* We don't have this information in general. */
-# define ut 0
-# define ns 0
-#endif
-
-#if ! defined _LIBC && ! HAVE_RUN_TZSET_TEST
-/* Solaris 2.5.x and 2.6 tzset sometimes modify the storage returned
- by localtime. On such systems, we must use the tzset and localtime
- wrappers to work around the bug. */
-"you must run the autoconf test for a working tzset function"
-#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 (CHAR_T *s, size_t maxsize, const CHAR_T *format,
- const struct tm *tp extra_args_spec LOCALE_PARAM_PROTO)
-{
-#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
- struct locale_data *const current = loc->__locales[LC_TIME];
-#endif
-
- 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 requires that local time zone information be used as
- though strftime called tzset. */
-# 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
- {
- if (width > INT_MAX / 10
- || (width == INT_MAX / 10 && *f - L_('0') > INT_MAX % 10))
- /* Avoid overflow. */
- width = INT_MAX;
- else
- {
- 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 = d > width ? d : width; \
- number_value = v; goto do_number
-#define DO_NUMBER_SPACEPAD(d, v) \
- digits = d > width ? 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'):
- 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 LOCALE_ARG);
- add (len, my_strftime (p, maxsize - i, subfmt,
- tp extra_args LOCALE_ARG));
-
- if (to_uppcase)
- while (old_start < p)
- {
- *old_start = TOUPPER ((UCHAR_T) *old_start, loc);
- ++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'):
- 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 HELPER_LOCALE_ARG);
- 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'):
- 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'):
- 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 overridden by `0' or `-' flag. */
- if (pad != L_('0') && pad != L_('-'))
- 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. */
- const CHAR_T *cp = nl_get_alt_digit (number_value
- HELPER_LOCALE_ARG);
-
- 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 (padding > 0)
- {
- if (pad == L_('_'))
- {
- if ((size_t) padding >= maxsize - i)
- return 0;
-
- if (p)
- memset_space (p, padding);
- i += padding;
- width = width > padding ? width - padding : 0;
- }
- else
- {
- if ((size_t) digits >= maxsize - i)
- return 0;
-
- if (negative_number)
- {
- ++bufp;
-
- if (p)
- *p++ = L_('-');
- ++i;
- }
-
- if (p)
- memset_zero (p, padding);
- i += padding;
- width = 0;
- }
- }
- }
-
- 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);
-
-#ifndef _LIBC
- 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);
-#endif
-
- case L_('n'):
- 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'):
- subfmt = L_("%H:%M");
- goto subformat;
-
- case L_('r'):
-#if !defined _NL_CURRENT && HAVE_STRFTIME
- goto underlying_strftime;
-#else
-# 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;
-#endif
-
- 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 (&ltm);
-
- /* 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'):
- subfmt = L_("%H:%M:%S");
- goto subformat;
-
- case L_('t'):
- add (1, *p = L_('\t'));
- break;
-
- case L_('u'):
- 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'):
- case L_('G'):
- 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 HELPER_LOCALE_ARG);
- 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 HELPER_LOCALE_ARG);
- 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 = "";
-
-#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'):
- 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 (&ltm);
-
- 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 (! __localtime_r (&lt, &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 (! __gmtime_r (&lt, &gtm))
- break;
-
- diff = tm_diff (&ltm, &gtm);
- }
-#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 _LIBC
-libc_hidden_def (my_strftime)
-#endif
-
-
-#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 (char *s, size_t maxsize, const char *format,
- const struct tm *tp, int ut)
-{
- return my_strftime (s, maxsize, format, tp, ut, 0);
-}
-#endif
Index: contrib/diff/lib/strtoimax.c
===================================================================
--- contrib/diff/lib/strtoimax.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Convert string representation of a number into an intmax_t value.
- Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 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>
-#elif HAVE_STDINT_H
-# include <stdint.h>
-#endif
-
-#include <stdlib.h>
-
-/* 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_STRTOULL
-"this configure-time declaration test was not run"
-# endif
-# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG
-unsigned long long strtoull (char const *, char **, int);
-# endif
-
-#else
-
-# ifndef HAVE_DECL_STRTOLL
-"this configure-time declaration test was not run"
-# endif
-# if !HAVE_DECL_STRTOLL && HAVE_UNSIGNED_LONG_LONG
-long long strtoll (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);
-}
Index: contrib/diff/lib/strtoumax.c
===================================================================
--- contrib/diff/lib/strtoumax.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define UNSIGNED 1
-#include "strtoimax.c"
Index: contrib/diff/lib/unlocked-io.h
===================================================================
--- contrib/diff/lib/unlocked-io.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* Prefer faster, non-thread-safe stdio functions if available.
-
- Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Jim Meyering. */
-
-#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 the GNU C library, and
- from other C libraries supporting POSIX's optional thread-safe functions.
-
- The standard I/O functions are thread-safe. These *_unlocked ones are
- more efficient but not thread-safe. That they're not thread-safe is
- fine since all of the applications in this package are single threaded.
-
- Also, some code that is shared with the GNU C library may invoke
- the *_unlocked functions directly. On hosts that lack those
- functions, invoke the non-thread-safe versions instead. */
-
-# include <stdio.h>
-
-# if HAVE_DECL_CLEARERR_UNLOCKED
-# undef clearerr
-# define clearerr(x) clearerr_unlocked (x)
-# else
-# define clearerr_unlocked(x) clearerr (x)
-# endif
-# if HAVE_DECL_FEOF_UNLOCKED
-# undef feof
-# define feof(x) feof_unlocked (x)
-# else
-# define feof_unlocked(x) feof (x)
-# endif
-# if HAVE_DECL_FERROR_UNLOCKED
-# undef ferror
-# define ferror(x) ferror_unlocked (x)
-# else
-# define ferror_unlocked(x) ferror (x)
-# endif
-# if HAVE_DECL_FFLUSH_UNLOCKED
-# undef fflush
-# define fflush(x) fflush_unlocked (x)
-# else
-# define fflush_unlocked(x) fflush (x)
-# endif
-# if HAVE_DECL_FGETS_UNLOCKED
-# undef fgets
-# define fgets(x,y,z) fgets_unlocked (x,y,z)
-# else
-# define fgets_unlocked(x,y,z) fgets (x,y,z)
-# endif
-# if HAVE_DECL_FPUTC_UNLOCKED
-# undef fputc
-# define fputc(x,y) fputc_unlocked (x,y)
-# else
-# define fputc_unlocked(x,y) fputc (x,y)
-# endif
-# if HAVE_DECL_FPUTS_UNLOCKED
-# undef fputs
-# define fputs(x,y) fputs_unlocked (x,y)
-# else
-# define fputs_unlocked(x,y) fputs (x,y)
-# endif
-# if HAVE_DECL_FREAD_UNLOCKED
-# undef fread
-# define fread(w,x,y,z) fread_unlocked (w,x,y,z)
-# else
-# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
-# endif
-# if HAVE_DECL_FWRITE_UNLOCKED
-# undef fwrite
-# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
-# else
-# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
-# endif
-# if HAVE_DECL_GETC_UNLOCKED
-# undef getc
-# define getc(x) getc_unlocked (x)
-# else
-# define getc_unlocked(x) getc (x)
-# endif
-# if HAVE_DECL_GETCHAR_UNLOCKED
-# undef getchar
-# define getchar() getchar_unlocked ()
-# else
-# define getchar_unlocked() getchar ()
-# endif
-# if HAVE_DECL_PUTC_UNLOCKED
-# undef putc
-# define putc(x,y) putc_unlocked (x,y)
-# else
-# define putc_unlocked(x,y) putc (x,y)
-# endif
-# if HAVE_DECL_PUTCHAR_UNLOCKED
-# undef putchar
-# define putchar(x) putchar_unlocked (x)
-# else
-# define putchar_unlocked(x) putchar (x)
-# endif
-
-# undef flockfile
-# define flockfile(x) ((void) 0)
-
-# undef ftrylockfile
-# define ftrylockfile(x) 0
-
-# undef funlockfile
-# define funlockfile(x) ((void) 0)
-
-# endif /* USE_UNLOCKED_IO */
-#endif /* UNLOCKED_IO_H */
Index: contrib/diff/lib/version-etc.h
===================================================================
--- contrib/diff/lib/version-etc.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Utility to help print --version output in a consistent format.
- Copyright (C) 1999, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Jim Meyering. */
-
-#ifndef VERSION_ETC_H
-# define VERSION_ETC_H 1
-
-# include <stdarg.h>
-# include <stdio.h>
-
-extern const char *version_etc_copyright;
-
-extern void version_etc_va (FILE *stream,
- const char *command_name, const char *package,
- const char *version, va_list authors);
-
-extern void version_etc (FILE *stream,
- const char *command_name, const char *package,
- const char *version,
- /* const char *author1, ...*/ ...);
-
-#endif /* VERSION_ETC_H */
Index: contrib/diff/lib/version-etc.c
===================================================================
--- contrib/diff/lib/version-etc.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Utility to help print --version output in a consistent format.
- Copyright (C) 1999-2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-/* Written by Jim Meyering. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification. */
-#include "version-etc.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "unlocked-io.h"
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
-/* Default copyright goes to the FSF. */
-
-const char* version_etc_copyright =
- /* Do *not* mark this string for translation. */
- "Copyright (C) 2004 Free Software Foundation, Inc.";
-
-
-/* Like version_etc, below, but with the NULL-terminated author list
- provided via a variable of type va_list. */
-void
-version_etc_va (FILE *stream,
- const char *command_name, const char *package,
- const char *version, va_list authors)
-{
- unsigned int n_authors;
-
- /* Count the number of authors. */
- {
- va_list tmp_authors;
-
-#ifdef __va_copy
- __va_copy (tmp_authors, authors);
-#else
- tmp_authors = authors;
-#endif
-
- n_authors = 0;
- while (va_arg (tmp_authors, const char *) != NULL)
- ++n_authors;
- }
-
- if (command_name)
- fprintf (stream, "%s (%s) %s\n", command_name, package, version);
- else
- fprintf (stream, "%s %s\n", package, version);
-
- switch (n_authors)
- {
- case 0:
- /* The caller must provide at least one author name. */
- abort ();
- case 1:
- /* TRANSLATORS: %s denotes an author name. */
- vfprintf (stream, _("Written by %s.\n"), authors);
- break;
- case 2:
- /* TRANSLATORS: Each %s denotes an author name. */
- vfprintf (stream, _("Written by %s and %s.\n"), authors);
- break;
- case 3:
- /* TRANSLATORS: Each %s denotes an author name. */
- vfprintf (stream, _("Written by %s, %s, and %s.\n"), authors);
- break;
- case 4:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors);
- break;
- case 5:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors);
- break;
- case 6:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"),
- authors);
- break;
- case 7:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"),
- authors);
- break;
- case 8:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("\
-Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"),
- authors);
- break;
- case 9:
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("\
-Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"),
- authors);
- break;
- default:
- /* 10 or more authors. Use an abbreviation, since the human reader
- will probably not want to read the entire list anyway. */
- /* TRANSLATORS: Each %s denotes an author name.
- You can use line breaks, estimating that each author name occupies
- ca. 16 screen columns and that a screen line has ca. 80 columns. */
- vfprintf (stream, _("\
-Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"),
- authors);
- break;
- }
- va_end (authors);
- putc ('\n', stream);
-
- fputs (version_etc_copyright, stream);
- putc ('\n', stream);
-
- fputs (_("\
-This is free software; see the source for copying conditions. There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"),
- stream);
-}
-
-
-/* Display the --version information the standard way.
-
- If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of
- the program. The formats are therefore:
-
- PACKAGE VERSION
-
- or
-
- COMMAND_NAME (PACKAGE) VERSION.
-
- The author names are passed as separate arguments, with an additional
- NULL argument at the end. */
-void
-version_etc (FILE *stream,
- const char *command_name, const char *package,
- const char *version, /* const char *author1, ...*/ ...)
-{
- va_list authors;
-
- va_start (authors, version);
- version_etc_va (stream, command_name, package, version, authors);
-}
Index: contrib/diff/lib/xalloc.h
===================================================================
--- contrib/diff/lib/xalloc.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* xalloc.h -- malloc with out-of-memory checking
-
- Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef XALLOC_H_
-# define XALLOC_H_
-
-# include <stddef.h>
-
-# 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) (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 two previous items. It exits with status
- exit_failure (defined in exitfail.h). This is the
- function to call when one wants the program to die because of a
- memory allocation failure. */
-extern void xalloc_die (void) ATTRIBUTE_NORETURN;
-
-void *xmalloc (size_t s);
-void *xnmalloc (size_t n, size_t s);
-void *xzalloc (size_t s);
-void *xcalloc (size_t n, size_t s);
-void *xrealloc (void *p, size_t s);
-void *xnrealloc (void *p, size_t n, size_t s);
-void *x2realloc (void *p, size_t *pn);
-void *x2nrealloc (void *p, size_t *pn, size_t s);
-void *xclone (void const *p, size_t s);
-char *xstrdup (const char *str);
-
-/* Return 1 if an array of N objects, each of size S, cannot exist due
- to size arithmetic overflow. S must be positive and N must be
- nonnegative. This is a macro, not an inline function, so that it
- works correctly even when SIZE_MAX < N.
-
- By gnulib convention, SIZE_MAX represents overflow in size
- calculations, so the conservative dividend to use here is
- SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
- However, malloc (SIZE_MAX) fails on all known hosts where
- sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
- exactly-SIZE_MAX allocations on such hosts; this avoids a test and
- branch when S is known to be 1. */
-# define xalloc_oversized(n, s) \
- ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
-
-/* These macros are deprecated; they will go away soon, and are retained
- temporarily only to ease conversion to the functions described above. */
-# define CCLONE(p, n) xclone (p, (n) * sizeof *(p))
-# define CLONE(p) xclone (p, sizeof *(p))
-# define NEW(type, var) type *var = xmalloc (sizeof (type))
-# define XCALLOC(type, n) xcalloc (n, sizeof (type))
-# define XMALLOC(type, n) xnmalloc (n, sizeof (type))
-# define XREALLOC(p, type, n) xnrealloc (p, n, sizeof (type))
-# define XFREE(p) free (p)
-
-#endif /* !XALLOC_H_ */
Index: contrib/diff/lib/xmalloc.c
===================================================================
--- contrib/diff/lib/xmalloc.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/* xmalloc.c -- malloc with out of memory checking
-
- Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2003,
- 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "xalloc.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-#define N_(msgid) msgid
-
-#include "error.h"
-#include "exitfail.h"
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-#ifndef HAVE_MALLOC
-"you must run the autoconf test for a GNU libc compatible malloc"
-#endif
-
-#ifndef HAVE_REALLOC
-"you must run the autoconf test for a GNU libc compatible realloc"
-#endif
-
-/* If non NULL, call this function when memory is exhausted. */
-void (*xalloc_fail_func) (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 abort. */
- abort ();
-}
-
-/* Allocate an array of N objects, each with S bytes of memory,
- dynamically, with error checking. S must be nonzero. */
-
-static inline void *
-xnmalloc_inline (size_t n, size_t s)
-{
- void *p;
- if (xalloc_oversized (n, s) || ! (p = malloc (n * s)))
- xalloc_die ();
- return p;
-}
-
-void *
-xnmalloc (size_t n, size_t s)
-{
- return xnmalloc_inline (n, s);
-}
-
-/* Allocate N bytes of memory dynamically, with error checking. */
-
-void *
-xmalloc (size_t n)
-{
- return xnmalloc_inline (n, 1);
-}
-
-/* Change the size of an allocated block of memory P to an array of N
- objects each of S bytes, with error checking. S must be nonzero. */
-
-static inline void *
-xnrealloc_inline (void *p, size_t n, size_t s)
-{
- if (xalloc_oversized (n, s) || ! (p = realloc (p, n * s)))
- xalloc_die ();
- return p;
-}
-
-void *
-xnrealloc (void *p, size_t n, size_t s)
-{
- return xnrealloc_inline (p, n, s);
-}
-
-/* Change the size of an allocated block of memory P to N bytes,
- with error checking. */
-
-void *
-xrealloc (void *p, size_t n)
-{
- return xnrealloc_inline (p, n, 1);
-}
-
-
-/* If P is null, allocate a block of at least *PN such objects;
- otherwise, reallocate P so that it contains more than *PN objects
- each of S bytes. *PN must be nonzero unless P is null, and S must
- be nonzero. Set *PN to the new number of objects, and return the
- pointer to the new block. *PN is never set to zero, and the
- returned pointer is never null.
-
- Repeated reallocations are guaranteed to make progress, either by
- allocating an initial block with a nonzero size, or by allocating a
- larger block.
-
- In the following implementation, nonzero sizes are doubled so that
- repeated reallocations have O(N log N) overall cost rather than
- O(N**2) cost, but the specification for this function does not
- guarantee that sizes are doubled.
-
- Here is an example of use:
-
- int *p = NULL;
- size_t used = 0;
- size_t allocated = 0;
-
- void
- append_int (int value)
- {
- if (used == allocated)
- p = x2nrealloc (p, &allocated, sizeof *p);
- p[used++] = value;
- }
-
- This causes x2nrealloc to allocate a block of some nonzero size the
- first time it is called.
-
- To have finer-grained control over the initial size, set *PN to a
- nonzero value before calling this function with P == NULL. For
- example:
-
- int *p = NULL;
- size_t used = 0;
- size_t allocated = 0;
- size_t allocated1 = 1000;
-
- void
- append_int (int value)
- {
- if (used == allocated)
- {
- p = x2nrealloc (p, &allocated1, sizeof *p);
- allocated = allocated1;
- }
- p[used++] = value;
- }
-
- */
-
-static inline void *
-x2nrealloc_inline (void *p, size_t *pn, size_t s)
-{
- size_t n = *pn;
-
- if (! p)
- {
- if (! n)
- {
- /* The approximate size to use for initial small allocation
- requests, when the invoking code specifies an old size of
- zero. 64 bytes is the largest "small" request for the
- GNU C library malloc. */
- enum { DEFAULT_MXFAST = 64 };
-
- n = DEFAULT_MXFAST / s;
- n += !n;
- }
- }
- else
- {
- if (SIZE_MAX / 2 / s < n)
- xalloc_die ();
- n *= 2;
- }
-
- *pn = n;
- return xrealloc (p, n * s);
-}
-
-void *
-x2nrealloc (void *p, size_t *pn, size_t s)
-{
- return x2nrealloc_inline (p, pn, s);
-}
-
-/* If P is null, allocate a block of at least *PN bytes; otherwise,
- reallocate P so that it contains more than *PN bytes. *PN must be
- nonzero unless P is null. Set *PN to the new block's size, and
- return the pointer to the new block. *PN is never set to zero, and
- the returned pointer is never null. */
-
-void *
-x2realloc (void *p, size_t *pn)
-{
- return x2nrealloc_inline (p, pn, 1);
-}
-
-/* Allocate S bytes of zeroed memory dynamically, with error checking.
- There's no need for xnzalloc (N, S), since it would be equivalent
- to xcalloc (N, S). */
-
-void *
-xzalloc (size_t s)
-{
- return memset (xmalloc (s), 0, s);
-}
-
-/* Allocate zeroed memory for N elements of S bytes, with error
- checking. S must be nonzero. */
-
-void *
-xcalloc (size_t n, size_t s)
-{
- void *p;
- /* Test for overflow, since some calloc implementations don't have
- proper overflow checks. */
- if (xalloc_oversized (n, s) || ! (p = calloc (n, s)))
- xalloc_die ();
- return p;
-}
-
-/* Clone an object P of size S, with error checking. There's no need
- for xnclone (P, N, S), since xclone (P, N * S) works without any
- need for an arithmetic overflow check. */
-
-void *
-xclone (void const *p, size_t s)
-{
- return memcpy (xmalloc (s), p, s);
-}
Index: contrib/diff/lib/xstrtol.h
===================================================================
--- contrib/diff/lib/xstrtol.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* A more useful interface to strtol.
-
- Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004 Free
- Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#ifndef XSTRTOL_H_
-# define XSTRTOL_H_ 1
-
-# include "exitfail.h"
-
-/* Get uintmax_t. */
-# if HAVE_INTTYPES_H
-# include <inttypes.h>
-# else
-# if HAVE_STDINT_H
-# include <stdint.h>
-# endif
-# endif
-
-# ifndef _STRTOL_ERROR
-enum strtol_error
- {
- LONGINT_OK = 0,
-
- /* These two values can be ORed together, to indicate that both
- errors occurred. */
- LONGINT_OVERFLOW = 1,
- LONGINT_INVALID_SUFFIX_CHAR = 2,
-
- LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
- | LONGINT_OVERFLOW),
- LONGINT_INVALID = 4
- };
-typedef enum strtol_error strtol_error;
-# endif
-
-# define _DECLARE_XSTRTOL(name, type) \
- strtol_error name (const char *, char **, int, type *, const char *);
-_DECLARE_XSTRTOL (xstrtol, long int)
-_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
-_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
-_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
-
-# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \
- do \
- { \
- switch ((Err)) \
- { \
- default: \
- abort (); \
- \
- case LONGINT_INVALID: \
- error ((Exit_code), 0, "invalid %s `%s'", \
- (Argument_type_string), (Str)); \
- break; \
- \
- case LONGINT_INVALID_SUFFIX_CHAR: \
- case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW: \
- 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 (exit_failure, Str, Argument_type_string, Err)
-
-# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \
- _STRTOL_ERROR (0, Str, Argument_type_string, Err)
-
-#endif /* not XSTRTOL_H_ */
Index: contrib/diff/man/cmp.1
===================================================================
--- contrib/diff/man/cmp.1
+++ /dev/null
@@ -1,63 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.33.
-.TH CMP "1" "April 2004" "diffutils 2.8.7" "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.
-Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
-.SH AUTHOR
-Written by Torbjorn Granlund and David MacKenzie.
-.SH "REPORTING BUGS"
-Report bugs to <bug-gnu-utils@gnu.org>.
-.SH COPYRIGHT
-Copyright \(co 2004 Free Software Foundation, Inc.
-.br
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.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.
Index: contrib/diff/man/diff.1
===================================================================
--- contrib/diff/man/diff.1
+++ /dev/null
@@ -1,227 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.33.
-.TH DIFF "1" "April 2004" "diffutils 2.8.7" "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\-\-tabsize\fR=\fINUM\fR
-Tab stops are every NUM (default 8) print columns.
-.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.
-Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
-.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 2004 Free Software Foundation, Inc.
-.br
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.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.
Index: contrib/diff/man/diff3.1
===================================================================
--- contrib/diff/man/diff3.1
+++ /dev/null
@@ -1,78 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.33.
-.TH DIFF3 "1" "April 2004" "diffutils 2.8.7" "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\-\-strip\-trailing\-cr\fR
-Strip trailing carriage return on input.
-.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.
-Exit status is 0 if successful, 1 if conflicts, 2 if trouble.
-.SH AUTHOR
-Written by Randy Smith.
-.SH "REPORTING BUGS"
-Report bugs to <bug-gnu-utils@gnu.org>.
-.SH COPYRIGHT
-Copyright \(co 2004 Free Software Foundation, Inc.
-.br
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.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 diff3
-.PP
-should give you access to the complete manual.
Index: contrib/diff/man/sdiff.1
===================================================================
--- contrib/diff/man/sdiff.1
+++ /dev/null
@@ -1,90 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.33.
-.TH SDIFF "1" "April 2004" "diffutils 2.8.7" "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) print columns.
-.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\-\-tabsize\fR=\fINUM\fR
-Tab stops are every NUM (default 8) print columns.
-.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.
-Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.
-.SH AUTHOR
-Written by Thomas Lord.
-.SH "REPORTING BUGS"
-Report bugs to <bug-gnu-utils@gnu.org>.
-.SH COPYRIGHT
-Copyright \(co 2004 Free Software Foundation, Inc.
-.br
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-.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.
Index: contrib/diff/src/analyze.c
===================================================================
--- contrib/diff/src/analyze.c
+++ /dev/null
@@ -1,1038 +0,0 @@
-/* Analyze file differences for GNU DIFF.
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002,
- 2004 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 <file-type.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).
-
- 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 void
-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 = false;
-
- /* 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 = true;
- fd[d] = x;
- if (odd && bmin <= d && d <= bmax && bd[d] <= x)
- {
- part->xmid = x;
- part->ymid = y;
- part->lo_minimal = part->hi_minimal = true;
- return;
- }
- }
-
- /* 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 = true;
- bd[d] = x;
- if (!odd && fmin <= d && d <= fmax && x <= fd[d])
- {
- part->xmid = x;
- part->ymid = y;
- part->lo_minimal = part->hi_minimal = true;
- return;
- }
- }
-
- 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 = 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 = true;
- part->hi_minimal = false;
- return;
- }
-
- 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 = false;
- part->hi_minimal = true;
- return;
- }
- }
-
- /* 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 = true;
- part->hi_minimal = false;
- }
- else
- {
- part->xmid = bxbest;
- part->ymid = bxybest - bxbest;
- part->lo_minimal = false;
- part->hi_minimal = true;
- }
- return;
- }
- }
-}
-
-/* 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
- {
- struct partition part;
-
- /* Find a point of correspondence in the middle of the files. */
- diag (xoff, xlim, yoff, ylim, find_minimal, &part);
-
- /* 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++)
- {
- char *changed = filevec[f].changed;
- char *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;
- char *changed0 = filevec[0].changed;
- char *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;
- char *changed0 = filevec[0].changed;
- char *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;
- message ("Files %s and %s differ\n", label0, label1);
- if (! brief)
- 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;
- char *flag_space = zalloc (s);
- 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, false);
- break;
-
- case OUTPUT_UNIFIED:
- print_context_script (script, true);
- 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;
-}
Index: contrib/diff/src/cmp.c
===================================================================
--- contrib/diff/src/cmp.c
+++ /dev/null
@@ -1,677 +0,0 @@
-/* cmp - compare two files byte by byte
-
- Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2001,
- 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#include "system.h"
-#include "paths.h"
-
-#include <stdio.h>
-
-#include <c-stack.h>
-#include <cmpbuf.h>
-#include <error.h>
-#include <exit.h>
-#include <exitfail.h>
-#include <file-type.h>
-#include <getopt.h>
-#include <hard-locale.h>
-#include <inttostr.h>
-#include <setmode.h>
-#include <unlocked-io.h>
-#include <version-etc.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 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";
-
-/* Update ignore_initial[F] according to the result of parsing 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 void
-specify_ignore_initial (int f, 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);
- if (ignore_initial[f] < o)
- ignore_initial[f] = o;
-}
-
-/* Specify the output format. */
-static void
-specify_comparison_type (enum comparison_type t)
-{
- if (comparison_type && comparison_type != t)
- 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%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."),
- _("Exit status is 0 if inputs are the same, 1 if different, 2 if trouble."),
- _("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 (0);
-
- /* 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 = true;
- break;
-
- case 'i':
- specify_ignore_initial (0, &optarg, ':');
- if (*optarg++ == ':')
- specify_ignore_initial (1, &optarg, 0);
- else if (ignore_initial[1] < ignore_initial[0])
- ignore_initial[1] = 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':
- /* TRANSLATORS: Please translate the second "o" in "Torbjorn
- Granlund" to an o-with-umlaut (U+00F6, LATIN SMALL LETTER O
- WITH DIAERESIS) if possible. */
- version_etc (stdout, "cmp", PACKAGE_NAME, PACKAGE_VERSION,
- _("Torbjorn Granlund"), "David MacKenzie", (char *) 0);
- 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++];
- specify_ignore_initial (f, &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 and offset are identical.
- But wait until we open the file once, for proper diagnostics. */
- if (f && ignore_initial[0] == ignore_initial[1]
- && 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], true);
- }
-
- /* 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 : char_message,
- 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++)
- {
- unsigned char uc = l;
- cnt += ! uc;
- 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] = true;
- position[f] = lseek (file_desc[f], ignore_initial[f], SEEK_CUR);
- }
- return position[f];
-}
Index: contrib/diff/src/context.c
===================================================================
--- contrib/diff/src/context.c
+++ /dev/null
@@ -1,478 +0,0 @@
-/* Context-format output routines for GNU DIFF.
-
- Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001,
- 2002, 2004 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>
-
-#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, long);
-
-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);
- long nsec = TIMESPEC_NS (inf->stat.st_mtim);
- if (! (tm && nstrftime (buf, sizeof buf, time_format, tm, 0, nsec)))
- {
- time_t sec = inf->stat.st_mtime;
- verify (info_preserved, sizeof inf->stat.st_mtime <= sizeof sec);
- sprintf (buf, "%jd.%.9ld", (intmax_t)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 = false;
- }
-
- 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 int 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, sizeof (char), 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 int 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 print the line number before the range,
- which is B. It would be more logical to print A, but
- 'patch' expects B in order to detect diffs against empty files. */
- 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;
-}
Index: contrib/diff/src/diff.h
===================================================================
--- contrib/diff/src/diff.h
+++ /dev/null
@@ -1,375 +0,0 @@
-/* Shared definitions for GNU DIFF
-
- Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 2001,
- 2002, 2004 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 <regex.h>
-#include <stdio.h>
-#include <unlocked-io.h>
-
-/* 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;
-
-/* Number of columns between tab stops. */
-XTERN size_t tabsize;
-
-/* 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 size_t sdiff_half_width;
-XTERN size_t 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 1 for a line that is an insertion or a deletion.
- The results of comparison are stored here. */
- char *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 int *, long int *);
Index: contrib/diff/src/diff.c
===================================================================
--- contrib/diff/src/diff.c
+++ /dev/null
@@ -1,1357 +0,0 @@
-/* diff - compare files line by line
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 2001, 2002,
- 2004 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 "paths.h"
-#include <c-stack.h>
-#include <dirname.h>
-#include <error.h>
-#include <exclude.h>
-#include <exit.h>
-#include <exitfail.h>
-#include <file-type.h>
-#include <fnmatch.h>
-#include <getopt.h>
-#include <hard-locale.h>
-#include <posixver.h>
-#include <prepargs.h>
-#include <quotesys.h>
-#include <setmode.h>
-#include <version-etc.h>
-#include <xalloc.h>
-
-#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;
-#else
-enum { binary = true };
-#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:nNopPqrsS: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,
- TABSIZE_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},
- {"tabsize", 1, 0, TABSIZE_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 = false;
- size_t width = 0;
- bool show_c_function = false;
- 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, "");
- textdomain (PACKAGE);
- c_stack_action (0);
- function_regexp_list.buf = &function_regexp;
- ignore_regexp_list.buf = &ignore_regexp;
- re_set_syntax (RE_SYNTAX_GREP);
- excluded = new_exclude ();
-
- prepend_default_options (getenv ("DIFF_OPTIONS"), &argc, &argv);
-
- /* 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 = true;
- break;
-
- case 'b':
- if (ignore_white_space < IGNORE_SPACE_CHANGE)
- ignore_white_space = IGNORE_SPACE_CHANGE;
- break;
-
- case 'B':
- ignore_blank_lines = true;
- break;
-
- case 'C':
- case 'U':
- {
- 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 = true;
- }
- break;
-
- case 'c':
- specify_style (OUTPUT_CONTEXT);
- if (context < 3)
- context = 3;
- break;
-
- case 'd':
- minimal = true;
- 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 = true;
- break;
-
- case 'i':
- ignore_case = true;
- 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 = true;
-#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 = true;
- break;
-
- case 'o':
- /* Output in the old tradition style. */
- specify_style (OUTPUT_NORMAL);
- break;
-
- case 'p':
- show_c_function = true;
- add_regexp (&function_regexp_list, "^[[:alpha:]$_]");
- break;
-
- case 'P':
- unidirectional_new_file = true;
- break;
-
- case 'q':
- brief = true;
- break;
-
- case 'r':
- recursive = true;
- break;
-
- case 's':
- report_identical_files = true;
- break;
-
- case 'S':
- specify_value (&starting_file, optarg, "-S");
- break;
-
- case 't':
- expand_tabs = true;
- break;
-
- case 'T':
- initial_tab = true;
- break;
-
- case 'u':
- specify_style (OUTPUT_UNIFIED);
- if (context < 3)
- context = 3;
- break;
-
- case 'v':
- version_etc (stdout, "diff", PACKAGE_NAME, PACKAGE_VERSION,
- "Paul Eggert", "Mike Haertel", "David Hayes",
- "Richard Stallman", "Len Tower", (char *) 0);
- 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 <= SIZE_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 = true;
- set_binary_mode (STDOUT_FILENO, true);
-#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 = true;
- break;
-
- case INHIBIT_HUNK_MERGE_OPTION:
- /* This option is obsolete, but accept it for backward
- compatibility. */
- break;
-
- case LEFT_COLUMN_OPTION:
- left_column = true;
- 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 = false;
- break;
-
- case NORMAL_OPTION:
- specify_style (OUTPUT_NORMAL);
- break;
-
- case SDIFF_MERGE_ASSIST_OPTION:
- specify_style (OUTPUT_SDIFF);
- sdiff_merge_assist = true;
- break;
-
- case STRIP_TRAILING_CR_OPTION:
- strip_trailing_cr = true;
- break;
-
- case SUPPRESS_COMMON_LINES_OPTION:
- suppress_common_lines = true;
- break;
-
- case TABSIZE_OPTION:
- numval = strtoumax (optarg, &numend, 10);
- if (! (0 < numval && numval <= SIZE_MAX) || *numend)
- try_help ("invalid tabsize `%s'", optarg);
- if (tabsize != numval)
- {
- if (tabsize)
- fatal ("conflicting tabsize options");
- tabsize = numval;
- }
- 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))
- {
-#ifdef ST_MTIM_NSEC
- time_format = "%Y-%m-%d %H:%M:%S.%N %z";
-#else
- time_format = "%Y-%m-%d %H:%M:%S %z";
-#endif
- }
- 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 int) ocontext,
- output_style == OUTPUT_CONTEXT ? 'C' : 'U',
- (long int) ocontext);
- try_help (0, 0);
- }
- context = ocontext;
- }
- else
- {
- if (modern_usage)
- {
- error (0, 0, _("`-%ld' option is obsolete; omit it"),
- (long int) ocontext);
- try_help (0, 0);
- }
- }
- }
-
- if (! tabsize)
- tabsize = 8;
- if (! width)
- width = 130;
-
- {
- /* 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. */
-
- intmax_t t = expand_tabs ? 1 : tabsize;
- intmax_t w = width;
- intmax_t 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 & binary
- & ~ (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_("--tabsize=NUM Tab stops are every NUM (default 8) print columns."),
- "",
- 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_("Exit status is 0 if inputs are the same, 1 if different, 2 if trouble."),
- "",
- 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)
- {
- output_style = style;
- }
-}
-
-/* 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, 0) == 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 as needed for -N and -P, if they are
- inaccessible empty regular files (the kind of files that 'patch'
- creates to indicate nonexistent backups), or if they are
- top-level files that do not exist but their counterparts do
- exist. */
- for (f = 0; f < 2; f++)
- if ((new_file || (f == 0 && unidirectional_new_file))
- && (cmp.file[f].desc == UNOPENED
- ? (S_ISREG (cmp.file[f].stat.st_mode)
- && ! (cmp.file[f].stat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))
- && cmp.file[f].stat.st_size == 0)
- : (cmp.file[f].desc == ERRNO_ENCODE (ENOENT)
- && ! parent
- && cmp.file[1 - f].desc == UNOPENED)))
- cmp.file[f].desc = NONEXISTENT;
-
- for (f = 0; f < 2; f++)
- if (cmp.file[f].desc == NONEXISTENT)
- {
- memset (&cmp.file[f].stat, 0, sizeof cmp.file[f].stat);
- 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 (cmp.file[0].desc == NONEXISTENT
- && cmp.file[1].desc == NONEXISTENT)
- {
- /* Neither file "exists", so there's nothing to compare. */
- }
- 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,
- file_type (&cmp.file[0].stat),
- file_label[1] ? file_label[1] : cmp.file[1].name,
- file_type (&cmp.file[1].stat));
-
- /* This is a difference. */
- status = EXIT_FAILURE;
- }
- }
- else if (files_can_be_treated_as_binary
- && S_ISREG (cmp.file[0].stat.st_mode)
- && S_ISREG (cmp.file[1].stat.st_mode)
- && cmp.file[0].stat.st_size != cmp.file[1].stat.st_size)
- {
- 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, true);
-#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;
-}
Index: contrib/diff/src/diff3.c
===================================================================
--- contrib/diff/src/diff3.c
+++ /dev/null
@@ -1,1743 +0,0 @@
-/* diff3 - compare three files line by line
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1998, 2001,
- 2002, 2004 Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
-
-#include "system.h"
-#include "paths.h"
-
-#include <stdio.h>
-#include <unlocked-io.h>
-
-#include <c-stack.h>
-#include <cmpbuf.h>
-#include <error.h>
-#include <exitfail.h>
-#include <file-type.h>
-#include <getopt.h>
-#include <inttostr.h>
-#include <quotesys.h>
-#include <version-etc.h>
-#include <xalloc.h>
-
-/* 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;
-
-/* Remove trailing carriage returns from input. */
-static bool strip_trailing_cr;
-
-/* 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,
- STRIP_TRAILING_CR_OPTION
-};
-
-static struct option const longopts[] =
-{
- {"diff-program", 1, 0, DIFF_PROGRAM_OPTION},
- {"easy-only", 0, 0, '3'},
- {"ed", 0, 0, 'e'},
- {"help", 0, 0, HELP_OPTION},
- {"initial-tab", 0, 0, 'T'},
- {"label", 1, 0, 'L'},
- {"merge", 0, 0, 'm'},
- {"overlap-only", 0, 0, 'x'},
- {"show-all", 0, 0, 'A'},
- {"show-overlap", 0, 0, 'E'},
- {"strip-trailing-cr", 0, 0, STRIP_TRAILING_CR_OPTION},
- {"text", 0, 0, 'a'},
- {"version", 0, 0, 'v'},
- {0, 0, 0, 0}
-};
-
-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, "");
- textdomain (PACKAGE);
- c_stack_action (0);
-
- while ((c = getopt_long (argc, argv, "aeimvx3AEL:TX", longopts, 0)) != -1)
- {
- switch (c)
- {
- case 'a':
- text = true;
- break;
- case 'A':
- show_2nd = true;
- flagging = true;
- incompat++;
- break;
- case 'x':
- overlap_only = true;
- incompat++;
- break;
- case '3':
- simple_only = true;
- incompat++;
- break;
- case 'i':
- finalwrite = true;
- break;
- case 'm':
- merge = true;
- break;
- case 'X':
- overlap_only = true;
- /* Fall through. */
- case 'E':
- flagging = true;
- /* Fall through. */
- case 'e':
- incompat++;
- break;
- case 'T':
- initial_tab = true;
- break;
- case STRIP_TRAILING_CR_OPTION:
- strip_trailing_cr = true;
- break;
- case 'v':
- version_etc (stdout, "diff3", PACKAGE_NAME, PACKAGE_VERSION,
- "Randy Smith", (char *) 0);
- 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
-
- /* Invoke diff twice on two pairs of input files, combine the two
- diffs, and output them. */
-
- 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 = false;
- }
-
- 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_("--strip-trailing-cr Strip trailing carriage return on input."),
- 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%s\n\n%s\n",
- _("If a FILE is `-', read standard input."),
- _("Exit status is 0 if successful, 1 if conflicts, 2 if trouble."),
- _("Report bugs to <bug-gnu-utils@gnu.org>."));
-}
-
-/* Combine the two diffs together into one.
- Here is the algorithm:
-
- 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 is
- needed 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 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
- diff blocks are used 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 during comparisons). If they match, 0 & 1 are the
- same. If not, all three different.
-
- Then do it again, until the blocks are exhausted. */
-
-
-/* Make a three way diff (chain of diff3_block's) from two two way
- diffs (chains of diff_block's). Assume 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). Return a three way diff pointer with
- 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)
-{
- /* Work on the two diffs passed to it as threads. Thread number 0
- is diff02, thread number 1 is diff12. USING is 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 USING is 0. LAST_USING contains the last
- elements on each of the using lists.
-
- HIGH_WATER_MARK is the highest line number in the common file
- described in any of the diffs in either of the USING lists.
- HIGH_WATER_THREAD names the thread. Similarly 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. HIGH_WATER_DIFF is the diff from which the
- HIGH_WATER_MARK was taken.
-
- HIGH_WATER_DIFF should always be equal to
- LAST_USING[HIGH_WATER_THREAD]. OTHER_DIFF is the next diff to
- check for higher water, and should always be equal to
- CURRENT[HIGH_WATER_THREAD ^ 1]. OTHER_THREAD is the thread in
- which the OTHER_DIFF is, and hence should always be equal to
- HIGH_WATER_THREAD ^ 1.
-
- LAST_DIFF is the last diff block produced by this routine, for
- line correspondence purposes between that diff and the one
- currently being worked on. It is 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;
-}
-
-/* Take two lists of blocks (from two separate diff threads) and put
- them together into one diff3 block. Return 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 that
- 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;
-}
-
-/* Copy pointers from a list of strings to a different list of
- strings. If a spot in the second list is already filled, make sure
- that it is filled with the same string; if not, return false, the copy
- incomplete. Upon successful completion of the copy, return true. */
-
-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) != 0)
- return false;
- }
- else
- {
- *t = *f;
- *tl = *fl;
- }
-
- t++; f++; tl++; fl++;
- }
-
- return true;
-}
-
-/* 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;
- char * const *l2 = list2;
- size_t const *lgths1 = lengths1;
- size_t const *lgths2 = lengths2;
-
- while (nl--)
- if (!*l1 || !*l2 || *lgths1 != *lgths2++
- || memcmp (*l1++, *l2++, *lgths1++) != 0)
- return false;
- return true;
-}
-
-/* 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;
-}
-
-/* Skip tabs and spaces, and return the first character after them. */
-
-static char *
-skipwhite (char *s)
-{
- while (*s == ' ' || *s == '\t')
- s++;
- return s;
-}
-
-/* Read a nonnegative line number from S, returning the address of the
- first character after the line number, and storing the number into
- *PNUM. Return 0 if S does not point to a valid line number. */
-
-static char *
-readnum (char *s, lin *pnum)
-{
- unsigned char c = *s;
- lin num = 0;
-
- if (! ISDIGIT (c))
- return 0;
-
- do
- {
- num = c - '0' + num * 10;
- c = *++s;
- }
- while (ISDIGIT (c));
-
- *pnum = num;
- return s;
-}
-
-/* Parse a normal format diff control string. Return 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;
- enum diff_type type;
-
- /* Read first set of digits */
- s = readnum (skipwhite (s), &db->ranges[0][RANGE_START]);
- if (! s)
- return ERROR;
-
- /* Was that the only digit? */
- s = skipwhite (s);
- if (*s == ',')
- {
- s = readnum (s + 1, &db->ranges[0][RANGE_END]);
- if (! s)
- return ERROR;
- }
- else
- db->ranges[0][RANGE_END] = db->ranges[0][RANGE_START];
-
- /* Get the letter */
- s = 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 */
- s = readnum (skipwhite (s), &db->ranges[1][RANGE_START]);
- if (! s)
- return ERROR;
-
- /* Was that the only digit? */
- s = skipwhite (s);
- if (*s == ',')
- {
- s = readnum (s + 1, &db->ranges[1][RANGE_END]);
- if (! s)
- return ERROR;
- s = 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, status;
- int werrno = 0;
- struct stat pipestat;
-
-#if HAVE_WORKING_FORK || HAVE_WORKING_VFORK
-
- char const *argv[9];
- char const **ap;
- int fds[2];
- pid_t pid;
-
- ap = argv;
- *ap++ = diff_program;
- if (text)
- *ap++ = "-a";
- if (strip_trailing_cr)
- *ap++ = "--strip-trailing-cr";
- *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 == ENOENT ? 127 : 126);
- }
-
- if (pid == -1)
- perror_with_exit ("fork");
-
- close (fds[1]); /* Prevent erroneous lack of EOF */
- fd = fds[0];
-
-#else
-
- FILE *fpipe;
- char const args[] = " --horizon-lines=100 -- ";
- char *command = xmalloc (quote_system_arg (0, diff_program)
- + sizeof "-a"
- + sizeof "--strip-trailing-cr"
- + 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);
- if (text)
- {
- strcpy (p, " -a");
- p += 3;
- }
- if (strip_trailing_cr)
- {
- strcpy (p, " --strip-trailing-cr");
- p += 20;
- }
- strcpy (p, args);
- p += sizeof args - 1;
- 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
-
- status = ! werrno && WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : INT_MAX;
-
- if (EXIT_TROUBLE <= status)
- error (EXIT_TROUBLE, werrno,
- _(status == 126
- ? "subsidiary program `%s' could not be invoked"
- : status == 127
- ? "subsidiary program `%s' not found"
- : status == INT_MAX
- ? "subsidiary program `%s' failed"
- : "subsidiary program `%s' failed (exit status %d)"),
- diff_program, status);
-
- 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;
-}
-
-/* Output 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 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 int llowt = lowt;
- long int 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 = false;
-
- for (i = 0;
- i < D_NUMLINES (b, filenum);
- i++)
- {
- char *line = D_RELNUM (b, filenum, i);
- if (line[0] == '.')
- {
- leading_dot = true;
- fprintf (outputfile, ".");
- }
- fwrite (line, sizeof (char),
- D_RELLEN (b, filenum, i), outputfile);
- }
-
- return leading_dot;
-}
-
-/* Output to OUTPUTFILE a '.' line. If LEADING_DOT is true, also
- output a command that removes initial '.'s starting with line START
- and continuing for NUM lines. (START is long int, not lin, for
- convenience with printf %ld formats.) */
-
-static void
-undotlines (FILE *outputfile, bool leading_dot, long int 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);
- }
-}
-
-/* Output a diff3 set of blocks as an ed script. This script applies
- the changes between file's 2 & 3 to file 1. Take the precise
- format of the ed script to be output from global variables set
- during options processing. Reverse the order of
- the set of diff3 blocks in DIFF; this gets
- around the problems involved with changing line numbers in an ed
- script.
-
- As in `output_diff3', 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.
-
- 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.
-
- Return 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 = false;
- bool 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 int 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 = true; break;
- case DIFF_3RD: if (overlap_only) continue; conflict = false; 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 = true;
-
-
- /* Mark end of conflict. */
-
- fprintf (outputfile, "%lda\n", high0);
- leading_dot = false;
- 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 = false;
- 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.
-
- Return 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 = false;
- bool 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 = true; break;
- case DIFF_3RD: if (overlap_only) continue; conflict = false; 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 = true;
-
- 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 ();
-}
Index: contrib/diff/src/dir.c
===================================================================
--- contrib/diff/src/dir.c
+++ /dev/null
@@ -1,288 +0,0 @@
-/* Read, sort and compare two directories. Used for GNU DIFF.
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002,
- 2004 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 <strcase.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
- locale-specific sorting. */
-static bool locale_specific_sorting;
-
-/* Where to go if locale-specific sorting fails. */
-static jmp_buf failed_locale_specific_sorting;
-
-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 false;
-
- /* 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 false;
- }
-#if CLOSEDIR_VOID
- closedir (reading);
-#else
- if (closedir (reading) != 0)
- return false;
-#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 true;
-}
-
-/* Compare file names, returning a value compatible with strcmp. */
-
-static int
-compare_names (char const *name1, char const *name2)
-{
- if (locale_specific_sorting)
- {
- int r;
- errno = 0;
- if (ignore_file_name_case)
- r = strcasecoll (name1, name2);
- else
- r = strcoll (name1, name2);
- if (errno)
- {
- error (0, errno, _("cannot compare file names `%s' and `%s'"),
- name1, name2);
- longjmp (failed_locale_specific_sorting, 1);
- }
- return r;
- }
-
- return (ignore_file_name_case
- ? strcasecmp (name1, name2)
- : 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 = true;
- if (setjmp (failed_locale_specific_sorting))
- locale_specific_sorting = false;
-
- /* 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 true;
- return false;
-}
Index: contrib/diff/src/ed.c
===================================================================
--- contrib/diff/src/ed.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Output routines for ed-script format.
-
- Copyright (C) 1988, 1989, 1991, 1992, 1993, 1995, 1998, 2001, 2004
- 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 int 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]);
- }
-}
Index: contrib/diff/src/ifdef.c
===================================================================
--- contrib/diff/src/ifdef.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/* #ifdef-format output routines for GNU DIFF.
-
- Copyright (C) 1989, 1991, 1992, 1993, 1994, 2001, 2002, 2004 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_line0;
-static lin next_line1;
-
-/* Print the edit-script SCRIPT as a merged #ifdef file. */
-
-void
-print_ifdef_script (struct change *script)
-{
- next_line0 = next_line1 = - files[0].prefix_lines;
- print_script (script, find_change, print_ifdef_hunk);
- if (next_line0 < files[0].valid_lines
- || next_line1 < files[1].valid_lines)
- {
- begin_output ();
- format_ifdef (group_format[UNCHANGED],
- next_line0, files[0].valid_lines,
- next_line1, 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_line0 < first0 || next_line1 < first1)
- format_ifdef (group_format[UNCHANGED],
- next_line0, first0,
- next_line1, first1);
-
- /* Print this change. */
- next_line0 = last0 + 1;
- next_line1 = last1 + 1;
- format_ifdef (group_format[changes],
- first0, next_line0,
- first1, next_line1);
-}
-
-/* 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 int 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;
-}
Index: contrib/diff/src/io.c
===================================================================
--- contrib/diff/src/io.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* File I/O for GNU DIFF.
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002,
- 2004 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 <file-type.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, true);
- 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, false);
- current->buffered = 0;
- current->eof = false;
- }
-
- return binary_file_p (current->buffer, buffered);
- }
- }
-
- current->buffered = 0;
- current->eof = false;
- return false;
-}
-
-/* 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;
- char const *p = 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 (p < suffix_begin)
- {
- char const *ip = 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')
- {
- size_t repetitions = 1;
-
- switch (c)
- {
- case '\b':
- column -= 0 < column;
- break;
-
- case '\t':
- c = ' ';
- repetitions = tabsize - column % tabsize;
- column = (column + repetitions < column
- ? 0
- : 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')
- {
- size_t repetitions = 1;
-
- switch (c)
- {
- case '\b':
- column -= 0 < column;
- break;
-
- case '\t':
- c = ' ';
- repetitions = tabsize - column % tabsize;
- column = (column + repetitions < column
- ? 0
- : 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 = p - ip - 1;
-
- if (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 = 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] = p;
-
- if (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 = false;
- else
- {
- p[buffered++] = '\n';
- current->missing_newline = true;
- }
-
- 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, true);
- set_binary_mode (filevec[1].desc, true);
- return true;
- }
-
- 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 false;
-}
Index: contrib/diff/src/normal.c
===================================================================
--- contrib/diff/src/normal.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* 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]);
-}
Index: contrib/diff/src/sdiff.c
===================================================================
--- contrib/diff/src/sdiff.c
+++ /dev/null
@@ -1,1226 +0,0 @@
-/* sdiff - side-by-side merge of file differences
-
- Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 2001, 2002, 2004
- 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 "paths.h"
-
-#include <stdio.h>
-#include <unlocked-io.h>
-
-#include <c-stack.h>
-#include <dirname.h>
-#include <error.h>
-#include <exit.h>
-#include <exitfail.h>
-#include <file-type.h>
-#include <getopt.h>
-#include <quotesys.h>
-#include <version-etc.h>
-#include <xalloc.h>
-
-/* 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 void 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, void (*) (int));
-#else
- static void (*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,
- TABSIZE_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'},
- {"tabsize", 1, 0, TABSIZE_OPTION},
- {"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) print columns."),
- 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_("--tabsize=NUM Tab stops are every NUM (default 8) print columns."),
- "",
- 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%s\n\n%s\n",
- _("If a FILE is `-', read standard input."),
- _("Exit status is 0 if inputs are the same, 1 if different, 2 if trouble."),
- _("Report bugs to <bug-gnu-utils@gnu.org>."));
-}
-
-/* Clean up after a signal or other failure. This function is
- async-signal-safe. */
-static void
-cleanup (int signo __attribute__((unused)))
-{
-#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 (0);
- 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
-check_child_status (int werrno, int wstatus, int max_ok_status,
- char const *subsidiary_program)
-{
- int status = (! werrno && WIFEXITED (wstatus)
- ? WEXITSTATUS (wstatus)
- : INT_MAX);
-
- if (max_ok_status < status)
- {
- error (0, werrno,
- _(status == 126
- ? "subsidiary program `%s' could not be invoked"
- : status == 127
- ? "subsidiary program `%s' not found"
- : status == INT_MAX
- ? "subsidiary program `%s' failed"
- : "subsidiary program `%s' failed (exit status %d)"),
- subsidiary_program, status);
- 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 (cleanup);
-
- prog = getenv ("EDITOR");
- if (prog)
- editor_program = prog;
-
- diffarg (DEFAULT_DIFF_PROGRAM);
-
- /* parse command line args */
- while ((opt = getopt_long (argc, argv, "abBdEHiI: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 = true;
- break;
-
- case 't':
- diffarg ("-t");
- break;
-
- case 'v':
- version_etc (stdout, "sdiff", PACKAGE_NAME, PACKAGE_VERSION,
- "Thomas Lord", (char *) 0);
- 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;
-
- case TABSIZE_OPTION:
- diffarg ("--tabsize");
- diffarg (optarg);
- 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 == ENOENT ? 127 : 126);
- }
-
-# 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 ();
-
- check_child_status (werrno, wstatus, EXIT_FAILURE, diffargv[0]);
- 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 void
-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, void (*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 = true;
-}
-
-/* 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 (0);
-
- /* 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 or e1:\tEdit then use the left version.\n\
-er or e2:\tEdit then use the right version.\n\
-e:\tDiscard both versions then edit a new one.\n\
-l or 1:\tUse the left version.\n\
-r or 2:\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 = false;
-
- cmd1 = 0; /* Pacify `gcc -W'. */
-
- while (! gotcmd)
- {
- if (putchar ('%') != '%')
- perror_fatal (_("write failed"));
- ck_fflush (stdout);
-
- cmd0 = skip_white ();
- switch (cmd0)
- {
- case '1': case '2': case 'l': case 'r':
- case 's': case 'v': case 'q':
- if (skip_white () != '\n')
- {
- give_help ();
- flush_line ();
- continue;
- }
- gotcmd = true;
- break;
-
- case 'e':
- cmd1 = skip_white ();
- switch (cmd1)
- {
- case '1': case '2': case 'b': case 'd': case 'l': case 'r':
- if (skip_white () != '\n')
- {
- give_help ();
- flush_line ();
- continue;
- }
- gotcmd = true;
- break;
- case '\n':
- gotcmd = true;
- break;
- default:
- give_help ();
- flush_line ();
- continue;
- }
- break;
-
- case EOF:
- if (feof (stdin))
- {
- gotcmd = true;
- cmd0 = 'q';
- break;
- }
- /* Fall through. */
- default:
- flush_line ();
- /* Fall through. */
- case '\n':
- give_help ();
- continue;
- }
- }
-
- switch (cmd0)
- {
- case '1': case 'l':
- lf_copy (left, llen, outfile);
- lf_skip (right, rlen);
- return true;
- case '2': case 'r':
- lf_copy (right, rlen, outfile);
- lf_skip (left, llen);
- return true;
- case 's':
- suppress_common_lines = true;
- break;
- case 'v':
- suppress_common_lines = false;
- break;
- case 'q':
- return false;
- 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 int) lline);
- else
- fprintf (tmp, "--- %s %ld,%ld\n", lname,
- (long int) lline,
- (long int) (lline + llen - 1));
- }
- /* Fall through. */
- case '1': 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 int) rline);
- else
- fprintf (tmp, "+++ %s %ld,%ld\n", rname,
- (long int) rline,
- (long int) (rline + rlen - 1));
- }
- /* Fall through. */
- case '2': 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 = true;
- 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 == ENOENT ? 127 : 126);
- }
-
- if (pid < 0)
- perror_fatal ("fork");
-
- while (waitpid (pid, &wstatus, 0) < 0)
- if (errno == EINTR)
- checksigs ();
- else
- perror_fatal ("waitpid");
-#endif
- }
-
- ignore_SIGINT = false;
- check_child_status (werrno, wstatus, EXIT_SUCCESS,
- editor_program);
- }
-
- {
- 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 true;
- }
- 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 false;
- break;
-
- default:
- fatal (diff_help);
- }
-
- lline += llen;
- rline += rlen;
- }
- }
-}
-
-/* Return true 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;
-}
Index: contrib/diff/src/side.c
===================================================================
--- contrib/diff/src/side.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* sdiff-format output routines for GNU DIFF.
-
- Copyright (C) 1991, 1992, 1993, 1998, 2001, 2002, 2004 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 size_t
-tab_from_to (size_t from, size_t to)
-{
- FILE *out = outfile;
- size_t tab;
- size_t tab_size = tabsize;
-
- if (!expand_tabs)
- for (tab = from + tab_size - from % tab_size; tab <= to; tab += tab_size)
- {
- 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. Return the
- last column written (not the number of chars). */
-
-static size_t
-print_half_line (char const *const *line, size_t indent, size_t out_bound)
-{
- FILE *out = outfile;
- register size_t in_position = 0;
- register size_t 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':
- {
- size_t spaces = tabsize - in_position % tabsize;
- if (in_position == out_position)
- {
- size_t 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;
- size_t hw = sdiff_half_width;
- size_t c2o = sdiff_column2_offset;
- size_t col = 0;
- bool put_newline = false;
-
- 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 int len0 = limit0 - i0;
- long int 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 int len0 = last0 - first0 + 1;
- long int 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;
- }
-}
Index: contrib/diff/src/system.h
===================================================================
--- contrib/diff/src/system.h
+++ /dev/null
@@ -1,326 +0,0 @@
-/* System dependent declarations.
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002,
- 2004 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>
-
-#ifndef S_IRWXU
-# define S_IRWXU 0700
-#endif
-#ifndef S_IRWXG
-# define S_IRWXG 0070
-#endif
-#ifndef S_IRWXO
-# define S_IRWXO 0007
-#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
-
-#include <time.h>
-
-#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
-
-#include <stdlib.h>
-#define EXIT_TROUBLE 2
-
-#include <limits.h>
-
-#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>
-
-#include <string.h>
-#if ! HAVE_STRCASECOLL
-# if HAVE_STRICOLL || defined stricoll
-# define strcasecoll(a, b) stricoll (a, b)
-# else
-# define strcasecoll(a, b) strcasecmp (a, b) /* best we can do */
-# endif
-#endif
-#if ! (HAVE_STRCASECMP || defined strcasecmp)
-int strcasecmp (char const *, char const *);
-#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>
-
-/* 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>
-
-#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))
-
-#include <stdbool.h>
-
-#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_int, sizeof (lin) <= sizeof (long int));
-
-/* 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
Index: contrib/diff/src/util.c
===================================================================
--- contrib/diff/src/util.c
+++ /dev/null
@@ -1,775 +0,0 @@
-/* Support routines for GNU DIFF.
-
- Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002,
- 2004 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 <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, (char *) 0);
- _exit (errno == ENOENT ? 127 : 126);
- }
- 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, false);
- break;
-
- case OUTPUT_UNIFIED:
- print_context_header (files, true);
- 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 status;
- 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
- status = (! werrno && WIFEXITED (wstatus)
- ? WEXITSTATUS (wstatus)
- : INT_MAX);
- if (status)
- error (EXIT_TROUBLE, werrno,
- _(status == 126
- ? "subsidiary program `%s' could not be invoked"
- : status == 127
- ? "subsidiary program `%s' not found"
- : status == INT_MAX
- ? "subsidiary program `%s' failed"
- : "subsidiary program `%s' failed (exit status %d)"),
- pr_program, status);
- }
-
- 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 char const *t1 = s1;
- register char const *t2 = 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'
- && s1 + 1 < t1
- && isspace ((unsigned char) t1[-2]))
- {
- --t1;
- continue;
- }
- if (c1 == ' ' && c2 != '\n'
- && s2 + 1 < t2
- && isspace ((unsigned char) 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 += tabsize - column % tabsize;
- else
- break;
- }
- for (;; c2 = *t2++)
- {
- if (c2 == ' ')
- column2++;
- else if (c2 == '\t')
- column2 += tabsize - column2 % tabsize;
- else
- break;
- }
- if (column != column2)
- return true;
- }
- 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 false;
-
- column += c1 == '\t' ? tabsize - column % tabsize : 1;
- }
-
- return true;
-}
-
-/* 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, sizeof (char), limit - base, outfile);
- else
- {
- register FILE *out = outfile;
- register unsigned char c;
- register char const *t = base;
- register size_t column = 0;
- size_t tab_size = tabsize;
-
- while (t < limit)
- switch ((c = *t++))
- {
- case '\t':
- {
- size_t spaces = tab_size - column % tab_size;
- 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:
- column += isprint (c) != 0;
- 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 int 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 int *aptr, long int *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 int 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 = ignore_blank_lines - 1;
- /* If 0, ignore zero-length lines;
- if SIZE_MAX, do not ignore lines just because of their length. */
- bool skip_leading_white_space =
- (ignore_blank_lines && IGNORE_SPACE_CHANGE <= ignore_white_space);
-
- 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];
- char const *newline = linbuf0[i + 1] - 1;
- size_t len = newline - line;
- char const *p = line;
- if (skip_leading_white_space)
- while (isspace ((unsigned char) *p) && *p != '\n')
- p++;
- if (newline - p != 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];
- char const *newline = linbuf1[i + 1] - 1;
- size_t len = newline - line;
- char const *p = line;
- if (skip_leading_white_space)
- while (isspace ((unsigned char) *p) && *p != '\n')
- p++;
- if (newline - p != 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 int line0 = sp->line0;
- long int line1 = sp->line1;
- long int deleted = sp->deleted;
- long int inserted = sp->inserted;
- fprintf (stderr, "%3ld %3ld delete %ld insert %ld\n",
- line0, line1, deleted, inserted);
- }
-
- fflush (stderr);
-}
Index: gnu/usr.bin/Makefile
===================================================================
--- gnu/usr.bin/Makefile
+++ gnu/usr.bin/Makefile
@@ -1,7 +1,6 @@
.include <src.opts.mk>
SUBDIR.${MK_DIALOG}+= dialog
-SUBDIR.${MK_GNU_DIFF}+= diff3
SUBDIR.${MK_TESTS}+= tests
SUBDIR_PARALLEL=
Index: gnu/usr.bin/diff3/Makefile
===================================================================
--- gnu/usr.bin/diff3/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-DIFFSRC=${SRCTOP}/contrib/diff/src
-.PATH: ${DIFFSRC} \
- ${SRCTOP}/contrib/diff/lib \
- ${SRCTOP}/contrib/diff/man
-
-PROG= diff3
-SRCS= diff3.c version-etc.c \
- xmalloc.c error.c c-stack.c exitfail.c cmpbuf.c
-
-# Important for ctype macros!
-CFLAGS+=-funsigned-char
-
-CFLAGS+=-I${SRCTOP}/contrib/diff/
-CFLAGS+=-I${SRCTOP}/contrib/diff/src
-CFLAGS+=-I${SRCTOP}/contrib/diff/lib
-CFLAGS+=-DHAVE_CONFIG_H
-CFLAGS+=-DDEFAULT_DIFF_PROGRAM=\"/usr/bin/diff\"
-
-WARNS?= 0
-
-.include <bsd.prog.mk>
Index: gnu/usr.bin/diff3/Makefile.depend
===================================================================
--- gnu/usr.bin/diff3/Makefile.depend
+++ /dev/null
@@ -1,15 +0,0 @@
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: share/mk/src.opts.mk
===================================================================
--- share/mk/src.opts.mk
+++ share/mk/src.opts.mk
@@ -205,7 +205,6 @@
DTRACE_ASAN \
DTRACE_TESTS \
EXPERIMENTAL \
- GNU_DIFF \
HESIOD \
LOADER_BIOS_TEXTONLY \
LOADER_VERBOSE \
Index: targets/pseudo/userland/gnu/Makefile.depend
===================================================================
--- targets/pseudo/userland/gnu/Makefile.depend
+++ targets/pseudo/userland/gnu/Makefile.depend
@@ -18,7 +18,6 @@
gnu/usr.bin/binutils/libopcodes \
gnu/usr.bin/binutils/objdump \
gnu/usr.bin/dialog \
- gnu/usr.bin/diff3 \
gnu/usr.bin/gdb/doc \
gnu/usr.bin/gdb/gdb \
gnu/usr.bin/gdb/gdbserver \
Index: tools/build/options/WITHOUT_GNU_DIFF
===================================================================
--- tools/build/options/WITHOUT_GNU_DIFF
+++ /dev/null
@@ -1,5 +0,0 @@
-Do not build GNU
-.Xr diff3 1 ;
-build BSD
-.Xr diff3 1
-instead.
Index: tools/build/options/WITH_GNU_DIFF
===================================================================
--- tools/build/options/WITH_GNU_DIFF
+++ /dev/null
@@ -1,4 +0,0 @@
-Build and install GNU
-.Xr diff3 1
-instead of BSD
-.Xr diff3 1 .
Index: usr.bin/Makefile
===================================================================
--- usr.bin/Makefile
+++ usr.bin/Makefile
@@ -212,9 +212,7 @@
SUBDIR.${MK_OPENSSL}+= bc
SUBDIR.${MK_OPENSSL}+= dc
.endif
-.if ${MK_GNU_DIFF} == "no"
SUBDIR+= diff3
-.endif
SUBDIR.${MK_GOT}+= got
SUBDIR.${MK_HESIOD}+= hesinfo
SUBDIR.${MK_ICONV}+= iconv

File Metadata

Mime Type
text/plain
Expires
Sat, Oct 19, 3:01 AM (16 h, 31 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
0d/ea/1f17297d6e45311304dd00df86dd
Default Alt Text
D46878.diff (1 MB)

Event Timeline